158 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Makefile
		
	
	
	
	
	
			
		
		
	
	
			158 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Makefile
		
	
	
	
	
	
# 
 | 
						|
# Copyright (c) 2019 Stefan Strobel <stefan.strobel@shimatta.net>
 | 
						|
# 
 | 
						|
# This Source Code Form is subject to the terms of the Mozilla Public
 | 
						|
# License, v. 2.0. If a copy of the MPL was not distributed with this
 | 
						|
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
 | 
						|
# 
 | 
						|
 | 
						|
OBJ_DIR := output/
 | 
						|
 | 
						|
CC  := gcc
 | 
						|
CPP := g++
 | 
						|
LN  := ln
 | 
						|
 | 
						|
SOURCES :=  src/shellmatta.c                \
 | 
						|
            src/shellmatta_autocomplete.c   \
 | 
						|
            src/shellmatta_history.c        \
 | 
						|
            src/shellmatta_utils.c          \
 | 
						|
            src/shellmatta_escape.c         \
 | 
						|
            src/shellmatta_opt.c
 | 
						|
 | 
						|
INCLUDES    := api .
 | 
						|
 | 
						|
UNITTEST_SOURCES := test/unittest/test_main.cpp                                         \
 | 
						|
                    test/unittest/shellmatta_opt/test_opt_findNextHunk.cpp              \
 | 
						|
                    test/unittest/shellmatta_utils/test_utils_writeEcho.cpp             \
 | 
						|
                    test/unittest/shellmatta_utils/test_utils_shellItoa.cpp             \
 | 
						|
                    test/unittest/shellmatta_utils/test_utils_saveCursorPos.cpp         \
 | 
						|
                    test/unittest/shellmatta_utils/test_utils_restoreCursorPos.cpp      \
 | 
						|
                    test/unittest/shellmatta_utils/test_utils_eraseLine.cpp             \
 | 
						|
                    test/unittest/shellmatta_utils/test_utils_rewindCursor.cpp          \
 | 
						|
                    test/unittest/shellmatta_utils/test_utils_forwardCursor.cpp         \
 | 
						|
                    test/unittest/shellmatta_utils/test_utils_clearInput.cpp            \
 | 
						|
                    test/unittest/shellmatta_utils/test_utils_insertChars.cpp           \
 | 
						|
                    test/unittest/shellmatta_utils/test_utils_terminateInput.cpp        \
 | 
						|
                    test/unittest/shellmatta_autocomplete/test_autocomplete_run.cpp     \
 | 
						|
                    test/unittest/shellmatta_escape/test_escape_processArrowKeys.cpp    \
 | 
						|
                    test/unittest/shellmatta_history/test_appendHistoryByte.cpp         \
 | 
						|
                    test/unittest/shellmatta/test_shellmatta_doInit.cpp
 | 
						|
 | 
						|
INTEGRATIONTEST_SOURCES :=  test/integrationtest/test_main.cpp                  \
 | 
						|
                            test/integrationtest/test_integration.cpp           \
 | 
						|
                            test/integrationtest/test_integration_opt.cpp       \
 | 
						|
                            test/integrationtest/test_integration_optLong.cpp   \
 | 
						|
                            test/integrationtest/test_integration_busy.cpp
 | 
						|
 | 
						|
UNITTEST_CPPOBJ  := $(patsubst %.cpp,$(OBJ_DIR)%.o,$(UNITTEST_SOURCES))
 | 
						|
 | 
						|
INTEGRATIONTEST_CPPOBJ  := $(patsubst %.cpp,$(OBJ_DIR)%.o,$(INTEGRATIONTEST_SOURCES))
 | 
						|
 | 
						|
CFLAGS      := $(INCLUDES:%=-I%) -g -Wall -Werror -Wextra -pedantic -DSHELLMATTA_HELP_ALIAS=\"?\"
 | 
						|
TESTFLAGS   := $(INCLUDES:%=-I%) -g -Wall -Werror -Wextra -fprofile-arcs -ftest-coverage -pedantic
 | 
						|
TESTLFLAGS  := -fprofile-arcs -Wl,--allow-multiple-definition
 | 
						|
 | 
						|
DEPEND      = -MT $@ -MF "$(@:%.o=%.d)" -MG -MM
 | 
						|
 | 
						|
COBJ    := $(patsubst %.c,$(OBJ_DIR)%.o,$(SOURCES))
 | 
						|
 | 
						|
EXAMPLE_SOURCES := example/main.c
 | 
						|
EXAMPLE_COBJ     := $(patsubst %.c,$(OBJ_DIR)%.o,$(EXAMPLE_SOURCES))
 | 
						|
 | 
						|
EXAMPLE_TARGET  := $(OBJ_DIR)example/example
 | 
						|
 | 
						|
UNITTEST_TARGET     := $(OBJ_DIR)test/unittest/unittest
 | 
						|
 | 
						|
INTEGRATIONTEST_TARGET     := $(OBJ_DIR)test/integrationtest/integrationtest
 | 
						|
 | 
						|
OBJ     := $(COBJ) $(EXAMPLE_COBJ) $(UNITTEST_CPPOBJ) $(INTEGRATIONTEST_CPPOBJ)
 | 
						|
DEPS    := $(OBJ:%.o=%.d)
 | 
						|
 | 
						|
export
 | 
						|
 | 
						|
help:
 | 
						|
	@echo Shellmatta help
 | 
						|
	@echo -----------------------------------------------
 | 
						|
	@echo test      - run all tests
 | 
						|
	@echo cppcheck  - run static code analysis (cppcheck)
 | 
						|
	@echo example   - build example
 | 
						|
	@echo -----------------------------------------------
 | 
						|
 | 
						|
