Skip to content

Commit e339158

Browse files
authored
Merge pull request swiftlang#2281 from compnerd/msvc-runtime-library
2 parents 5ce52cf + 203f607 commit e339158

File tree

1 file changed

+20
-43
lines changed

1 file changed

+20
-43
lines changed

CMakeLists.txt

+20-43
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,22 @@ cmake_minimum_required(VERSION 3.4.3)
44
list(APPEND CMAKE_MODULE_PATH
55
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules")
66

7+
# NOTE(compnerd) enable CMP0091 - select MSVC runtime based on
8+
# CMAKE_MSVC_RUNTIME_LIBRARY. Requires CMake 3.15 or newer
9+
if(POLICY CMP0091)
10+
cmake_policy(CMP0091 NEW)
11+
endif()
12+
713
project(Foundation
814
LANGUAGES
915
C)
1016
enable_testing()
1117

18+
# NOTE(compnerd) default to /MD or /MDd by default based on the configuration.
19+
# Cache the variable to allow the user to alter the configuration.
20+
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL" CACHE
21+
STRING "MSVC Runtime Library")
22+
1223
option(BUILD_SHARED_LIBS "build shared libraries" ON)
1324

1425
option(FOUNDATION_ENABLE_LIBDISPATCH "Enable GCD Support" YES)
@@ -72,6 +83,12 @@ endif()
7283
if(ENABLE_TESTING)
7384
set(swift_enable_testing -enable-testing)
7485
endif()
86+
if(CMAKE_SYSTEM_NAME STREQUAL Windows)
87+
set(swift_libc_flags -libc;${CMAKE_MSVC_RUNTIME_LIBRARY})
88+
if(CMAKE_SYSTEM_NAME STREQUAL Debug)
89+
list(APPEND swift_libc_flags -Xcc;-D_DEBUG)
90+
endif()
91+
endif()
7592

7693
set(deployment_enable_libdispatch)
7794
set(libdispatch_cflags)
@@ -94,7 +111,6 @@ elseif(CMAKE_SYSTEM_NAME STREQUAL FreeBSD)
94111
elseif(CMAKE_SYSTEM_NAME STREQUAL Windows)
95112
# FIXME(SR9138) Silence "locally defined symbol '…' imported in function '…'
96113
set(WORKAROUND_SR9138 -Xlinker;-ignore:4049;-Xlinker;-ignore:4217)
97-
set(WORKAROUND_SR9995 -Xlinker;-nodefaultlib:libcmt)
98114
endif()
99115

100116
# NOTE(compnerd) this is a horrible hack to work around the fact that we do not
@@ -110,35 +126,6 @@ foreach(library ${CoreFoundation_LINK_LIBRARIES})
110126
endif()
111127
endforeach()
112128

