@@ -101,6 +101,13 @@ function(_add_variant_c_compile_link_flags)
101
101
"-B" "${SWIFT_ANDROID_NDK_PATH} /toolchains/arm-linux-androideabi-${SWIFT_ANDROID_NDK_GCC_VERSION} /prebuilt/linux-x86_64/arm-linux-androideabi/bin/" )
102
102
endif ()
103
103
104
+ if ("${CFLAGS_SDK} " STREQUAL "WINDOWS" )
105
+ list (APPEND result "-DLLVM_ON_WIN32" )
106
+ list (APPEND result "-D_CRT_SECURE_NO_WARNINGS" )
107
+ # TODO(compnerd) handle /MT
108
+ list (APPEND result "-D_DLL" )
109
+ list (APPEND result "-fms-compatibility-version=1900" )
110
+ endif ()
104
111
105
112
if ("${CMAKE_SYSTEM_NAME} " STREQUAL "Darwin" )
106
113
@@ -176,6 +183,18 @@ function(_add_variant_c_compile_flags)
176
183
list (APPEND result "-g0" )
177
184
endif ()
178
185
186
+ if ("${CFLAGS_SDK} " STREQUAL "WINDOWS" )
187
+ list (APPEND result -Xclang;--dependent-lib=oldnames )
188
+ # TODO(compnerd) handle /MT, /MTd, /MD, /MDd
189
+ if ("${CMAKE_BUILD_TYPE} " STREQUAL "RELEASE" )
190
+ list (APPEND result "-D_MD" )
191
+ list (APPEND result -Xclang;--dependent-lib=msvcrt )
192
+ else ()
193
+ list (APPEND result "-D_MDd" )
194
+ list (APPEND result -Xclang;--dependent-lib=msvcrtd )
195
+ endif ()
196
+ endif ()
197
+
179
198
if (CFLAGS_ENABLE_ASSERTIONS )
180
199
list (APPEND result "-UNDEBUG" )
181
200
else ()
@@ -264,6 +283,10 @@ function(_add_variant_link_flags)
264
283
list (APPEND result "-lpthread" )
265
284
elseif ("${LFLAGS_SDK} " STREQUAL "CYGWIN" )
266
285
# No extra libraries required.
286
+ elseif ("${LFLAGS_SDK} " STREQUAL "WINDOWS" )
287
+ # NOTE: we do not use "/MD" or "/MDd" and select the runtime via linker
288
+ # options. This causes conflicts.
289
+ list (APPEND result "-nostdlib" )
267
290
elseif ("${LFLAGS_SDK} " STREQUAL "ANDROID" )
268
291
list (APPEND result
269
292
"-ldl"
@@ -594,6 +617,16 @@ function(_add_swift_library_single target name)
594
617
endif ()
595
618
endif ()
596
619
620
+ if ("${SWIFTLIB_SINGLE_SDK} " STREQUAL "WINDOWS" )
621
+ list (APPEND SWIFTLIB_SINGLE_SWIFT_COMPILE_FLAGS -Xfrontend;-autolink-library;-Xfrontend;oldnames )
622
+ # TODO(compnerd) handle /MT and /MTd
623
+ if ("${CMAKE_BUILD_TYPE} " STREQUAL "RELEASE" )
624
+ list (APPEND SWIFTLIB_SINGLE_SWIFT_COMPILE_FLAGS -Xfrontend;-autolink-library;-Xfrontend;msvcrt )
625
+ else ()
626
+ list (APPEND SWIFTLIB_SINGLE_SWIFT_COMPILE_FLAGS -Xfrontend;-autolink-library;-Xfrontend;msvcrtd )
627
+ endif ()
628
+ endif ()
629
+
597
630
# FIXME: don't actually depend on the libraries in SWIFTLIB_SINGLE_LINK_LIBRARIES,
598
631
# just any swiftmodule files that are associated with them.
599
632
handle_swift_sources (
@@ -649,6 +682,28 @@ function(_add_swift_library_single target name)
649
682
endif ()
650
683
endif ()
651
684
685
+ if ("${SWIFTLIB_SINGLE_SDK} " STREQUAL "WINDOWS" )
686
+ if ("${libkind} " STREQUAL "STATIC" )
687
+ set_property (TARGET "${target} " PROPERTY PREFIX "lib" )
688
+ set_property (TARGET "${target} " PROPERTY SUFFIX ".lib" )
689
+ elseif ("${libkind} " STREQUAL "SHARED" )
690
+ set_property (TARGET "${target} " PROPERTY PREFIX "" )
691
+ set_property (TARGET "${target} " PROPERTY SUFFIX ".dll" )
692
+
693
+ # Each dll has an associated .lib (import library); since we may be
694
+ # building on a non-DLL platform (not windows), create an imported target
695
+ # for the library which created implicitly by the dll.
696
+ add_custom_command_target (${target} _IMPORT_LIBRARY
697
+ OUTPUT "${SWIFTLIB_DIR} /${SWIFTLIB_SINGLE_SUBDIR} /${name} .lib"
698
+ DEPENDS "${target} " )
699
+ add_library (${target} _IMPLIB SHARED IMPORTED GLOBAL )
700
+ set_property (TARGET "${target} _IMPLIB" PROPERTY
701
+ IMPORTED_LOCATION "${SWIFTLIB_DIR} /${SWIFTLIB_SINGLE_SUBDIR} /${name} .lib" )
702
+ add_dependencies (${target} _IMPLIB ${${target}_IMPORT_LIBRARY} )
703
+ endif ()
704
+ set_property (TARGET "${target} " PROPERTY NO_SONAME ON )
705
+ endif ()
706
+
652
707
# The section metadata objects are generated sources, and we need to tell CMake
653
708
# not to expect to find them prior to their generation.
654
709
if ("${SWIFT_SDK_${SWIFTLIB_SINGLE_SDK} _OBJECT_FORMAT}" STREQUAL "ELF" )
@@ -880,7 +935,9 @@ function(_add_swift_library_single target name)
880
935
"${SWIFT_SDK_${SWIFTLIB_SINGLE_SDK} _OBJECT_FORMAT}" STREQUAL "ELF" )
881
936
list (APPEND link_flags "-fuse-ld=gold" )
882
937
endif ()
883
- if (SWIFT_ENABLE_LLD_LINKER )
938
+ if (SWIFT_ENABLE_LLD_LINKER OR
939
+ ("${SWIFTLIB_SINGLE_SDK} " STREQUAL "WINDOWS" AND
940
+ NOT "${CMAKE_SYSTEM_NAME} " STREQUAL "WINDOWS" ))
884
941
list (APPEND link_flags "-fuse-ld=lld" )
885
942
endif ()
886
943
@@ -925,6 +982,34 @@ function(_add_swift_library_single target name)
925
982
COMPILE_FLAGS " ${c_compile_flags} " )
926
983
set_property (TARGET "${target} " APPEND_STRING PROPERTY
927
984
LINK_FLAGS " ${link_flags} -L${SWIFTLIB_DIR} /${SWIFTLIB_SINGLE_SUBDIR} -L${SWIFT_NATIVE_SWIFT_TOOLS_PATH} /../lib/swift/${SWIFTLIB_SINGLE_SUBDIR} -L${SWIFT_NATIVE_SWIFT_TOOLS_PATH} /../lib/swift/${SWIFT_SDK_${SWIFTLIB_SINGLE_SDK} _LIB_SUBDIR}" )
985
+
986
+ # Adjust the linked libraries for windows targets. On Windows, the link is
987
+ # performed against the import library, and the runtime uses the dll. Not
988
+ # doing so will result in incorrect symbol resolution and linkage. We created
989
+ # import library targets when the library was added. Use that to adjust the
990
+ # link libraries.
991
+ if ("${SWIFTLIB_SINGLE_SDK} " STREQUAL "WINDOWS" )
992
+ foreach (library_list LINK_LIBRARIES INTERFACE_LINK_LIBRARIES PRIVATE_LINK_LIBRARIES )
993
+ set (import_libraries )
994
+ foreach (library ${SWIFTLIB_SINGLE_${library_list}} )
995
+ # Ensure that the library is a target. If an absolute path was given,
996
+ # then we do not have an import library associated with it. This occurs
997
+ # primarily with ICU (which will be an import library). Import
998
+ # libraries are only associated with shared libraries, so add an
999
+ # additional check for that as well.
1000
+ set (import_library ${library} )
1001
+ if (TARGET ${library} )
1002
+ get_target_property (type ${library} TYPE )
1003
+ if (${type} STREQUAL "SHARED_LIBRARY" )
1004
+ set (import_library ${library} _IMPLIB )
1005
+ endif ()
1006
+ endif ()
1007
+ list (APPEND import_libraries ${import_library} )
1008
+ endforeach ()
1009
+ set (SWIFTLIB_SINGLE_${library_list} ${import_libraries} )
1010
+ endforeach ()
1011
+ endif ()
1012
+
928
1013
if ("${libkind} " STREQUAL "OBJECT" )
929
1014
_require_empty_list (
930
1015
"${SWIFTLIB_SINGLE_PRIVATE_LINK_LIBRARIES} "
@@ -1329,14 +1414,23 @@ function(add_swift_library name)
1329
1414
if (NOT SWIFTLIB_OBJECT_LIBRARY )
1330
1415
# Determine the name of the universal library.
1331
1416
if (SWIFTLIB_SHARED )
1332
- set (UNIVERSAL_LIBRARY_NAME
1333
- "${SWIFTLIB_DIR} /${SWIFT_SDK_${sdk} _LIB_SUBDIR}/${CMAKE_SHARED_LIBRARY_PREFIX}${name}${CMAKE_SHARED_LIBRARY_SUFFIX} " )
1417
+ if ("${sdk} " STREQUAL "WINDOWS" )
1418
+ set (UNIVERSAL_LIBRARY_NAME
1419
+ "${SWIFTLIB_DIR} /${SWIFT_SDK_${sdk} _LIB_SUBDIR}/${name} .dll" )
1420
+ else ()
1421
+ set (UNIVERSAL_LIBRARY_NAME
1422
+ "${SWIFTLIB_DIR} /${SWIFT_SDK_${sdk} _LIB_SUBDIR}/${CMAKE_SHARED_LIBRARY_PREFIX}${name}${CMAKE_SHARED_LIBRARY_SUFFIX} " )
1423
+ endif ()
1334
1424
else ()
1335
- set (UNIVERSAL_LIBRARY_NAME
1336
- "${SWIFTLIB_DIR} /${SWIFT_SDK_${sdk} _LIB_SUBDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}${name}${CMAKE_STATIC_LIBRARY_SUFFIX} " )
1425
+ if ("${sdk} " STREQUAL "WINDOWS" )
1426
+ set (UNIVERSAL_LIBRARY_NAME
1427
+ "${SWIFTLIB_DIR} /${SWIFT_SDK_${sdk} _LIB_SUBDIR}/lib${name} .lib" )
1428
+ else ()
1429
+ set (UNIVERSAL_LIBRARY_NAME
1430
+ "${SWIFTLIB_DIR} /${SWIFT_SDK_${sdk} _LIB_SUBDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}${name}${CMAKE_STATIC_LIBRARY_SUFFIX} " )
1431
+ endif ()
1337
1432
endif ()
1338
1433
1339
-
1340
1434
set (lipo_target "${name} -${SWIFT_SDK_${sdk} _LIB_SUBDIR}" )
1341
1435
_add_swift_lipo_target (
1342
1436
${lipo_target}
@@ -1552,7 +1646,9 @@ function(_add_swift_executable_single name)
1552
1646
"${SWIFT_SDK_${SWIFTEXE_SINGLE_SDK} _OBJECT_FORMAT}" STREQUAL "ELF" )
1553
1647
list (APPEND link_flags "-fuse-ld=gold" )
1554
1648
endif ()
1555
- if (SWIFT_ENABLE_LLD_LINKER )
1649
+ if (SWIFT_ENABLE_LLD_LINKER OR
1650
+ ("${SWIFTLIB_SINGLE_SDK} " STREQUAL "WINDOWS" AND
1651
+ NOT "${CMAKE_SYSTEM_NAME} " STREQUAL "WINDOWS" ))
1556
1652
list (APPEND link_flags "-fuse-ld=lld" )
1557
1653
endif ()
1558
1654
0 commit comments