diff --git a/CMakeLists.txt b/CMakeLists.txt index aec822c..df9c6fe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,6 +7,10 @@ set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) +OPTION(TIDY "Run clang-tidy" OFF) +OPTION(VALGRIND "Run valgrind" OFF) +OPTION(SAN "Build with sanitize flags" OFF) + find_package(Git QUIET) if(GIT_FOUND AND EXISTS "${PROJECT_SOURCE_DIR}/.git") option(GIT_SUBMODULE "Check submodules during build" ON) @@ -32,8 +36,8 @@ add_subdirectory(lib/da_threading EXCLUDE_FROM_ALL) if(CMAKE_BUILD_TYPE MATCHES "Debug") - if($ENV{TIDY} MATCHES "1") - message(STATUS "TIDY=1, running clang-tidy") + if(TIDY) + message(STATUS "TIDY=ON, running clang-tidy") set(CMAKE_CXX_CLANG_TIDY clang-tidy -p ${CMAKE_CURRENT_BINARY_DIR} --checks=-*,clang-diagnostic-*,clang-analyzer-*,google-*,bugprone-* --header-filter= --use-color=true) message(STATUS "CMAKE_CXX_CLANG_TIDY: ${CMAKE_CXX_CLANG_TIDY}") endif() @@ -59,8 +63,9 @@ add_subdirectory(lib/da_threading EXCLUDE_FROM_ALL) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Og") endif(NOT CMAKE_CXX_FLAGS MATCHES "-Og") - if(NOT $ENV{VALGRIND} MATCHES "true") - if($ENV{SANITIZE_PLS} MATCHES "true") + if(NOT VALGRIND) + if(SAN) + message(STATUS "SAN=ON, building with sanitize flags") # this needs {libasan,liblsan,libubsan} on fedora, gcc-libs on arch set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=leak") # issue with gdb @@ -86,7 +91,7 @@ add_subdirectory(lib/da_threading EXCLUDE_FROM_ALL) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=unreachable") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=alignment") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=object-size") - endif($ENV{SANITIZE_PLS} MATCHES "true") + endif(SAN) # If DWARF debugging information is enabled, separate as much debugging @@ -97,8 +102,8 @@ add_subdirectory(lib/da_threading EXCLUDE_FROM_ALL) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -gsplit-dwarf") endif(NOT CMAKE_CXX_FLAGS MATCHES "-gsplit-dwarf") else() - message(STATUS "VALGRIND=true, not setting '-gsplit-dwarf'") - endif(NOT $ENV{VALGRIND} MATCHES "true") + message(STATUS "VALGRIND=ON, not setting '-gsplit-dwarf'") + endif(NOT VALGRIND) if(NOT CMAKE_CXX_FLAGS MATCHES "-Wextra") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wextra") diff --git a/Makefile b/Makefile index 4c007a0..72bca23 100644 --- a/Makefile +++ b/Makefile @@ -1,16 +1,21 @@ cppch = cppcheck cppch_args = --language=c++ --std=c++20 --enable=all --verbose --suppress=unmatchedSuppression --suppress=missingIncludeSystem ./*.{cpp,h} -cpp_flags = CMAKE_CXX_FLAGS= c = cmake c_args = -G Ninja -DCMAKE_BUILD_TYPE= +c_args_d = $(c_args)Debug +c_args_r = $(c_args)Release n = ninja n_args = -C d_folder = cmake-build-debug r_folder = cmake-build-release s_folder = cmake-build-san -s_tru = SANITIZE_PLS=true +s_on = -DSAN=ON +s_off = -DSAN=OFF +t_on = -DTIDY=ON +t_off = -DTIDY=OFF v = valgrind -v_env = VALGRIND= +v_on = -DVALGRIND=ON +v_off = -DVALGRIND=OFF v_db = $(d_folder)_valgr v_rl = $(r_folder)_valgr @@ -18,15 +23,13 @@ v_rl = $(r_folder)_valgr debug: if [ ! -d "$(d_folder)" ]; then mkdir -pv $(d_folder); fi - $(v_env)false $(c) $(c_args)Debug -B $(d_folder) -D$(cpp_flags) && \ + $(c) $(c_args_d) $(s_off) $(t_off) $(v_off) -B$(d_folder) && \ $(n) $(n_args) $(d_folder) - @echo fortuna \(debug\) has been built inside $(d_folder) release: if [ ! -d "$(r_folder)" ]; then mkdir -pv $(r_folder); fi - $(v_env)false $(c) $(c_args)Release -B $(r_folder) -D$(cpp_flags) && \ + $(c) $(c_args_r) $(s_off) $(t_off) $(v_off) -B$(r_folder) && \ $(n) $(n_args) $(r_folder) - @echo fortuna \(release\) has been built inside $(r_folder) check: $(cppch) $(cppch_args) @@ -34,36 +37,36 @@ check: san: if [ ! -d "$(s_folder)" ]; then mkdir -pv $(s_folder); fi - $(v_env)false $(s_tru) $(c) $(c_args)Debug -B $(s_folder) -D$(cpp_flags) \ - && $(n) $(n_args) $(s_folder) + $(c) $(c_args_d) $(s_on) $(t_off) $(v_off) -B$(s_folder) && \ + $(n) $(n_args) $(s_folder) tidy: - env TIDY=1 make debug + if [ ! -d "$(d_folder)" ]; then mkdir -pv $(d_folder); fi + $(c) $(c_args_d) $(s_off) $(t_on) $(v_off) -B$(d_folder) && \ + $(n) $(n_args) $(d_folder) valgrind: valgrind-debug valgrind-debug: if [ ! -d "$(v_db)" ]; then mkdir -pv "$(v_db)"; fi - $(v_env)true $(c) $(c_args)Debug -B "$(v_db)" -D$(cpp_flags) && \ + $(c) $(c_args_d) $(s_off) $(t_off) $(v_on) -B"$(v_db)" && \ $(n) $(n_args) "$(v_db)" $(v) --leak-check=full ./$(v_db)/fortuna - @echo fortuna \(debug\) has been built and checked using valgrind valgrind-release: if [ ! -d "$(v_rl)" ]; then mkdir -pv "$(v_rl)"; fi - $(v_env)true $(c) $(c_args)Release -B "$(v_rl)" -D$(cpp_flags) && \ + $(c) $(c_args_r) $(s_off) $(t_off) $(v_on) -B"$(v_rl)" && \ $(n) $(n_args) "$(v_rl)" $(v) ./$(v_rl)/fortuna - @echo fortuna \(release\) has been built and checked using valgrind build: debug test: check build clean: - @find . -regextype posix-egrep -regex ".*\.(o|dwo|out|bin|cmake)" -delete + @find . -maxdepth 5 -regextype posix-egrep -regex ".*\.(o|dwo|out|bin|cmake|txt)" -not -name CMakeLists.txt -not -path "./lib/*" -delete distclean: - @find . -iwholename '*cmake*' -not -name CMakeLists.txt -delete + @find . -iwholename '*cmake*' -not -name CMakeLists.txt -not -path "./lib/*" -delete