@@ -8,8 +8,6 @@ set(CMAKE_C_STANDARD_REQUIRED ON)
88set (CMAKE_CXX_STANDARD 11)
99set (CMAKE_CXX_STANDARD_REQUIRED ON )
1010
11- cmake_policy (SET CMP0083 NEW )
12-
1311include (CheckCXXCompilerFlag )
1412
1513# "configureoptimization.cmake" must be included after CLR_CMAKE_HOST_UNIX has been set.
@@ -40,11 +38,18 @@ set(CMAKE_CXX_FLAGS_CHECKED "")
4038set (CMAKE_EXE_LINKER_FLAGS_CHECKED "" )
4139set (CMAKE_SHARED_LINKER_FLAGS_CHECKED "" )
4240
41+ set (CMAKE_SHARED_LINKER_FLAGS_DEBUG "" )
42+ set (CMAKE_SHARED_LINKER_FLAGS_RELEASE "" )
43+ set (CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO "" )
44+ set (CMAKE_EXE_LINKER_FLAGS_DEBUG "" )
45+ set (CMAKE_EXE_LINKER_FLAGS_DEBUG "" )
46+ set (CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "" )
47+
4348add_compile_definitions ("$<$<OR :$<CONFIG :DEBUG >,$<CONFIG :CHECKED >>:DEBUG ;_DEBUG ;_DBG ;URTBLDENV_FRIENDLY =Checked ;BUILDENV_CHECKED =1>" )
4449add_compile_definitions ("$<$<OR :$<CONFIG :RELEASE >,$<CONFIG :RELWITHDEBINFO >>:NDEBUG ;URTBLDENV_FRIENDLY =Retail >" )
4550
4651if (MSVC )
47- add_link_options (/GUARD:CF )
52+ add_linker_flag (/GUARD:CF )
4853
4954 # Linker flags
5055 #
@@ -57,48 +62,51 @@ if (MSVC)
5762 endif ()
5863
5964 #Do not create Side-by-Side Assembly Manifest
60- add_link_options ($<$< STREQUAL :$< TARGET_PROPERTY : TYPE >, SHARED_LIBRARY >: /MANIFEST :NO > )
65+ set ( CMAKE_SHARED_LINKER_FLAGS " ${CMAKE_SHARED_LINKER_FLAGS} /MANIFEST:NO" )
6166 # can handle addresses larger than 2 gigabytes
62- add_link_options ($<$< STREQUAL :$< TARGET_PROPERTY : TYPE >, SHARED_LIBRARY >: /LARGEADDRESSAWARE > )
67+ set ( CMAKE_SHARED_LINKER_FLAGS " ${CMAKE_SHARED_LINKER_FLAGS} /LARGEADDRESSAWARE" )
6368 #Compatible with Data Execution Prevention
64- add_link_options ($<$< STREQUAL :$< TARGET_PROPERTY : TYPE >, SHARED_LIBRARY >: /NXCOMPAT > )
69+ set ( CMAKE_SHARED_LINKER_FLAGS " ${CMAKE_SHARED_LINKER_FLAGS} /NXCOMPAT" )
6570 #Use address space layout randomization
66- add_link_options ($<$< STREQUAL :$< TARGET_PROPERTY : TYPE >, SHARED_LIBRARY >: /DYNAMICBASE > )
71+ set ( CMAKE_SHARED_LINKER_FLAGS " ${CMAKE_SHARED_LINKER_FLAGS} /DYNAMICBASE" )
6772 #shrink pdb size
68- add_link_options ($<$< STREQUAL :$< TARGET_PROPERTY : TYPE >, SHARED_LIBRARY >: /PDBCOMPRESS > )
73+ set ( CMAKE_SHARED_LINKER_FLAGS " ${CMAKE_SHARED_LINKER_FLAGS} /PDBCOMPRESS" )
6974
70- add_link_options ($<$< STREQUAL :$< TARGET_PROPERTY : TYPE >, SHARED_LIBRARY >: /DEBUG > )
71- add_link_options ($<$< STREQUAL :$< TARGET_PROPERTY : TYPE >, SHARED_LIBRARY >: /IGNORE :4197,4013,4254,4070,4221> )
72- add_link_options ($<$< STREQUAL :$< TARGET_PROPERTY : TYPE >, SHARED_LIBRARY >: /SUBSYSTEM :WINDOWS ,${WINDOWS_SUBSYSTEM_VERSION} > )
75+ set ( CMAKE_SHARED_LINKER_FLAGS " ${CMAKE_SHARED_LINKER_FLAGS} /DEBUG" )
76+ set ( CMAKE_SHARED_LINKER_FLAGS " ${CMAKE_SHARED_LINKER_FLAGS} /IGNORE:4197,4013,4254,4070,4221" )
77+ set ( CMAKE_SHARED_LINKER_FLAGS " ${CMAKE_SHARED_LINKER_FLAGS} /SUBSYSTEM:WINDOWS,${WINDOWS_SUBSYSTEM_VERSION} " )
7378
7479 set (CMAKE_STATIC_LINKER_FLAGS "${CMAKE_STATIC_LINKER_FLAGS} /IGNORE:4221" )
7580
76- add_link_options ($<$< STREQUAL :$< TARGET_PROPERTY : TYPE >, EXECUTABLE >: /DEBUG > )
77- add_link_options ($<$< STREQUAL :$< TARGET_PROPERTY : TYPE >, EXECUTABLE >: /PDBCOMPRESS > )
78- add_link_options ($<$< STREQUAL :$< TARGET_PROPERTY : TYPE >, EXECUTABLE >: /STACK :1572864> )
81+ set ( CMAKE_EXE_LINKER_FLAGS " ${CMAKE_EXE_LINKER_FLAGS} /DEBUG" )
82+ set ( CMAKE_EXE_LINKER_FLAGS " ${CMAKE_EXE_LINKER_FLAGS} /PDBCOMPRESS" )
83+ set ( CMAKE_EXE_LINKER_FLAGS " ${CMAKE_EXE_LINKER_FLAGS} /STACK:1572864" )
7984
8085 # Debug build specific flags
81- add_link_options ($<$<AND :$<OR :$<CONFIG :DEBUG >,$<CONFIG :CHECKED >>,$<STREQUAL :$<TARGET_PROPERTY :TYPE >,SHARED_LIBRARY >>:/NOVCFEATURE >)
86+ set (CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS_DEBUG} /NOVCFEATURE" )
87+ set (CMAKE_SHARED_LINKER_FLAGS_CHECKED "${CMAKE_SHARED_LINKER_FLAGS_CHECKED} /NOVCFEATURE" )
8288
8389 # Checked build specific flags
84- add_link_options ($<$< CONFIG : CHECKED >: /INCREMENTAL :NO > ) # prevent "warning LNK4075: ignoring '/INCREMENTAL' due to '/OPT:REF' specification"
85- add_link_options ($<$< CONFIG : CHECKED >: /OPT :REF > )
86- add_link_options ($<$< CONFIG : CHECKED >: /OPT :NOICF > )
90+ add_linker_flag ( /INCREMENTAL:NO CHECKED ) # prevent "warning LNK4075: ignoring '/INCREMENTAL' due to '/OPT:REF' specification"
91+ add_linker_flag ( /OPT:REF CHECKED )
92+ add_linker_flag ( /OPT:NOICF CHECKED )
8793
8894 # Release build specific flags
89- add_link_options ($<$<CONFIG :RELEASE >:/LTCG >)
90- add_link_options ($<$<CONFIG :RELEASE >:/OPT :REF >)
91- add_link_options ($<$<CONFIG :RELEASE >:/OPT :ICF >)
95+ add_linker_flag (/LTCG RELEASE )
96+ add_linker_flag (/OPT:REF RELEASE )
97+ add_linker_flag (/OPT:ICF RELEASE )
98+ add_linker_flag (/INCREMENTAL:NO RELEASE )
9299 set (CMAKE_STATIC_LINKER_FLAGS_RELEASE "${CMAKE_STATIC_LINKER_FLAGS_RELEASE} /LTCG" )
93100
94101 # ReleaseWithDebugInfo build specific flags
95- add_link_options ($<$< CONFIG : RELWITHDEBINFO >: /LTCG > )
96- add_link_options ($<$< CONFIG : RELWITHDEBINFO >: /OPT :REF > )
97- add_link_options ($<$< CONFIG : RELWITHDEBINFO >: /OPT :ICF > )
102+ add_linker_flag ( /LTCG RELWITHDEBINFO )
103+ add_linker_flag ( /OPT:REF RELWITHDEBINFO )
104+ add_linker_flag ( /OPT:ICF RELWITHDEBINFO )
98105 set (CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO} /LTCG" )
99106
100107 # Force uCRT to be dynamically linked for Release build
101- add_link_options ("$<$<CONFIG :RELEASE >:/NODEFAULTLIB :libucrt .lib ;/DEFAULTLIB :ucrt .lib >" )
108+ add_linker_flag (/NODEFAULTLIB:libucrt.lib RELEASE )
109+ add_linker_flag (/DEFAULTLIB:ucrt.lib RELEASE )
102110
103111elseif (CLR_CMAKE_HOST_UNIX)
104112 # Set the values to display when interactively configuring CMAKE_BUILD_TYPE
@@ -157,11 +165,10 @@ elseif (CLR_CMAKE_HOST_UNIX)
157165
158166 # -fdata-sections -ffunction-sections: each function has own section instead of one per .o file (needed for --gc-sections)
159167 # -O1: optimization level used instead of -O0 to avoid compile error "invalid operand for inline asm constraint"
160- add_compile_definitions ("$<$<OR :$<CONFIG :DEBUG >,$<CONFIG :CHECKED >>:${CLR_SANITIZE_CXX_OPTIONS} ;-fdata -sections ;--ffunction -sections ;-O1 >" )
161- add_link_options ($<$<AND :$<OR :$<CONFIG :DEBUG >,$<CONFIG :CHECKED >>,$<STREQUAL :$<TARGET_PROPERTY :TYPE >,EXECUTABLE >>:${CLR_SANITIZE_LINK_OPTIONS} >)
162-
168+ add_compile_options ("$<$<OR :$<CONFIG :DEBUG >,$<CONFIG :CHECKED >>:${CLR_SANITIZE_CXX_OPTIONS} ;-fdata -sections ;--ffunction -sections ;-O1 >" )
169+ add_linker_flag ("${CLR_SANITIZE_LINK_OPTIONS} " DEBUG CHECKED )
163170 # -Wl and --gc-sections: drop unused sections\functions (similar to Windows /Gy function-level-linking)
164- add_link_options ( "$<$< AND :$< OR :$< CONFIG : DEBUG >,$< CONFIG : CHECKED >>,$< STREQUAL :$< TARGET_PROPERTY : TYPE >, SHARED_LIBRARY >>: ${CLR_SANITIZE_LINK_OPTIONS} ; -Wl ,--gc -sections >" )
171+ add_linker_flag ( " -Wl,--gc-sections" DEBUG CHECKED )
165172 endif ()
166173 endif (UPPERCASE_CMAKE_BUILD_TYPE STREQUAL DEBUG OR UPPERCASE_CMAKE_BUILD_TYPE STREQUAL CHECKED )
167174endif (MSVC )
@@ -173,15 +180,18 @@ endif(MSVC)
173180# ./build-native.sh cmakeargs "-DCLR_ADDITIONAL_COMPILER_OPTIONS=<...>" cmakeargs "-DCLR_ADDITIONAL_LINKER_FLAGS=<...>"
174181#
175182if (CLR_CMAKE_HOST_UNIX)
176- add_link_options (${CLR_ADDITIONAL_LINKER_FLAGS} )
183+ foreach (ADDTL_LINKER_FLAG ${CLR_ADDITIONAL_LINKER_FLAGS} )
184+ add_linker_flag (${ADDTL_LINKER_FLAG} )
185+ endforeach ()
177186endif (CLR_CMAKE_HOST_UNIX )
178187
179188if (CLR_CMAKE_HOST_LINUX)
180189 add_compile_options ($<$<COMPILE_LANGUAGE :ASM >:-Wa ,--noexecstack >)
181- add_link_options (-Wl,--build-id=sha1 -Wl,-z,relro,-z,now )
190+ add_linker_flag (-Wl,--build-id=sha1 )
191+ add_linker_flag (-Wl,-z,relro,-z,now )
182192elseif (CLR_CMAKE_HOST_FREEBSD)
183193 add_compile_options ($<$<COMPILE_LANGUAGE :ASM >:-Wa ,--noexecstack >)
184- add_link_options ( LINKER:-- build-id=sha1 )
194+ add_linker_flag ( "-Wl,-- build-id=sha1" )
185195elseif (CLR_CMAKE_HOST_SUNOS)
186196 add_compile_options ($<$<COMPILE_LANGUAGE :ASM >:-Wa ,--noexecstack >)
187197 set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstack-protector" )
@@ -361,7 +371,7 @@ if (CLR_CMAKE_HOST_UNIX)
361371 if (CLR_CMAKE_HOST_OSX)
362372 set (MACOS_VERSION_MIN_FLAGS -mmacosx-version-min=10.12)
363373 add_compile_options (${MACOS_VERSION_MIN_FLAGS} )
364- add_link_options (${MACOS_VERSION_MIN_FLAGS} )
374+ add_linker_flag (${MACOS_VERSION_MIN_FLAGS} )
365375 endif (CLR_CMAKE_HOST_OSX )
366376endif (CLR_CMAKE_HOST_UNIX )
367377
@@ -517,7 +527,7 @@ if(CLR_CMAKE_ENABLE_CODE_COVERAGE)
517527
518528 add_compile_options (-fprofile-arcs )
519529 add_compile_options (-ftest-coverage )
520- add_link_options (--coverage )
530+ add_linker_flag (--coverage )
521531 else ()
522532 message (FATAL_ERROR "Code coverage builds not supported on current platform" )
523533 endif (CLR_CMAKE_HOST_UNIX )
0 commit comments