test: unittest integrationtest
 | 
						|
 | 
						|
cppcheck:
 | 
						|
	- @mkdir -p output/cppcheck/html
 | 
						|
	cppcheck --enable=all --template=gcc --cppcheck-build-dir=output/cppcheck $(SOURCES)
 | 
						|
	cppcheck --enable=all --template=gcc --cppcheck-build-dir=output/cppcheck $(SOURCES) --xml 2>output/cppcheck/cppcheck.xml
 | 
						|
	cppcheck-htmlreport --file=output/cppcheck/cppcheck.xml --title="Shellmatta" --report-dir=output/cppcheck/html
 | 
						|
 | 
						|
unittest: $(UNITTEST_TARGET)
 | 
						|
	- @mkdir -p output/test/unittest/report
 | 
						|
	@echo running test:
 | 
						|
	@# remove coverage from former run
 | 
						|
	@-find . -name "*.gcda" -type f -delete
 | 
						|
	-$(UNITTEST_TARGET)
 | 
						|
	@#gcov -o output/test/unittest $(UNITTEST_CPPOBJ) -r src
 | 
						|
 | 
						|
	@# remove report from former run
 | 
						|
	-rm -rf $(OBJ_DIR)test/unittest/report/*
 | 
						|
	gcovr --html-details --output $(OBJ_DIR)test/unittest/report/report.html output/test/unittest -f src -f api
 | 
						|
	@#-rm *.gcov
 | 
						|
	
 | 
						|
integrationtest: $(INTEGRATIONTEST_TARGET)
 | 
						|
	- @mkdir -p output/test/integrationtest/report
 | 
						|
	@echo running test:
 | 
						|
	-$(INTEGRATIONTEST_TARGET)
 | 
						|
	#gcov -o output/test $(TEST_CPPOBJ) -r
 | 
						|
	gcovr --html-details --output $(OBJ_DIR)test/integrationtest/report/report.html output/src -f src -f api
 | 
						|
	#-rm *.gcov
 | 
						|
	
 | 
						|
example: $(EXAMPLE_TARGET)
 | 
						|
	@echo building example
 | 
						|
 | 
						|
doc:
 | 
						|
	- @mkdir -p output/doc/html
 | 
						|
	- @mkdir -p output/doc/latex
 | 
						|
	doxygen cfg/doxygen/doxyfile
 | 
						|
	
 | 
						|
clean:
 | 
						|
	- rm -rf $(OBJ_DIR)
 | 
						|
 | 
						|
$(EXAMPLE_TARGET): $(COBJ) $(EXAMPLE_COBJ)
 | 
						|
	- @mkdir -p $(@D)
 | 
						|
	$(CC) $(LFLAGS) $(LIB_PATH) -o $@ $^ $(LIBS)
 | 
						|
 | 
						|
$(UNITTEST_TARGET): $(UNITTEST_CPPOBJ)
 | 
						|
	- @mkdir -p $(@D)
 | 
						|
	$(CPP) $(TESTLFLAGS) $(LIB_PATH) -o $@ $^ $(LIBS)
 | 
						|
	
 | 
						|
$(INTEGRATIONTEST_TARGET): $(INTEGRATIONTEST_CPPOBJ) $(COBJ)
 | 
						|
	- @mkdir -p $(@D)
 | 
						|
	$(CPP) $(TESTLFLAGS) $(LIB_PATH) -o $@ $^ $(LIBS)
 | 
						|
 | 
						|
$(TARGET): $(OBJ)
 | 
						|
	- @mkdir -p $(@D)
 | 
						|
	$(CC) $(LFLAGS) $(LIB_PATH) -o $@ $^ $(LIBS)
 | 
						|
	
 | 
						|
$(COBJ):
 | 
						|
	- @mkdir -p $(@D)
 | 
						|
	@$(CC) -c $(CFLAGS)  $(DEPEND) -o $@  $(subst $(OBJ_DIR), ,$(@:%.o=%.c))
 | 
						|
	$(CC) -c $(CFLAGS) -o $@  $(subst $(OBJ_DIR), ,$(@:%.o=%.c))
 | 
						|
 | 
						|
$(EXAMPLE_COBJ):
 | 
						|
	- @mkdir -p $(@D)
 | 
						|
	@$(CC) -c $(CFLAGS) $(DEPEND) -o $@  $(subst $(OBJ_DIR), ,$(@:%.o=%.c))
 | 
						|
	$(CC) -c $(CFLAGS) -o $@  $(subst $(OBJ_DIR), ,$(@:%.o=%.c))
 | 
						|
 | 
						|
$(UNITTEST_CPPOBJ) $(INTEGRATIONTEST_CPPOBJ):
 | 
						|
	- @mkdir -p $(@D)
 | 
						|
	@$(CPP) -c $(TESTFLAGS) $(DEPEND) -o $@  $(subst $(OBJ_DIR), ,$(@:%.o=%.cpp))
 | 
						|
	$(CPP) -c $(TESTFLAGS) -o $@  $(subst $(OBJ_DIR), ,$(@:%.o=%.cpp))
 | 
						|
 | 
						|
%.o: %.cpp
 | 
						|
	- @mkdir -p $(@D)
 | 
						|
	@$(CPP) -c $(CFLAGS) $(DEPEND) -o $@  $(subst $(OBJ_DIR), ,$(@:%.o=%.c))
 | 
						|
	$(CPP) -c $(CFLAGS) -o $@  $<
 | 
						|
 | 
						|
-include $(DEPS)
 |