diff options
author | Ivan Maidanski <ivmai@mail.ru> | 2022-09-23 21:02:51 +0300 |
---|---|---|
committer | Ivan Maidanski <ivmai@mail.ru> | 2022-09-23 21:02:51 +0300 |
commit | 6dfa9a2030014cb05655865938b650c3d7a86e05 (patch) | |
tree | d202e398392b6189b4e5d7c222448c6913b2c585 /CMakeLists.txt | |
parent | daa9f78eed24e9c34364db1447f141869dbdd9e2 (diff) | |
download | bdwgc-6dfa9a2030014cb05655865938b650c3d7a86e05.tar.gz |
Fix 'unknown option --no-undefined' linker error in cmake script (OS X)
Use check_linker_flag() and LINKER prefix in CMakeLists.txt.
This fixes the linker error that "--no-undefined" option is unknown,
at least with apple-clang 13.0.
* CMakeLists.txt [CMP0057] (CMP0057): Set to NEW.
* CMakeLists.txt [$CMAKE_VERSION<3.18.0]: Include CheckLinkerFlag.
* CMakeLists.txt [BUILD_SHARED_LIBS] (WL_NO_UNDEFINED_OPT): New
variable.
* CMakeLists.txt [BUILD_SHARED_LIBS && $CMAKE_VERSION>=3.18.0]
(WL_NO_UNDEFINED_OPT): Use "LINKER:" prefix.
* CMakeLists.txt [BUILD_SHARED_LIBS && $CMAKE_VERSION>=3.18.0]
(HAVE_FLAG_WL_NO_UNDEFINED): Use check_linker_flag(C) instead of
check_c_compiler_flag.
* CMakeLists.txt [BUILD_SHARED_LIBS && $CMAKE_VERSION<3.13.0] (gc,
gccpp, gctba, cord): Use $WL_NO_UNDEFINED_OPT.
* CMakeLists.txt [BUILD_SHARED_LIBS && $CMAKE_VERSION>=3.13.0] (gc,
gccpp, gctba, cord): Use target_link_options instead of
target_link_libraries; remove TODO item.
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r-- | CMakeLists.txt | 51 |
1 files changed, 39 insertions, 12 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index a670acc3..79babc17 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,6 +41,11 @@ else() project(gc C) endif() +if (POLICY CMP0057) + # Required for CheckLinkerFlag, at least. + cmake_policy(SET CMP0057 NEW) +endif() + include(CheckCCompilerFlag) include(CheckCSourceCompiles) include(CheckFunctionExists) @@ -50,6 +55,10 @@ include(CMakePackageConfigHelpers) include(CTest) include(GNUInstallDirs) +if (NOT (${CMAKE_VERSION} VERSION_LESS "3.18.0")) + include(CheckLinkerFlag) +endif() + # Customize the build by passing "-D<option_name>=ON|OFF" in the command line. option(BUILD_SHARED_LIBS "Build shared libraries" ON) option(build_cord "Build cord library" ON) @@ -434,7 +443,13 @@ if (BUILD_SHARED_LIBS) else() add_definitions("-DGC_NO_VISIBILITY") endif() - check_c_compiler_flag(-Wl,--no-undefined HAVE_FLAG_WL_NO_UNDEFINED) + if (${CMAKE_VERSION} VERSION_LESS "3.18.0") + set(WL_NO_UNDEFINED_OPT "-Wl,--no-undefined") + check_c_compiler_flag(${WL_NO_UNDEFINED_OPT} HAVE_FLAG_WL_NO_UNDEFINED) + else() + set(WL_NO_UNDEFINED_OPT "LINKER:--no-undefined") + check_linker_flag(C "${WL_NO_UNDEFINED_OPT}" HAVE_FLAG_WL_NO_UNDEFINED) + endif() else() add_definitions("-DGC_NOT_DLL") if (WIN32) @@ -576,17 +591,29 @@ endif(build_cord) if (BUILD_SHARED_LIBS AND HAVE_FLAG_WL_NO_UNDEFINED) # Declare that the libraries do not refer to external symbols. - # TODO: use add_link_options() when cmake_minimum_required > 3.13 - target_link_libraries(gc PRIVATE -Wl,--no-undefined) - if (enable_cplusplus) - target_link_libraries(gccpp PRIVATE -Wl,--no-undefined) - if (enable_throw_bad_alloc_library) - target_link_libraries(gctba PRIVATE -Wl,--no-undefined) - endif(enable_throw_bad_alloc_library) - endif(enable_cplusplus) - if (build_cord) - target_link_libraries(cord PRIVATE -Wl,--no-undefined) - endif(build_cord) + if (${CMAKE_VERSION} VERSION_LESS "3.13.0") + target_link_libraries(gc PRIVATE ${WL_NO_UNDEFINED_OPT}) + if (enable_cplusplus) + target_link_libraries(gccpp PRIVATE ${WL_NO_UNDEFINED_OPT}) + if (enable_throw_bad_alloc_library) + target_link_libraries(gctba PRIVATE ${WL_NO_UNDEFINED_OPT}) + endif(enable_throw_bad_alloc_library) + endif(enable_cplusplus) + if (build_cord) + target_link_libraries(cord PRIVATE ${WL_NO_UNDEFINED_OPT}) + endif(build_cord) + else() + target_link_options(gc PRIVATE ${WL_NO_UNDEFINED_OPT}) + if (enable_cplusplus) + target_link_options(gccpp PRIVATE ${WL_NO_UNDEFINED_OPT}) + if (enable_throw_bad_alloc_library) + target_link_options(gctba PRIVATE ${WL_NO_UNDEFINED_OPT}) + endif(enable_throw_bad_alloc_library) + endif(enable_cplusplus) + if (build_cord) + target_link_options(cord PRIVATE ${WL_NO_UNDEFINED_OPT}) + endif(build_cord) + endif() endif() if (BUILD_SHARED_LIBS) |