113-
# Windows uses 4 different variants of the C library that are normally
114-
# controlled by options to the compiler:
115-
#
116-
# Option | Flags | Runtime
117-
# --------+-----------------------+------------
118-
# /MTd | -D_DEBUG -D_MT | libcmtd.lib
119-
# /MT | -D_MT | libcmt.lib
120-
# /MDd | -D_DEBUG -D_DLL -D_MT | msvcrtd.lib
121-
# /MD | -D_DLL -D_MT | msvcrt.lib
122-
123-
if(CMAKE_SYSTEM_NAME STREQUAL Windows)
124-
set(MSVCRT_C_FLAGS)
125-
set(MSVCRT_LINK_FLAGS)
126-
if(CMAKE_BUILD_TYPE STREQUAL Debug)
127-
list(APPEND MSVCRT_C_FLAGS -D_DEBUG)
128-
endif()
129-
# We currently do not support building in /MT or /MTd
130-
list(APPEND MSVCRT_C_FLAGS -D_MT)
131-
list(APPEND MSVCRT_C_FLAGS -D_DLL)
132-
# Ensure that we link against the correct CRT
133-
if(CMAKE_BUILD_TYPE STREQUAL Debug)
134-
list(APPEND MSVCRT_C_FLAGS -Xclang --dependent-lib=msvcrtd)
135-
list(APPEND MSVCRT_LINK_FLAGS -Xlinker -defaultlib:msvcrtd.lib)
136-
else()
137-
list(APPEND MSVCRT_C_FLAGS -Xclang --dependent-lib=msvcrt)
138-
list(APPEND MSVCRT_LINK_FLAGS -Xlinker -defaultlib:msvcrt.lib)
139-
endif()
140-
endif()
141-
142129
add_swift_library(Foundation
143130
MODULE_NAME
144131
Foundation
@@ -315,12 +302,10 @@ add_swift_library(Foundation
315302
TARGET
316303
${CMAKE_C_COMPILER_TARGET}
317304
CFLAGS
318-
${MSVCRT_C_FLAGS}
319305
${deployment_target}
320306
${deployment_enable_libdispatch}
321307
-F${CMAKE_CURRENT_BINARY_DIR}
322308
LINK_FLAGS
323-
${MSVCRT_LINK_FLAGS}
324309
${CoreFoundation_LIBRARIES}
325310
${CURL_LIBRARIES}
326311
${ICU_UC_LIBRARY} ${ICU_I18N_LIBRARY}
@@ -329,7 +314,6 @@ add_swift_library(Foundation
329314
$<TARGET_FILE:uuid>
330315
${Foundation_RPATH}
331316
${WORKAROUND_SR9138}
332-
${WORKAROUND_SR9995}
333317
$<$<PLATFORM_ID:Windows>:-lDbgHelp>
334318
$<$<PLATFORM_ID:Windows>:-lOle32>
335319
$<$<PLATFORM_ID:Windows>:-lShLwApi>
@@ -345,6 +329,7 @@ add_swift_library(Foundation
345329
${libdispatch_cflags}
346330
${swift_enable_testing}
347331
${swift_optimization_flags}
332+
${swift_libc_flags}
348333
DEPENDS
349334
uuid
350335
CoreFoundation
@@ -366,18 +351,15 @@ add_swift_executable(plutil
366351
SOURCES
367352
Tools/plutil/main.swift
368353
CFLAGS
369-
${MSVCRT_C_FLAGS}
370354
${deployment_target}
371355
${deployment_enable_libdispatch}
372356
-F${CMAKE_CURRENT_BINARY_DIR}
373357
LINK_FLAGS
374-
${MSVCRT_LINK_FLAGS}
375358
${libdispatch_ldflags}
376359
-L${CMAKE_CURRENT_BINARY_DIR}
377360
-lFoundation
378361
${Foundation_INTERFACE_LIBRARIES}
379362
${Foundation_RPATH}
380-
${WORKAROUND_SR9995}
381363
SWIFT_FLAGS
382364
-DDEPLOYMENT_RUNTIME_SWIFT
383365
${deployment_enable_libdispatch}
@@ -386,6 +368,7 @@ add_swift_executable(plutil
386368
${libdispatch_cflags}
387369
${swift_enable_testing}
388370
${swift_optimization_flags}
371+
${swift_libc_flags}
389372
DEPENDS
390373
uuid
391374
Foundation
@@ -394,17 +377,14 @@ add_swift_executable(plutil
394377
if(ENABLE_TESTING)
395378
add_swift_executable(xdgTestHelper
396379
CFLAGS
397-
${MSVCRT_C_FLAGS}
398380
${deployment_target}
399381
${deployment_enable_libdispatch}
400382
-F${CMAKE_CURRENT_BINARY_DIR}
401383
LINK_FLAGS
402-
${MSVCRT_LINK_FLAGS}
403384
${libdispatch_ldflags}
404385
-L${CMAKE_CURRENT_BINARY_DIR}
405386
-lFoundation
406387
${Foundation_INTERFACE_LIBRARIES}
407-
${WORKAROUND_SR9995}
408388
${XDG_TEST_HELPER_RPATH}
409389
SOURCES
410390
TestFoundation/xdgTestHelper/main.swift
@@ -516,21 +496,17 @@ if(ENABLE_TESTING)
516496
TestFoundation/TestXMLDocument.swift
517497
TestFoundation/TestXMLParser.swift
518498
CFLAGS
519-
${MSVCRT_C_FLAGS}
520499
${deployment_target}
521500
${deployment_enable_libdispatch}
522501
-F${CMAKE_CURRENT_BINARY_DIR}
523-
-D_DLL
524502
LINK_FLAGS
525-
${MSVCRT_LINK_FLAGS}
526503
${libdispatch_ldflags}
527504
-L${CMAKE_CURRENT_BINARY_DIR}
528505
-lFoundation
529506
${Foundation_INTERFACE_LIBRARIES}
530507
-L${FOUNDATION_PATH_TO_XCTEST_BUILD}
531508
-lXCTest
532509
${WORKAROUND_SR9138}
533-
${WORKAROUND_SR9995}
534510
$<$<PLATFORM_ID:Windows>:-lWS2_32>
535511
RESOURCES
536512
${CMAKE_SOURCE_DIR}/TestFoundation/Resources/Info.plist
@@ -564,6 +540,7 @@ if(ENABLE_TESTING)
564540
-I;${ICU_INCLUDE_DIR}
565541
${libdispatch_cflags}
566542
${swift_optimization_flags}
543+
${swift_libc_flags}
567544
DEPENDS
568545
Foundation
569546
CoreFoundation

0 commit comments

Comments
 (0)