/ 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)