diff --git a/CMakeLists.txt b/CMakeLists.txt index 9cb79ae4645011cc932e5180c8e2ef1d5477e292..70c4a6e20445e97ecaddc94729d31c4326b4baef 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -37,7 +37,8 @@ set(CMAKE_C_STANDARD 99) if(UNIX) set(TARGET_PLATFORM "" CACHE STRING "i686 / x86_64") set(CLANG "" CACHE STRING "1=msan / 2=asan / 3=usan") - set(GCOV OFF CACHE BOOL "enable GCOV") + set(MSAN_TRACK_ORIGINS OFF CACHE BOOL "enable origin tracking for Clang MSAN") + set(COVERAGE OFF CACHE BOOL "enable coverage instrumentation") set(STRIP OFF CACHE BOOL "enable STRIP") if(NOT CMAKE_BUILD_TYPE) @@ -62,13 +63,19 @@ if(UNIX) # to be uncommented in CI # set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror") + # set C compiler + find_program(cc NAMES clang-18 clang REQUIRED) + set(CMAKE_C_COMPILER "${cc}" CACHE STRING "") + # CLANG if(CLANG) - find_program(clangBin NAMES /home/amm-archiv/soft/Linux/clang/current/bin/clang clang REQUIRED) - set(CMAKE_C_COMPILER "${clangBin}" CACHE STRING "") if("${CLANG}" MATCHES "1" OR "${CLANG}" MATCHES "msan") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=memory") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=memory") + if(MSAN_TRACK_ORIGINS) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize-memory-track-origins") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize-memory-track-origins") + endif() elseif("${CLANG}" MATCHES "2" OR "${CLANG}" MATCHES "asan") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address") @@ -89,8 +96,8 @@ if(UNIX) message(FATAL_ERROR "Unknown CLANG setting: ${CLANG}") endif() endif() - # GCOV - if(GCOV) + # COVERAGE + if(COVERAGE) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage -fprofile-update=atomic") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fprofile-arcs -ftest-coverage -fprofile-update=atomic") endif() diff --git a/Makefile b/Makefile index c9ae4493ddacc2edbd9bdbe7c874b7d48a768b75..a9a9397425d9783cb985dc9cf3a20d885d50870c 100644 --- a/Makefile +++ b/Makefile @@ -34,7 +34,7 @@ LIB_LC3PLUS ?= liblc3plus.a LIB_LIBUTIL ?= libivasutil.a # Default tool settings -CC ?= gcc +CC ?= cc RM ?= rm -f AR ?= ar @@ -65,32 +65,43 @@ endif CFLAGS += -std=c99 -pedantic -Wcast-qual -Wall -W -Wextra -Wno-long-long \ -Wpointer-arith -Wstrict-prototypes -Wmissing-prototypes \ -Werror-implicit-function-declaration \ - -Wno-implicit-fallthrough -ffp-contract=off + -Wno-implicit-fallthrough -ffp-contract=off \ + -Winit-self -Wunused-but-set-variable # to be uncommented in CI # CFLAGS += -Werror -CFLAGS += -Winit-self -CFLAGS += -Wunused-but-set-variable # libs to link LDLIBS += -lm -# Clang sanitizer compiler options -CCCLANG = clang -ifeq "$(CLANG)" "0" -CC = $(CCCLANG) +# check if clang is available on system and use it if it is there +CLANG_EXISTS := $(shell which clang) + +ifneq "$(CLANG_EXISTS)" "" +CC = clang +else +$(warning clang compiler not found - falling back to cc) endif + +# Clang sanitizer compiler options ifeq "$(CLANG)" "1" -CC = $(CCCLANG) +CC = clang CFLAGS += -fsanitize=memory LDFLAGS += -fsanitize=memory + +# can be set in call to make, e.g. "make CLANG=1 MSAN_TRACK_ORIGINS=1" +ifeq "$(MSAN_TRACK_ORIGINS)" "1" +CFLAGS += -fsanitize-memory-track-origins +LDFLAGS += -fsanitize-memory-track-origins +endif + endif ifeq "$(CLANG)" "2" -CC = $(CCCLANG) +CC = clang CFLAGS += -fsanitize=address LDFLAGS += -fsanitize=address endif ifeq "$(CLANG)" "3" -CC = $(CCCLANG) +CC = clang # NOTE: keep in sync with list in CMakeLists.txt usan_checks = undefined,float-divide-by-zero,implicit-conversion,local-bounds CFLAGS += -fsanitize=$(usan_checks) @@ -114,7 +125,8 @@ CFLAGS += -g3 LDFLAGS += -g3 endif -ifeq "$(GCOV)" "1" +ifeq "$(COVERAGE)" "1" +CC = gcc CFLAGS += -fprofile-arcs -ftest-coverage -fprofile-update=atomic LDFLAGS += -fprofile-arcs -ftest-coverage -fprofile-update=atomic endif