В моем CMakeLists.txt я хочу включить AddressSanitizer, если он скомпилируется и свяжется (потому что мне нужна статическая версия, которая может не быть установлена). Включение этого будет:
string(APPEND CMAKE_CXX_FLAGS " -fno-omit-frame-pointer -fsanitize=address -static-libasan")
string(APPEND CMAKE_LINKER_FLAGS " -fno-omit-frame-pointer -fsanitize=address -static-libasan")
Поэтому я попробовал использовать check_cxx_compiler_flag вот так:
check_cxx_compiler_flag("-fno-omit-frame-pointer -fsanitize=address -static-libasan" sanitize_compile)
check_linker_flags(CXX "-fno-omit-frame-pointer -fsanitize=address -static-libasan" sanitize_link)
Но при этом флаги будут проверяться отдельно, что не сработает. Есть ли в CMake какая-нибудь функциональность вроде check_cxx_compiler_and_linker_flags без написания ее самому?





try_compile может это сделать.
Создайте небольшой проект CMakeLists.txt, который добавляет флаги компилятора/компоновщика:
cmake_minimum_required(3.16)
project(STATIC_ASAN LANGUAGES C)
# Source for minimal executable
file(WRITE main.c [==[
int main(int argc, char *argv[]) {
(void)argc; (void)argv;
return 0;
}
]==])
add_executable(foo main.c)
target_compile_options(foo PRIVATE -fsanitize=address -static-libasan)
target_compile_options(foo PRIVATE -fsanitize=address -static-libasan)
Поместите это CMakeLists.txt в каталог EX: asan/CMakeLists.txt
Теперь вы можете использовать try_compile в своем основном файле CMakeLists.txt.
try_compile(STATIC_ASAN_SUPPORTED PROJECT asan
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/asan
)
if (STATIC_ASAN_SUPPORTED)
message(STATUS "Static asan supported")
endif ()