/ CMakeLists.txt
CMakeLists.txt
1 2 cmake_minimum_required(VERSION 3.15.1) 3 4 list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules) 5 6 # NOTE(compnerd) enable CMP0091 - select MSVC runtime based on 7 # CMAKE_MSVC_RUNTIME_LIBRARY. Requires CMake 3.15 or newer 8 if(POLICY CMP0091) 9 cmake_policy(SET CMP0091 NEW) 10 endif() 11 12 project(Foundation 13 LANGUAGES C Swift) 14 enable_testing() 15 16 # NOTE(compnerd) default to /MD or /MDd by default based on the configuration. 17 # Cache the variable to allow the user to alter the configuration. 18 set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL" CACHE 19 STRING "MSVC Runtime Library") 20 21 if(CMAKE_VERSION VERSION_LESS 3.16.0) 22 if(NOT (CMAKE_SYSTEM_NAME STREQUAL Windows OR CMAKE_SYSTEM_NAME STREQUAL Darwin)) 23 set(CMAKE_SHARED_LIBRARY_RUNTIME_Swift_FLAG "-Xlinker -rpath -Xlinker ") 24 set(CMAKE_SHARED_LIBRARY_RUNTIME_Swift_FLAG_SEP ":") 25 endif() 26 # Workaround for CMake 3.15 which doesn't link libraries properly on Windows 27 set(CMAKE_LINK_LIBRARY_FLAG "-l") 28 endif() 29 30 if(CMAKE_VERSION VERSION_LESS 3.16 AND CMAKE_SYSTEM_NAME STREQUAL Windows) 31 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) 32 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) 33 else() 34 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) 35 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) 36 endif() 37 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) 38 set(CMAKE_Swift_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/swift) 39 40 option(BUILD_SHARED_LIBS "build shared libraries" ON) 41 option(HAS_LIBDISPATCH_API "has libdispatch API" ON) 42 option(BUILD_NETWORKING "build FoundationNetworking module" ON) 43 option(BUILD_TOOLS "build tools" ON) 44 option(NS_CURL_ASSUME_FEATURES_MISSING "Assume that optional libcurl features are missing rather than test the library's version, for build debugging" NO) 45 46 if(HAS_LIBDISPATCH_API) 47 find_package(dispatch CONFIG REQUIRED) 48 endif() 49 50 find_package(ICU COMPONENTS uc i18n REQUIRED OPTIONAL_COMPONENTS data) 51 52 include(SwiftSupport) 53 include(GNUInstallDirs) 54 include(XCTest) 55 56 set(CF_DEPLOYMENT_SWIFT YES CACHE BOOL "Build for Swift" FORCE) 57 58 set(CMAKE_THREAD_PREFER_PTHREAD TRUE) 59 set(THREADS_PREFER_PTHREAD_FLAG OFF) 60 find_package(Threads REQUIRED) 61 62 set(SAVED_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS}) 63 set(BUILD_SHARED_LIBS NO) 64 add_subdirectory(CoreFoundation EXCLUDE_FROM_ALL) 65 set(BUILD_SHARED_LIBS ${SAVED_BUILD_SHARED_LIBS}) 66 67 # BlocksRuntime is already in libdispatch so it is only needed if libdispatch is 68 # NOT being used 69 if(NOT HAS_LIBDISPATCH_API) 70 add_subdirectory(Sources/BlocksRuntime) 71 endif() 72 73 # Setup include paths for uuid/uuid.h 74 add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/uuid-headers/uuid/uuid.h 75 COMMAND 76 ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/uuid-headers/uuid 77 COMMAND 78 ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/Sources/UUID/uuid.h ${CMAKE_BINARY_DIR}/uuid-headers/uuid/uuid.h) 79 add_custom_target(uuid-headers 80 DEPENDS ${CMAKE_BINARY_DIR}/uuid-headers/uuid/uuid.h) 81 add_dependencies(CoreFoundation uuid-headers) 82 target_include_directories(CoreFoundation PRIVATE 83 ${CMAKE_BINARY_DIR}/uuid-headers 84 ${CMAKE_CURRENT_BINARY_DIR}/CoreFoundation.framework/Headers) 85 86 add_subdirectory(Sources) 87 if(ENABLE_TESTING) 88 find_package(XCTest CONFIG REQUIRED) 89 add_subdirectory(Tests) 90 endif() 91 92 if(NOT BUILD_SHARED_LIBS) 93 set_property(GLOBAL APPEND PROPERTY Foundation_EXPORTS 94 CoreFoundation CFXMLInterface) 95 96 if(NOT HAS_LIBDISPATCH_API) 97 set_property(GLOBAL APPEND PROPERTY Foundation_EXPORTS 98 BlocksRuntime) 99 endif() 100 101 install(TARGETS CoreFoundation CFXMLInterface 102 DESTINATION lib/swift_static/$<LOWER_CASE:${CMAKE_SYSTEM_NAME}>) 103 104 if(BUILD_NETWORKING) 105 set_property(GLOBAL APPEND PROPERTY Foundation_EXPORTS 106 CFURLSessionInterface) 107 install(TARGETS CFURLSessionInterface 108 DESTINATION lib/swift_static/$<LOWER_CASE:${CMAKE_SYSTEM_NAME}>) 109 endif() 110 endif() 111 112 set(swift_lib_dir "lib/swift") 113 if(NOT BUILD_SHARED_LIBS) 114 set(swift_lib_dir "lib/swift_static") 115 endif() 116 117 # TODO(compnerd) install as a Framework as that is how swift actually is built 118 install(DIRECTORY 119 ${CMAKE_CURRENT_BINARY_DIR}/CoreFoundation.framework/Headers/ 120 DESTINATION 121 ${swift_lib_dir}/CoreFoundation 122 FILES_MATCHING PATTERN "*.h") 123 install(FILES 124 CoreFoundation/Base.subproj/$<$<NOT:$<BOOL:${BUILD_SHARED_LIBS}>>:static/>module.map 125 DESTINATION 126 ${swift_lib_dir}/CoreFoundation) 127 install(DIRECTORY 128 ${CMAKE_CURRENT_BINARY_DIR}/CFURLSessionInterface.framework/Headers/ 129 DESTINATION 130 ${swift_lib_dir}/CFURLSessionInterface 131 FILES_MATCHING PATTERN "*.h") 132 install(FILES 133 CoreFoundation/URL.subproj/$<$<NOT:$<BOOL:${BUILD_SHARED_LIBS}>>:static/>module.map 134 DESTINATION 135 ${swift_lib_dir}/CFURLSessionInterface) 136 install(DIRECTORY 137 ${CMAKE_CURRENT_BINARY_DIR}/CFXMLInterface.framework/Headers/ 138 DESTINATION 139 ${swift_lib_dir}/CFXMLInterface 140 FILES_MATCHING PATTERN "*.h") 141 install(FILES 142 CoreFoundation/Parsing.subproj/$<$<NOT:$<BOOL:${BUILD_SHARED_LIBS}>>:static/>module.map 143 DESTINATION 144 ${swift_lib_dir}/CFXMLInterface) 145 146 add_subdirectory(cmake/modules)