@@ -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.
@@ -38,11 +36,18 @@ set(CMAKE_CXX_FLAGS_CHECKED "")
3836set (CMAKE_EXE_LINKER_FLAGS_CHECKED "" )
3937set (CMAKE_SHARED_LINKER_FLAGS_CHECKED "" )
4038
39+ set (CMAKE_SHARED_LINKER_FLAGS_DEBUG "" )
40+ set (CMAKE_SHARED_LINKER_FLAGS_RELEASE "" )
41+ set (CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO "" )
42+ set (CMAKE_EXE_LINKER_FLAGS_DEBUG "" )
43+ set (CMAKE_EXE_LINKER_FLAGS_DEBUG "" )
44+ set (CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "" )
45+
4146add_compile_definitions ("$<$<OR:$<CONFIG:DEBUG>,$<CONFIG:CHECKED>>:DEBUG;_DEBUG;_DBG;URTBLDENV_FRIENDLY=Checked;BUILDENV_CHECKED=1>" )
4247add_compile_definitions ("$<$<OR:$<CONFIG:RELEASE>,$<CONFIG:RELWITHDEBINFO>>:NDEBUG;URTBLDENV_FRIENDLY=Retail>" )
4348
4449if (MSVC )
45- add_link_options (/GUARD:CF)
50+ add_linker_flag (/GUARD:CF)
4651
4752 # Linker flags
4853 #
@@ -55,48 +60,51 @@ if (MSVC)
5560 endif ()
5661
5762 #Do not create Side-by-Side Assembly Manifest
58- add_link_options ($<$< STREQUAL :$<TARGET_PROPERTY: TYPE >,SHARED_LIBRARY>: /MANIFEST:NO > )
63+ set (CMAKE_SHARED_LINKER_FLAGS " ${CMAKE_SHARED_LINKER_FLAGS} /MANIFEST:NO" )
5964 # can handle addresses larger than 2 gigabytes
60- add_link_options ($<$< STREQUAL :$<TARGET_PROPERTY: TYPE >,SHARED_LIBRARY>: /LARGEADDRESSAWARE> )
65+ set (CMAKE_SHARED_LINKER_FLAGS " ${CMAKE_SHARED_LINKER_FLAGS} /LARGEADDRESSAWARE" )
6166 #Compatible with Data Execution Prevention
62- add_link_options ($<$< STREQUAL :$<TARGET_PROPERTY: TYPE >,SHARED_LIBRARY>: /NXCOMPAT> )
67+ set (CMAKE_SHARED_LINKER_FLAGS " ${CMAKE_SHARED_LINKER_FLAGS} /NXCOMPAT" )
6368 #Use address space layout randomization
64- add_link_options ($<$< STREQUAL :$<TARGET_PROPERTY: TYPE >,SHARED_LIBRARY>: /DYNAMICBASE> )
69+ set (CMAKE_SHARED_LINKER_FLAGS " ${CMAKE_SHARED_LINKER_FLAGS} /DYNAMICBASE" )
6570 #shrink pdb size
66- add_link_options ($<$< STREQUAL :$<TARGET_PROPERTY: TYPE >,SHARED_LIBRARY>: /PDBCOMPRESS> )
71+ set (CMAKE_SHARED_LINKER_FLAGS " ${CMAKE_SHARED_LINKER_FLAGS} /PDBCOMPRESS" )
6772
68- add_link_options ($<$< STREQUAL :$<TARGET_PROPERTY: TYPE >,SHARED_LIBRARY>: /DEBUG> )
69- add_link_options ($<$< STREQUAL :$<TARGET_PROPERTY: TYPE >,SHARED_LIBRARY>: /IGNORE :4197,4013,4254,4070,4221> )
70- add_link_options ($<$< STREQUAL :$<TARGET_PROPERTY: TYPE >,SHARED_LIBRARY>: /SUBSYSTEM:WINDOWS,${WINDOWS_SUBSYSTEM_VERSION} > )
73+ set (CMAKE_SHARED_LINKER_FLAGS " ${CMAKE_SHARED_LINKER_FLAGS} /DEBUG" )
74+ set (CMAKE_SHARED_LINKER_FLAGS " ${CMAKE_SHARED_LINKER_FLAGS} /IGNORE:4197,4013,4254,4070,4221" )
75+ set (CMAKE_SHARED_LINKER_FLAGS " ${CMAKE_SHARED_LINKER_FLAGS} /SUBSYSTEM:WINDOWS,${WINDOWS_SUBSYSTEM_VERSION} " )
7176
7277 set (CMAKE_STATIC_LINKER_FLAGS "${CMAKE_STATIC_LINKER_FLAGS} /IGNORE:4221" )
7378
74- add_link_options ($<$< STREQUAL :$<TARGET_PROPERTY: TYPE >,EXECUTABLE>: /DEBUG> )
75- add_link_options ($<$< STREQUAL :$<TARGET_PROPERTY: TYPE >,EXECUTABLE>: /PDBCOMPRESS> )
76- add_link_options ($<$< STREQUAL :$<TARGET_PROPERTY: TYPE >,EXECUTABLE>: /STACK:1572864> )
79+ set ( CMAKE_EXE_LINKER_FLAGS " ${CMAKE_EXE_LINKER_FLAGS} /DEBUG" )
80+ set ( CMAKE_EXE_LINKER_FLAGS " ${CMAKE_EXE_LINKER_FLAGS} /PDBCOMPRESS" )
81+ set ( CMAKE_EXE_LINKER_FLAGS " ${CMAKE_EXE_LINKER_FLAGS} /STACK:1572864" )
7782
7883 # Debug build specific flags
79- add_link_options ($<$<AND :$<OR :$<CONFIG:DEBUG>,$<CONFIG:CHECKED>>,$<STREQUAL :$<TARGET_PROPERTY:TYPE >,SHARED_LIBRARY>>:/NOVCFEATURE>)
84+ set (CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS_DEBUG} /NOVCFEATURE" )
85+ set (CMAKE_SHARED_LINKER_FLAGS_CHECKED "${CMAKE_SHARED_LINKER_FLAGS_CHECKED} /NOVCFEATURE" )
8086
8187 # Checked build specific flags
82- add_link_options ($<$<CONFIG:CHECKED>: /INCREMENTAL:NO > ) # prevent "warning LNK4075: ignoring '/INCREMENTAL' due to '/OPT:REF' specification"
83- add_link_options ($<$<CONFIG:CHECKED>: /OPT:REF> )
84- add_link_options ($<$<CONFIG:CHECKED>: /OPT:NOICF> )
88+ add_linker_flag( /INCREMENTAL:NO CHECKED ) # prevent "warning LNK4075: ignoring '/INCREMENTAL' due to '/OPT:REF' specification"
89+ add_linker_flag( /OPT:REF CHECKED )
90+ add_linker_flag( /OPT:NOICF CHECKED )
8591
8692 # Release build specific flags
87- add_link_options ($<$<CONFIG:RELEASE>:/LTCG>)
88- add_link_options ($<$<CONFIG:RELEASE>:/OPT:REF>)
89- add_link_options ($<$<CONFIG:RELEASE>:/OPT:ICF>)
93+ add_linker_flag(/LTCG RELEASE)
94+ add_linker_flag(/OPT:REF RELEASE)
95+ add_linker_flag(/OPT:ICF RELEASE)
96+ add_linker_flag(/INCREMENTAL:NO RELEASE)
9097 set (CMAKE_STATIC_LINKER_FLAGS_RELEASE "${CMAKE_STATIC_LINKER_FLAGS_RELEASE} /LTCG" )
9198
9299 # ReleaseWithDebugInfo build specific flags
93- add_link_options ($<$<CONFIG:RELWITHDEBINFO>: /LTCG> )
94- add_link_options ($<$<CONFIG:RELWITHDEBINFO>: /OPT:REF> )
95- add_link_options ($<$<CONFIG:RELWITHDEBINFO>: /OPT:ICF> )
100+ add_linker_flag( /LTCG RELWITHDEBINFO )
101+ add_linker_flag( /OPT:REF RELWITHDEBINFO )
102+ add_linker_flag( /OPT:ICF RELWITHDEBINFO )
96103 set (CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO} /LTCG" )
97104
98105 # Force uCRT to be dynamically linked for Release build
99- add_link_options ("$<$<CONFIG:RELEASE>:/NODEFAULTLIB:libucrt.lib;/DEFAULTLIB:ucrt.lib>" )
106+ add_linker_flag(/NODEFAULTLIB:libucrt.lib RELEASE)
107+ add_linker_flag(/DEFAULTLIB:ucrt.lib RELEASE)
100108
101109elseif (CLR_CMAKE_HOST_UNIX)
102110 # Set the values to display when interactively configuring CMAKE_BUILD_TYPE
@@ -155,11 +163,10 @@ elseif (CLR_CMAKE_HOST_UNIX)
155163
156164 # -fdata-sections -ffunction-sections: each function has own section instead of one per .o file (needed for --gc-sections)
157165 # -O1: optimization level used instead of -O0 to avoid compile error "invalid operand for inline asm constraint"
158- add_compile_definitions ("$<$<OR:$<CONFIG:DEBUG>,$<CONFIG:CHECKED>>:${CLR_SANITIZE_CXX_OPTIONS} ;-fdata-sections;--ffunction-sections;-O1>" )
159- add_link_options ($<$<AND :$<OR :$<CONFIG:DEBUG>,$<CONFIG:CHECKED>>,$<STREQUAL :$<TARGET_PROPERTY:TYPE >,EXECUTABLE>>:${CLR_SANITIZE_LINK_OPTIONS} >)
160-
166+ add_compile_options ("$<$<OR:$<CONFIG:DEBUG>,$<CONFIG:CHECKED>>:${CLR_SANITIZE_CXX_OPTIONS} ;-fdata-sections;--ffunction-sections;-O1>" )
167+ add_linker_flag("${CLR_SANITIZE_LINK_OPTIONS} " DEBUG CHECKED)
161168 # -Wl and --gc-sections: drop unused sections\functions (similar to Windows /Gy function-level-linking)
162- add_link_options ( "$<$<AND:$<OR:$<CONFIG:DEBUG>,$<CONFIG:CHECKED>>,$<STREQUAL:$<TARGET_PROPERTY:TYPE>,SHARED_LIBRARY>>: ${CLR_SANITIZE_LINK_OPTIONS} ; -Wl,--gc-sections>" )
169+ add_linker_flag( " -Wl,--gc-sections" DEBUG CHECKED )
163170 endif ()
164171 endif (UPPERCASE_CMAKE_BUILD_TYPE STREQUAL DEBUG OR UPPERCASE_CMAKE_BUILD_TYPE STREQUAL CHECKED)
165172endif (MSVC )
@@ -171,15 +178,18 @@ endif(MSVC)
171178# ./build-native.sh cmakeargs "-DCLR_ADDITIONAL_COMPILER_OPTIONS=<...>" cmakeargs "-DCLR_ADDITIONAL_LINKER_FLAGS=<...>"
172179#
173180if (CLR_CMAKE_HOST_UNIX)
174- add_link_options (${CLR_ADDITIONAL_LINKER_FLAGS} )
181+ foreach (ADDTL_LINKER_FLAG ${CLR_ADDITIONAL_LINKER_FLAGS} )
182+ add_linker_flag(${ADDTL_LINKER_FLAG} )
183+ endforeach ()
175184endif (CLR_CMAKE_HOST_UNIX)
176185
177186if (CLR_CMAKE_HOST_LINUX)
178187 add_compile_options ($<$<COMPILE_LANGUAGE:ASM>:-Wa,--noexecstack>)
179- add_link_options (-Wl,--build -id=sha1 -Wl,-z,relro,-z,now)
188+ add_linker_flag(-Wl,--build -id=sha1)
189+ add_linker_flag(-Wl,-z,relro,-z,now)
180190elseif (CLR_CMAKE_HOST_FREEBSD)
181191 add_compile_options ($<$<COMPILE_LANGUAGE:ASM>:-Wa,--noexecstack>)
182- add_link_options (LINKER:-- build -id=sha1)
192+ add_linker_flag( "-Wl,-- build-id=sha1" )
183193elseif (CLR_CMAKE_HOST_SUNOS)
184194 add_compile_options ($<$<COMPILE_LANGUAGE:ASM>:-Wa,--noexecstack>)
185195 set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstack-protector" )
@@ -359,7 +369,7 @@ if (CLR_CMAKE_HOST_UNIX)
359369 if (CLR_CMAKE_HOST_OSX)
360370 set (MACOS_VERSION_MIN_FLAGS -mmacosx-version -min=10.12)
361371 add_compile_options (${MACOS_VERSION_MIN_FLAGS} )
362- add_link_options (${MACOS_VERSION_MIN_FLAGS} )
372+ add_linker_flag (${MACOS_VERSION_MIN_FLAGS} )
363373 endif (CLR_CMAKE_HOST_OSX)
364374endif (CLR_CMAKE_HOST_UNIX)
365375
@@ -510,7 +520,7 @@ if(CLR_CMAKE_ENABLE_CODE_COVERAGE)
510520
511521 add_compile_options (-fprofile-arcs)
512522 add_compile_options (-ftest-coverage)
513- add_link_options (--coverage)
523+ add_linker_flag (--coverage)
514524 else ()
515525 message (FATAL_ERROR "Code coverage builds not supported on current platform" )
516526 endif (CLR_CMAKE_HOST_UNIX)
0 commit comments