summaryrefslogtreecommitdiff
path: root/CMakeLists.txt
diff options
context:
space:
mode:
authorIvan Maidanski <ivmai@mail.ru>2022-09-23 21:02:51 +0300
committerIvan Maidanski <ivmai@mail.ru>2022-09-23 21:02:51 +0300
commit6dfa9a2030014cb05655865938b650c3d7a86e05 (patch)
treed202e398392b6189b4e5d7c222448c6913b2c585 /CMakeLists.txt
parentdaa9f78eed24e9c34364db1447f141869dbdd9e2 (diff)
downloadbdwgc-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.txt51
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)