blob: 0f3132744d8dff0fb6dda4fa1aac081470267181 [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
option(ENABLE_ADDRESS_SANITIZER "Enabled building with address sanitizer. Note for gcc libasan must be installed," OFF)
option(ENABLE_UNDEFINED_SANITIZER "Enabled building with undefined behavior sanitizer." OFF)
option(ENABLE_THREAD_SANITIZER "Enabled building with thread sanitizer." OFF)
# Clear "Advanced" flag for sanitizer options
mark_as_advanced(CLEAR ENABLE_ADDRESS_SANITIZER)
mark_as_advanced(CLEAR ENABLE_UNDEFINED_SANITIZER)
mark_as_advanced(CLEAR ENABLE_THREAD_SANITIZER)
if (ENABLE_ADDRESS_SANITIZER)
if("${CMAKE_C_COMPILER_ID}" MATCHES "Clang")
set(CMAKE_C_FLAGS "-DCELIX_ASAN_ENABLED ${CMAKE_C_FLAGS}")
set(CMAKE_C_FLAGS "-shared-libasan -fsanitize=address -fno-omit-frame-pointer ${CMAKE_C_FLAGS}")
set(CMAKE_CXX_FLAGS "-shared-libasan -fsanitize=address -fno-omit-frame-pointer ${CMAKE_CXX_FLAGS}")
if (APPLE)
set(CMAKE_EXE_LINKER_FLAGS "-fsanitize=address ${CMAKE_EXE_LINKER_FLAGS}")
set(CMAKE_SHARED_LINKER_FLAGS "-fsanitize=address ${CMAKE_SHARED_LINKER_FLAGS}")
else ()
# Fix a linux clang deficiency where the ASan runtime library is not found automatically
# Find the ASan runtime library path and set RPATH
execute_process(
COMMAND ${CMAKE_CXX_COMPILER} --print-file-name libclang_rt.asan-x86_64.so
OUTPUT_VARIABLE ASAN_LIB_PATH
OUTPUT_STRIP_TRAILING_WHITESPACE
RESULT_VARIABLE ASAN_FIND_RESULT
ERROR_QUIET # Avoid printing errors if the command fails during configuration
)
if (ASAN_FIND_RESULT EQUAL 0 AND EXISTS "${ASAN_LIB_PATH}")
get_filename_component(ASAN_LIB_DIR ${ASAN_LIB_PATH} DIRECTORY)
message(STATUS "Setting ASan RPATH to: ${ASAN_LIB_DIR}")
set(ASAN_RPATH_FLAG "-Wl,-rpath,${ASAN_LIB_DIR}")
# Append to executable, shared library, and module linker flags
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${ASAN_RPATH_FLAG}")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${ASAN_RPATH_FLAG}")
else()
message(WARNING "Could not determine path for libclang_rt.asan-x86_64.so using ${CMAKE_CXX_COMPILER}. ASan RPATH not set automatically.")
endif()
endif ()
elseif ("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU")
set(CMAKE_C_FLAGS "-DCELIX_ASAN_ENABLED ${CMAKE_C_FLAGS}")
set(CMAKE_C_FLAGS "-lasan -fsanitize=address -fno-omit-frame-pointer ${CMAKE_C_FLAGS}")
set(CMAKE_CXX_FLAGS "-lasan -fsanitize=address -fno-omit-frame-pointer ${CMAKE_CXX_FLAGS}")
else ()
message(WARNING "Address sanitizer is not supported for ${CMAKE_C_COMPILER_ID}")
endif ()
endif()
if (ENABLE_UNDEFINED_SANITIZER)
set(CMAKE_C_FLAGS "-fsanitize=undefined ${CMAKE_C_FLAGS}")
set(CMAKE_CXX_FLAGS "-fsanitize=undefined ${CMAKE_CXX_FLAGS}")
endif()
if (ENABLE_THREAD_SANITIZER)
set(CMAKE_C_FLAGS "-fsanitize=thread ${CMAKE_C_FLAGS}")
set(CMAKE_CXX_FLAGS "-fsanitize=thread ${CMAKE_CXX_FLAGS}")
endif()
MACRO(celix_subproject)
set(ARGS "${ARGN}")
list(GET ARGS 0 OPTION_NAME)
list(REMOVE_AT ARGS 0)
list(GET ARGS 0 OPTION_DESCRIPTION)
list(REMOVE_AT ARGS 0)
list(GET ARGS 0 OPTION_DEFAULT)
list(REMOVE_AT ARGS 0)
set(OPTIONS )
set(ONE_VAL_ARGS )
set(MULTI_VAL_ARGS DEPS)
cmake_parse_arguments(OPTION "${OPTIONS}" "${ONE_VAL_ARGS}" "${MULTI_VAL_ARGS}" ${ARGS})
string(TOUPPER ${OPTION_NAME} UC_OPTION_NAME)
set(NAME "BUILD_${UC_OPTION_NAME}")
option(${NAME} "${OPTION_DESCRIPTION}" ${OPTION_DEFAULT})
IF (${NAME})
set(${OPTION_NAME} "ON")
FOREACH (DEP ${OPTION_DEPS})
string(TOUPPER ${DEP} UC_DEP)
set(DEP_NAME "BUILD_${UC_DEP}")
if (NOT ${DEP_NAME})
message(FATAL_ERROR "${DEP} is required by ${OPTION_NAME}: please add -D${DEP_NAME}:BOOL=ON")
endif ()
ENDFOREACH (DEP)
ENDIF (${NAME})
ENDMACRO(celix_subproject)
#[[
Custom target which list the Celix CMake targets that are still using deprecated headers.
]]
if (NOT TARGET celix-deprecated)
add_custom_target(celix-deprecated
COMMAND ${CMAKE_COMMAND} -E echo "Targets still using deprecated utils headers: $<JOIN:$<TARGET_PROPERTY:celix-deprecated,UTIL_TARGETS>, >"
COMMAND ${CMAKE_COMMAND} -E echo "Targets still using deprecated framework headers: $<JOIN:$<TARGET_PROPERTY:celix-deprecated,FRAMEWORK_TARGETS>, >"
)
set_target_properties(celix-deprecated PROPERTIES "UTIL_TARGETS" "")
set_target_properties(celix-deprecated PROPERTIES "FRAMEWORK_TARGETS" "")
endif ()
#[[
Add include path for the Celix utils deprecated headers to the provided target (as PRIVATE)
```CMake
celix_deprecated_utils_headers(<target_name>))
```
]]
function(celix_deprecated_utils_headers)
list(GET ARGN 0 TARGET_NAME)
get_target_property(UTILS_SOURCE_DIR Celix::utils "SOURCE_DIR")
target_include_directories(${TARGET_NAME} PRIVATE ${UTILS_SOURCE_DIR}/include_deprecated)
set_property(TARGET celix-deprecated APPEND PROPERTY "UTIL_TARGETS" "${TARGET_NAME}")
endfunction()
#[[
Add include path for the Celix framework deprecated headers to the provided target (as PRIVATE)
```CMake
celix_deprecated_framework_headers(<target_name>))
```
]]
function(celix_deprecated_framework_headers)
list(GET ARGN 0 TARGET_NAME)
get_target_property(FRAMEWORK_SOURCE_DIR Celix::framework "SOURCE_DIR")
target_include_directories(${TARGET_NAME} PRIVATE ${FRAMEWORK_SOURCE_DIR}/include_deprecated)
set_property(TARGET celix-deprecated APPEND PROPERTY "FRAMEWORK_TARGETS" "${TARGET_NAME}")
endfunction()
include(${CMAKE_CURRENT_LIST_DIR}/ApacheRat.cmake)
include(${CMAKE_CURRENT_LIST_DIR}/CodeCoverage.cmake)