cmake_minimum_required (VERSION 3.13.0 FATAL_ERROR) project (jaucpp LANGUAGES C CXX) FIND_PACKAGE (Threads REQUIRED) # for all set (CMAKE_CXX_STANDARD 17) set (CMAKE_CXX_STANDARD_REQUIRED ON) # for all set (CC_FLAGS_WARNING "-Wall -Wextra -Werror") set (GCC_FLAGS_WARNING_FORMAT "-Wformat=2 -Wformat-overflow=2 -Wformat-nonliteral -Wformat-security -Wformat-signedness -Wformat-y2k") set (GCC_FLAGS_WARNING "-Wall -Wextra -Wshadow -Wtype-limits -Wsign-compare -Wcast-align=strict -Wnull-dereference -Winit-self ${GCC_FLAGS_WARNING_FORMAT} -Werror") set (GCC_FLAGS_WARNING_NO_ERROR "-Wno-error=array-bounds") # too pedantic, but nice to check once in a while # set (DISABLED_CC_FLAGS_WARNING "-Wsign-conversion") # debug only set (GCC_FLAGS_STACK "-fstack-protector-strong -fstack-check") set (GCC_FLAGS_SANITIZE_ALLLEAK "-fsanitize-address-use-after-scope -fsanitize=address -fsanitize=pointer-compare -fsanitize=pointer-subtract -fsanitize=undefined -fsanitize=leak") set (GCC_FLAGS_SANITIZE_UNDEFINED "-fsanitize=undefined") set (GCC_FLAGS_SANITIZE_THREAD "-fsanitize-address-use-after-scope -fsanitize=undefined -fsanitize=thread") # -fsanitize=address cannot be combined with -fsanitize=thread # -fsanitize=pointer-compare -fsanitize=pointer-subtract must be combined with -fsanitize=address # -fsanitize=thread TSAN's lacks ability to properly handle GCC's atomic macros (like helgrind etc), can't check SC-DRF! if(CMAKE_COMPILER_IS_GNUCC) # shorten __FILE__ string and the like .. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_FLAGS_WARNING} ${GCC_FLAGS_WARNING_NO_ERROR} -fmacro-prefix-map=${CMAKE_SOURCE_DIR}/=/") else() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CC_FLAGS_WARNING}") endif(CMAKE_COMPILER_IS_GNUCC) if(DEBUG) if(CMAKE_COMPILER_IS_GNUCC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -ggdb -DDEBUG -fno-omit-frame-pointer ${GCC_FLAGS_STACK}") else() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -DDEBUG") endif(CMAKE_COMPILER_IS_GNUCC) if(INSTRUMENTATION) if(CMAKE_COMPILER_IS_GNUCC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_FLAGS_SANITIZE_ALLLEAK}") endif(CMAKE_COMPILER_IS_GNUCC) elseif(INSTRUMENTATION_UNDEFINED) if(CMAKE_COMPILER_IS_GNUCC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_FLAGS_SANITIZE_UNDEFINED}") endif(CMAKE_COMPILER_IS_GNUCC) elseif(INSTRUMENTATION_THREAD) if(CMAKE_COMPILER_IS_GNUCC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_FLAGS_SANITIZE_THREAD}") endif(CMAKE_COMPILER_IS_GNUCC) endif(INSTRUMENTATION) else() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3") endif(DEBUG) # '-latomic' is required using gcc-8 on Raspberry ... to avoid: undefined reference to `__atomic_store_8' set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -latomic") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -latomic") set (LIB_INSTALL_DIR "lib${LIB_SUFFIX}" CACHE PATH "Installation path for libraries") # Set CMAKE_INSTALL_XXXDIR (XXX {BIN LIB ..} if not defined # (was: CMAKE_LIB_INSTALL_DIR) include(GNUInstallDirs) # Appends the cmake/modules path to MAKE_MODULE_PATH variable. set (CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules ${CMAKE_MODULE_PATH}) # Determine OS_AND_ARCH as library appendix, e.g. 'direct_bt-linux-amd64' string(TOLOWER ${CMAKE_SYSTEM_NAME} OS_NAME) if(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "arm") set(OS_ARCH "armhf") elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "armv7l") set(OS_ARCH "armhf") elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64") set(OS_ARCH "arm64") elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86_64") set(OS_ARCH "amd64") else() set(OS_ARCH ${CMAKE_SYSTEM_PROCESSOR}) endif() set(OS_AND_ARCH ${OS_NAME}-${OS_ARCH}) message (INFO " - OS_NAME ${OS_NAME}") message (INFO " - OS_ARCH ${OS_ARCH} (${CMAKE_SYSTEM_PROCESSOR})") message (INFO " - OS_AND_ARCH ${OS_AND_ARCH}") # Make a version file containing the current version from git. include (GetGitRevisionDescription) git_describe (VERSION "--tags") get_git_head_revision(GIT_REFSPEC VERSION_SHA1) if ("x_${VERSION}" STREQUAL "x_GIT-NOTFOUND" OR "x_${VERSION}" STREQUAL "x_HEAD-HASH-NOTFOUND" OR "x_${VERSION}" STREQUAL "x_-128-NOTFOUND") message (WARNING " - Install git to compile a production jaucpp!") set (VERSION "v1.0.0-dirty") endif () message (INFO " - jaucpp Version ${VERSION}") #parse the version information into pieces. string (REGEX REPLACE "^v([0-9]+)\\..*" "\\1" VERSION_MAJOR "${VERSION}") string (REGEX REPLACE "^v[0-9]+\\.([0-9]+).*" "\\1" VERSION_MINOR "${VERSION}") string (REGEX REPLACE "^v[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" VERSION_PATCH "${VERSION}") string (REGEX REPLACE "^v[0-9]+\\.[0-9]+\\.[0-9]+\\-([0-9]+).*" "\\1" VERSION_COMMIT "${VERSION}") #string (REGEX REPLACE "^v[0-9]+\\.[0-9]+\\.[0-9]+-[0-9]+\\-(.*)" "\\1" VERSION_SHA1 "${VERSION}") set (VERSION_SHORT "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}") set (VERSION_API "${VERSION_MAJOR}.${VERSION_MINOR}") string(TIMESTAMP BUILD_TSTAMP "%Y-%m-%d %H:%M:%S") if ("${VERSION_COMMIT}" MATCHES "^v.*") set (VERSION_COMMIT "") endif() configure_file (${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules/version.cpp.in ${CMAKE_CURRENT_BINARY_DIR}/src/version.cpp) # this is the library version, independant of git revision set (jaucpp_VERSION_MAJOR ${VERSION_MAJOR}) set (jaucpp_VERSION_MINOR ${VERSION_MINOR}) set (jaucpp_VERSION_PATCH ${VERSION_PATCH}) set (jaucpp_VERSION_STRING "${jaucpp_VERSION_MAJOR}.${jaucpp_VERSION_MINOR}.${jaucpp_VERSION_PATCH}") set (CMAKE_SWIG_FLAGS "") set (jaucpp_DOCS_DIR documentation) find_path (SYSTEM_USR_DIR "stdlib.h") include_directories (${SYSTEM_USR_DIR}) add_subdirectory (src) # add a target to generate API documentation with Doxygen find_package (Doxygen) if (DOXYGEN_FOUND) configure_file (${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.cpp.in ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile.cpp.out @ONLY) add_custom_command (OUTPUT ${jaucpp_DOCS_DIR}/cpp COMMAND ${CMAKE_COMMAND} -E make_directory ${jaucpp_DOCS_DIR} COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile.cpp.out DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/include/ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMENT "Generating API documentation with Doxygen" VERBATIM ) add_custom_target(doc DEPENDS ${jaucpp_DOCS_DIR}/cpp) endif (DOXYGEN_FOUND) if (BUILD_TESTING) enable_testing () add_subdirectory (test) endif(BUILD_TESTING)