CMake: use object libraries instead of repacking static archives

This commit is contained in:
Dmitri Gribenko
2016-06-01 02:30:17 -06:00
parent 540619e9de
commit d227aeb64d
6 changed files with 176 additions and 159 deletions

View File

@@ -1,5 +1,9 @@
cmake_minimum_required(VERSION 2.8.12) cmake_minimum_required(VERSION 2.8.12)
if(POLICY CMP0051)
cmake_policy(SET CMP0051 NEW)
endif()
# Add path for custom CMake modules. # Add path for custom CMake modules.
list(APPEND CMAKE_MODULE_PATH list(APPEND CMAKE_MODULE_PATH
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules") "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules")

View File

@@ -41,6 +41,12 @@ function(add_dependencies_multiple_targets)
endif() endif()
endfunction() endfunction()
function(_require_empty_list the_list the_message)
if(the_list)
message(FATAL_ERROR "${the_message}")
endif()
endfunction()
# Compute the library subdirectory to use for the given sdk and # Compute the library subdirectory to use for the given sdk and
# architecture, placing the result in 'result_var_name'. # architecture, placing the result in 'result_var_name'.
function(compute_library_subdir result_var_name sdk arch) function(compute_library_subdir result_var_name sdk arch)
@@ -337,22 +343,6 @@ function(_add_swift_lipo_target target output)
endif() endif()
endfunction() endfunction()
# After target 'dst_target' is built from its own object files, merge the
# contents of 'src_target' into it. 'dst_target' and 'src_target' must be
# static-library targets.
function(_target_merge_static_library dst_target src_target)
add_dependencies("${dst_target}" "${src_target}")
set(unpack_dir "${CMAKE_BINARY_DIR}/tmp/unpack/${dst_target}")
add_custom_command(TARGET "${dst_target}" POST_BUILD
COMMAND "${CMAKE_COMMAND}" -E make_directory "${unpack_dir}"
COMMAND cd "${unpack_dir}"
COMMAND "${CMAKE_AR}" x "$<TARGET_FILE:${src_target}>"
COMMAND "${CMAKE_AR}" r "$<TARGET_FILE:${dst_target}>" ./*.o
COMMAND cd "${CMAKE_BINARY_DIR}"
COMMAND "${CMAKE_COMMAND}" -E remove_directory "${unpack_dir}"
)
endfunction()
# Add a single variant of a new Swift library. # Add a single variant of a new Swift library.
# #
# Usage: # Usage:
@@ -443,13 +433,13 @@ endfunction()
# Sources to add into this library # Sources to add into this library
function(_add_swift_library_single target name) function(_add_swift_library_single target name)
set(SWIFTLIB_SINGLE_options set(SWIFTLIB_SINGLE_options
SHARED IS_STDLIB IS_STDLIB_CORE IS_SDK_OVERLAY SHARED OBJECT_LIBRARY IS_STDLIB IS_STDLIB_CORE IS_SDK_OVERLAY
TARGET_LIBRARY HOST_LIBRARY TARGET_LIBRARY HOST_LIBRARY
API_NOTES_NON_OVERLAY DONT_EMBED_BITCODE) API_NOTES_NON_OVERLAY DONT_EMBED_BITCODE)
cmake_parse_arguments(SWIFTLIB_SINGLE cmake_parse_arguments(SWIFTLIB_SINGLE
"${SWIFTLIB_SINGLE_options}" "${SWIFTLIB_SINGLE_options}"
"SDK;ARCHITECTURE;INSTALL_IN_COMPONENT;DEPLOYMENT_VERSION_IOS" "SDK;ARCHITECTURE;INSTALL_IN_COMPONENT;DEPLOYMENT_VERSION_IOS"
"DEPENDS;LINK_LIBRARIES;FRAMEWORK_DEPENDS;FRAMEWORK_DEPENDS_WEAK;COMPONENT_DEPENDS;C_COMPILE_FLAGS;SWIFT_COMPILE_FLAGS;LINK_FLAGS;PRIVATE_LINK_LIBRARIES;INTERFACE_LINK_LIBRARIES;FILE_DEPENDS" "DEPENDS;LINK_LIBRARIES;FRAMEWORK_DEPENDS;FRAMEWORK_DEPENDS_WEAK;COMPONENT_DEPENDS;C_COMPILE_FLAGS;SWIFT_COMPILE_FLAGS;LINK_FLAGS;PRIVATE_LINK_LIBRARIES;INTERFACE_LINK_LIBRARIES;INCORPORATE_OBJECT_LIBRARIES;FILE_DEPENDS"
${ARGN}) ${ARGN})
set(SWIFTLIB_SINGLE_SOURCES ${SWIFTLIB_SINGLE_UNPARSED_ARGUMENTS}) set(SWIFTLIB_SINGLE_SOURCES ${SWIFTLIB_SINGLE_UNPARSED_ARGUMENTS})
@@ -505,6 +495,8 @@ function(_add_swift_library_single target name)
if(MODULE) if(MODULE)
set(libkind MODULE) set(libkind MODULE)
elseif(SWIFTLIB_SINGLE_OBJECT_LIBRARY)
set(libkind OBJECT)
elseif(SWIFTLIB_SINGLE_SHARED) elseif(SWIFTLIB_SINGLE_SHARED)
set(libkind SHARED) set(libkind SHARED)
else() else()
@@ -576,10 +568,18 @@ function(_add_swift_library_single target name)
INSTALL_IN_COMPONENT "${SWIFTLIB_INSTALL_IN_COMPONENT}") INSTALL_IN_COMPONENT "${SWIFTLIB_INSTALL_IN_COMPONENT}")
add_swift_source_group("${SWIFTLIB_SINGLE_EXTERNAL_SOURCES}") add_swift_source_group("${SWIFTLIB_SINGLE_EXTERNAL_SOURCES}")
set(VARIANT_SUFFIX "-${SWIFT_SDK_${SWIFTLIB_SINGLE_SDK}_LIB_SUBDIR}-${SWIFTLIB_SINGLE_ARCHITECTURE}")
set(SWIFTLIB_INCORPORATED_OBJECT_LIBRARIES_EXPRESSIONS)
foreach(object_library ${SWIFTLIB_SINGLE_INCORPORATE_OBJECT_LIBRARIES})
list(APPEND SWIFTLIB_INCORPORATED_OBJECT_LIBRARIES_EXPRESSIONS
$<TARGET_OBJECTS:${object_library}${VARIANT_SUFFIX}>)
endforeach()
add_library("${target}" ${libkind} add_library("${target}" ${libkind}
${SWIFT_SECTIONS_OBJECT_BEGIN} ${SWIFT_SECTIONS_OBJECT_BEGIN}
${SWIFTLIB_SINGLE_SOURCES} ${SWIFTLIB_SINGLE_SOURCES}
${SWIFTLIB_SINGLE_EXTERNAL_SOURCES} ${SWIFTLIB_SINGLE_EXTERNAL_SOURCES}
${SWIFTLIB_INCORPORATED_OBJECT_LIBRARIES_EXPRESSIONS}
${SWIFT_SECTIONS_OBJECT_END}) ${SWIFT_SECTIONS_OBJECT_END})
# The section metadata objects are generated sources, and we need to tell CMake # The section metadata objects are generated sources, and we need to tell CMake
@@ -660,6 +660,7 @@ function(_add_swift_library_single target name)
# library. # library.
add_library(${target_static} STATIC add_library(${target_static} STATIC
${SWIFTLIB_SINGLE_SOURCES} ${SWIFTLIB_SINGLE_SOURCES}
${SWIFTLIB_INCORPORATED_OBJECT_LIBRARIES_EXPRESSIONS}
# Note: the dummy.c source file provides no definitions. However, # Note: the dummy.c source file provides no definitions. However,
# it forces Xcode to properly link the static library. # it forces Xcode to properly link the static library.
@@ -728,6 +729,10 @@ function(_add_swift_library_single target name)
if("${libkind}" STREQUAL "SHARED") if("${libkind}" STREQUAL "SHARED")
target_link_libraries("${target}" PRIVATE ${SWIFTLIB_SINGLE_LINK_LIBRARIES}) target_link_libraries("${target}" PRIVATE ${SWIFTLIB_SINGLE_LINK_LIBRARIES})
elseif("${libkind}" STREQUAL "OBJECT")
_require_empty_list(
"${SWIFTLIB_SINGLE_LINK_LIBRARIES}"
"OBJECT_LIBRARY may not link to anything")
else() else()
target_link_libraries("${target}" INTERFACE ${SWIFTLIB_SINGLE_LINK_LIBRARIES}) target_link_libraries("${target}" INTERFACE ${SWIFTLIB_SINGLE_LINK_LIBRARIES})
endif() endif()
@@ -763,7 +768,10 @@ function(_add_swift_library_single target name)
endforeach() endforeach()
endforeach() endforeach()
swift_common_llvm_config("${target}" ${SWIFTLIB_SINGLE_COMPONENT_DEPENDS}) if(NOT SWIFTLIB_SINGLE_TARGET_LIBRARY)
# Call llvm_config() only for libraries that are part of the compiler.
swift_common_llvm_config("${target}" ${SWIFTLIB_SINGLE_COMPONENT_DEPENDS})
endif()
# Collect compile and link flags for the static and non-static targets. # Collect compile and link flags for the static and non-static targets.
# Don't set PROPERTY COMPILE_FLAGS or LINK_FLAGS directly. # Don't set PROPERTY COMPILE_FLAGS or LINK_FLAGS directly.
@@ -843,10 +851,23 @@ function(_add_swift_library_single target name)
COMPILE_FLAGS " ${c_compile_flags}") COMPILE_FLAGS " ${c_compile_flags}")
set_property(TARGET "${target}" APPEND_STRING PROPERTY set_property(TARGET "${target}" APPEND_STRING PROPERTY
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}") 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}")
target_link_libraries("${target}" PRIVATE if("${libkind}" STREQUAL "OBJECT")
${SWIFTLIB_SINGLE_PRIVATE_LINK_LIBRARIES}) _require_empty_list(
target_link_libraries("${target}" INTERFACE "${SWIFTLIB_SINGLE_PRIVATE_LINK_LIBRARIES}"
${SWIFTLIB_SINGLE_INTERFACE_LINK_LIBRARIES}) "OBJECT_LIBRARY may not link to anything")
else()
target_link_libraries("${target}" PRIVATE
${SWIFTLIB_SINGLE_PRIVATE_LINK_LIBRARIES})
endif()
if("${libkind}" STREQUAL "OBJECT")
_require_empty_list(
"${SWIFTLIB_SINGLE_INTERFACE_LINK_LIBRARIES}"
"OBJECT_LIBRARY may not link to anything")
else()
target_link_libraries("${target}" INTERFACE
${SWIFTLIB_SINGLE_INTERFACE_LINK_LIBRARIES})
endif()
set_property(TARGET "${target}" PROPERTY set_property(TARGET "${target}" PROPERTY
LINKER_LANGUAGE "CXX") LINKER_LANGUAGE "CXX")
@@ -857,17 +878,6 @@ function(_add_swift_library_single target name)
LINK_FLAGS " ${link_flags} -L${SWIFTSTATICLIB_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}") LINK_FLAGS " ${link_flags} -L${SWIFTSTATICLIB_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}")
target_link_libraries("${target_static}" PRIVATE target_link_libraries("${target_static}" PRIVATE
${SWIFTLIB_SINGLE_PRIVATE_LINK_LIBRARIES}) ${SWIFTLIB_SINGLE_PRIVATE_LINK_LIBRARIES})
if("${name}" STREQUAL "swiftCore")
# Have libswiftCore.a include the contents of the private Swift libraries
# it depends on, so statically linking clients don't have to know about
# them.
foreach(private_link_library ${SWIFTLIB_SINGLE_PRIVATE_LINK_LIBRARIES})
if(TARGET "${private_link_library}")
_target_merge_static_library("${target_static}" "${private_link_library}")
endif()
endforeach()
endif()
endif() endif()
# Do not add code here. # Do not add code here.
@@ -982,13 +992,13 @@ endfunction()
# Sources to add into this library. # Sources to add into this library.
function(add_swift_library name) function(add_swift_library name)
set(SWIFTLIB_options set(SWIFTLIB_options
SHARED IS_STDLIB IS_STDLIB_CORE IS_SDK_OVERLAY SHARED OBJECT_LIBRARY IS_STDLIB IS_STDLIB_CORE IS_SDK_OVERLAY
TARGET_LIBRARY HOST_LIBRARY TARGET_LIBRARY HOST_LIBRARY
API_NOTES_NON_OVERLAY DONT_EMBED_BITCODE HAS_SWIFT_CONTENT) API_NOTES_NON_OVERLAY DONT_EMBED_BITCODE HAS_SWIFT_CONTENT)
cmake_parse_arguments(SWIFTLIB cmake_parse_arguments(SWIFTLIB
"${SWIFTLIB_options}" "${SWIFTLIB_options}"
"INSTALL_IN_COMPONENT;DEPLOYMENT_VERSION_IOS" "INSTALL_IN_COMPONENT;DEPLOYMENT_VERSION_IOS"
"DEPENDS;LINK_LIBRARIES;SWIFT_MODULE_DEPENDS;SWIFT_MODULE_DEPENDS_OSX;SWIFT_MODULE_DEPENDS_IOS;SWIFT_MODULE_DEPENDS_TVOS;SWIFT_MODULE_DEPENDS_WATCHOS;FRAMEWORK_DEPENDS;FRAMEWORK_DEPENDS_WEAK;FRAMEWORK_DEPENDS_OSX;FRAMEWORK_DEPENDS_IOS_TVOS;COMPONENT_DEPENDS;FILE_DEPENDS;TARGET_SDKS;C_COMPILE_FLAGS;SWIFT_COMPILE_FLAGS;SWIFT_COMPILE_FLAGS_OSX;SWIFT_COMPILE_FLAGS_IOS;SWIFT_COMPILE_FLAGS_TVOS;SWIFT_COMPILE_FLAGS_WATCHOS;LINK_FLAGS;PRIVATE_LINK_LIBRARIES;INTERFACE_LINK_LIBRARIES" "DEPENDS;LINK_LIBRARIES;SWIFT_MODULE_DEPENDS;SWIFT_MODULE_DEPENDS_OSX;SWIFT_MODULE_DEPENDS_IOS;SWIFT_MODULE_DEPENDS_TVOS;SWIFT_MODULE_DEPENDS_WATCHOS;FRAMEWORK_DEPENDS;FRAMEWORK_DEPENDS_WEAK;FRAMEWORK_DEPENDS_OSX;FRAMEWORK_DEPENDS_IOS_TVOS;COMPONENT_DEPENDS;FILE_DEPENDS;TARGET_SDKS;C_COMPILE_FLAGS;SWIFT_COMPILE_FLAGS;SWIFT_COMPILE_FLAGS_OSX;SWIFT_COMPILE_FLAGS_IOS;SWIFT_COMPILE_FLAGS_TVOS;SWIFT_COMPILE_FLAGS_WATCHOS;LINK_FLAGS;PRIVATE_LINK_LIBRARIES;INTERFACE_LINK_LIBRARIES;INCORPORATE_OBJECT_LIBRARIES"
${ARGN}) ${ARGN})
set(SWIFTLIB_SOURCES ${SWIFTLIB_UNPARSED_ARGUMENTS}) set(SWIFTLIB_SOURCES ${SWIFTLIB_UNPARSED_ARGUMENTS})
@@ -1150,6 +1160,7 @@ function(add_swift_library name)
${VARIANT_NAME} ${VARIANT_NAME}
${name} ${name}
${SWIFTLIB_SHARED_keyword} ${SWIFTLIB_SHARED_keyword}
${SWIFTLIB_OBJECT_LIBRARY_keyword}
${SWIFTLIB_SOURCES} ${SWIFTLIB_SOURCES}
SDK ${sdk} SDK ${sdk}
ARCHITECTURE ${arch} ARCHITECTURE ${arch}
@@ -1163,6 +1174,7 @@ function(add_swift_library name)
SWIFT_COMPILE_FLAGS ${swiftlib_swift_compile_flags_all} SWIFT_COMPILE_FLAGS ${swiftlib_swift_compile_flags_all}
LINK_FLAGS ${SWIFTLIB_LINK_FLAGS} LINK_FLAGS ${SWIFTLIB_LINK_FLAGS}
PRIVATE_LINK_LIBRARIES ${swiftlib_private_link_libraries_targets} PRIVATE_LINK_LIBRARIES ${swiftlib_private_link_libraries_targets}
INCORPORATE_OBJECT_LIBRARIES ${SWIFTLIB_INCORPORATE_OBJECT_LIBRARIES}
${SWIFTLIB_DONT_EMBED_BITCODE_keyword} ${SWIFTLIB_DONT_EMBED_BITCODE_keyword}
${SWIFTLIB_API_NOTES_NON_OVERLAY_keyword} ${SWIFTLIB_API_NOTES_NON_OVERLAY_keyword}
${SWIFTLIB_IS_STDLIB_keyword} ${SWIFTLIB_IS_STDLIB_keyword}
@@ -1174,120 +1186,124 @@ function(add_swift_library name)
DEPLOYMENT_VERSION_IOS "${SWIFTLIB_DEPLOYMENT_VERSION_IOS}" DEPLOYMENT_VERSION_IOS "${SWIFTLIB_DEPLOYMENT_VERSION_IOS}"
) )
# Add dependencies on the (not-yet-created) custom lipo target. if(NOT SWIFTLIB_OBJECT_LIBRARY)
foreach(DEP ${SWIFTLIB_LINK_LIBRARIES})
if (NOT "${DEP}" STREQUAL "icucore")
add_dependencies(${VARIANT_NAME}
"${DEP}-${SWIFT_SDK_${sdk}_LIB_SUBDIR}")
endif()
endforeach()
if (SWIFT_BUILD_STATIC_STDLIB AND SWIFTLIB_IS_STDLIB)
# Add dependencies on the (not-yet-created) custom lipo target. # Add dependencies on the (not-yet-created) custom lipo target.
foreach(DEP ${SWIFTLIB_LINK_LIBRARIES}) foreach(DEP ${SWIFTLIB_LINK_LIBRARIES})
if (NOT "${DEP}" STREQUAL "icucore") if (NOT "${DEP}" STREQUAL "icucore")
add_dependencies("${VARIANT_NAME}-static" add_dependencies(${VARIANT_NAME}
"${DEP}-${SWIFT_SDK_${sdk}_LIB_SUBDIR}-static") "${DEP}-${SWIFT_SDK_${sdk}_LIB_SUBDIR}")
endif()
endforeach()
if (SWIFT_BUILD_STATIC_STDLIB AND SWIFTLIB_IS_STDLIB)
# Add dependencies on the (not-yet-created) custom lipo target.
foreach(DEP ${SWIFTLIB_LINK_LIBRARIES})
if (NOT "${DEP}" STREQUAL "icucore")
add_dependencies("${VARIANT_NAME}-static"
"${DEP}-${SWIFT_SDK_${sdk}_LIB_SUBDIR}-static")
endif()
endforeach()
endif()
# Note this thin library.
list(APPEND THIN_INPUT_TARGETS ${VARIANT_NAME})
endif()
endforeach()
if(NOT SWIFTLIB_OBJECT_LIBRARY)
# Determine the name of the universal library.
if(SWIFTLIB_SHARED)
set(UNIVERSAL_LIBRARY_NAME
"${SWIFTLIB_DIR}/${SWIFT_SDK_${sdk}_LIB_SUBDIR}/${CMAKE_SHARED_LIBRARY_PREFIX}${name}${CMAKE_SHARED_LIBRARY_SUFFIX}")
else()
set(UNIVERSAL_LIBRARY_NAME
"${SWIFTLIB_DIR}/${SWIFT_SDK_${sdk}_LIB_SUBDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}${name}${CMAKE_STATIC_LIBRARY_SUFFIX}")
endif()
set(lipo_target "${name}-${SWIFT_SDK_${sdk}_LIB_SUBDIR}")
_add_swift_lipo_target(
${lipo_target}
"${UNIVERSAL_LIBRARY_NAME}"
${THIN_INPUT_TARGETS})
# Cache universal libraries for dependency purposes
set(UNIVERSAL_LIBRARY_NAMES_${SWIFT_SDK_${sdk}_LIB_SUBDIR}
${UNIVERSAL_LIBRARY_NAMES_${SWIFT_SDK_${sdk}_LIB_SUBDIR}}
${lipo_target}
CACHE INTERNAL "UNIVERSAL_LIBRARY_NAMES_${SWIFT_SDK_${sdk}_LIB_SUBDIR}")
# Determine the subdirectory where this library will be installed.
set(resource_dir_sdk_subdir "${SWIFT_SDK_${sdk}_LIB_SUBDIR}")
if("${resource_dir_sdk_subdir}" STREQUAL "")
message(FATAL_ERROR "internal error: the variable should be non-empty")
endif()
if(SWIFTLIB_TARGET_LIBRARY)
if(SWIFTLIB_SHARED)
set(resource_dir "swift")
set(file_permissions
OWNER_READ OWNER_WRITE OWNER_EXECUTE
GROUP_READ GROUP_EXECUTE
WORLD_READ WORLD_EXECUTE)
else()
set(resource_dir "swift_static")
set(file_permissions
OWNER_READ OWNER_WRITE
GROUP_READ
WORLD_READ)
endif()
swift_install_in_component("${SWIFTLIB_INSTALL_IN_COMPONENT}"
FILES "${UNIVERSAL_LIBRARY_NAME}"
DESTINATION "lib${LLVM_LIBDIR_SUFFIX}/${resource_dir}/${resource_dir_sdk_subdir}"
PERMISSIONS ${file_permissions})
endif()
# If we built static variants of the library, create a lipo target for
# them.
set(lipo_target_static)
if (SWIFT_BUILD_STATIC_STDLIB AND SWIFTLIB_IS_STDLIB)
set(THIN_INPUT_TARGETS_STATIC)
foreach(TARGET ${THIN_INPUT_TARGETS})
list(APPEND THIN_INPUT_TARGETS_STATIC "${TARGET}-static")
endforeach()
set(lipo_target_static
"${name}-${SWIFT_SDK_${sdk}_LIB_SUBDIR}-static")
set(UNIVERSAL_LIBRARY_NAME
"${SWIFTSTATICLIB_DIR}/${SWIFT_SDK_${sdk}_LIB_SUBDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}${name}${CMAKE_STATIC_LIBRARY_SUFFIX}")
_add_swift_lipo_target(
${lipo_target_static}
"${UNIVERSAL_LIBRARY_NAME}"
${THIN_INPUT_TARGETS_STATIC})
swift_install_in_component("${SWIFTLIB_INSTALL_IN_COMPONENT}"
FILES "${UNIVERSAL_LIBRARY_NAME}"
DESTINATION "lib${LLVM_LIBDIR_SUFFIX}/swift_static/${resource_dir_sdk_subdir}"
PERMISSIONS
OWNER_READ OWNER_WRITE
GROUP_READ
WORLD_READ)
endif()
# Add Swift standard library targets as dependencies to the top-level
# convenience target.
if(SWIFTLIB_TARGET_LIBRARY)
foreach(arch ${SWIFT_SDK_${sdk}_ARCHITECTURES})
set(VARIANT_SUFFIX "-${SWIFT_SDK_${sdk}_LIB_SUBDIR}-${arch}")
if(TARGET "swift-stdlib${VARIANT_SUFFIX}" AND TARGET "swift-test-stdlib${VARIANT_SUFFIX}")
add_dependencies("swift-stdlib${VARIANT_SUFFIX}"
${lipo_target}
${lipo_target_static})
if(NOT "${name}" STREQUAL "swiftStdlibCollectionUnittest")
add_dependencies("swift-test-stdlib${VARIANT_SUFFIX}"
${lipo_target}
${lipo_target_static})
endif()
endif() endif()
endforeach() endforeach()
endif() endif()
# Note this thin library.
list(APPEND THIN_INPUT_TARGETS ${VARIANT_NAME})
endforeach()
# Determine the name of the universal library.
if(SWIFTLIB_SHARED)
set(UNIVERSAL_LIBRARY_NAME
"${SWIFTLIB_DIR}/${SWIFT_SDK_${sdk}_LIB_SUBDIR}/${CMAKE_SHARED_LIBRARY_PREFIX}${name}${CMAKE_SHARED_LIBRARY_SUFFIX}")
else()
set(UNIVERSAL_LIBRARY_NAME
"${SWIFTLIB_DIR}/${SWIFT_SDK_${sdk}_LIB_SUBDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}${name}${CMAKE_STATIC_LIBRARY_SUFFIX}")
endif()
set(lipo_target "${name}-${SWIFT_SDK_${sdk}_LIB_SUBDIR}")
_add_swift_lipo_target(
${lipo_target}
"${UNIVERSAL_LIBRARY_NAME}"
${THIN_INPUT_TARGETS})
# Cache universal libraries for dependency purposes
set(UNIVERSAL_LIBRARY_NAMES_${SWIFT_SDK_${sdk}_LIB_SUBDIR}
${UNIVERSAL_LIBRARY_NAMES_${SWIFT_SDK_${sdk}_LIB_SUBDIR}}
${lipo_target}
CACHE INTERNAL "UNIVERSAL_LIBRARY_NAMES_${SWIFT_SDK_${sdk}_LIB_SUBDIR}")
# Determine the subdirectory where this library will be installed.
set(resource_dir_sdk_subdir "${SWIFT_SDK_${sdk}_LIB_SUBDIR}")
if("${resource_dir_sdk_subdir}" STREQUAL "")
message(FATAL_ERROR "internal error: the variable should be non-empty")
endif()
if(SWIFTLIB_TARGET_LIBRARY)
if(SWIFTLIB_SHARED)
set(resource_dir "swift")
set(file_permissions
OWNER_READ OWNER_WRITE OWNER_EXECUTE
GROUP_READ GROUP_EXECUTE
WORLD_READ WORLD_EXECUTE)
else()
set(resource_dir "swift_static")
set(file_permissions
OWNER_READ OWNER_WRITE
GROUP_READ
WORLD_READ)
endif()
swift_install_in_component("${SWIFTLIB_INSTALL_IN_COMPONENT}"
FILES "${UNIVERSAL_LIBRARY_NAME}"
DESTINATION "lib${LLVM_LIBDIR_SUFFIX}/${resource_dir}/${resource_dir_sdk_subdir}"
PERMISSIONS ${file_permissions})
endif()
# If we built static variants of the library, create a lipo target for
# them.
set(lipo_target_static)
if (SWIFT_BUILD_STATIC_STDLIB AND SWIFTLIB_IS_STDLIB)
set(THIN_INPUT_TARGETS_STATIC)
foreach(TARGET ${THIN_INPUT_TARGETS})
list(APPEND THIN_INPUT_TARGETS_STATIC "${TARGET}-static")
endforeach()
set(lipo_target_static
"${name}-${SWIFT_SDK_${sdk}_LIB_SUBDIR}-static")
set(UNIVERSAL_LIBRARY_NAME
"${SWIFTSTATICLIB_DIR}/${SWIFT_SDK_${sdk}_LIB_SUBDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}${name}${CMAKE_STATIC_LIBRARY_SUFFIX}")
_add_swift_lipo_target(
${lipo_target_static}
"${UNIVERSAL_LIBRARY_NAME}"
${THIN_INPUT_TARGETS_STATIC})
swift_install_in_component("${SWIFTLIB_INSTALL_IN_COMPONENT}"
FILES "${UNIVERSAL_LIBRARY_NAME}"
DESTINATION "lib${LLVM_LIBDIR_SUFFIX}/swift_static/${resource_dir_sdk_subdir}"
PERMISSIONS
OWNER_READ OWNER_WRITE
GROUP_READ
WORLD_READ)
endif()
# Add Swift standard library targets as dependencies to the top-level
# convenience target.
if(SWIFTLIB_TARGET_LIBRARY)
foreach(arch ${SWIFT_SDK_${sdk}_ARCHITECTURES})
set(VARIANT_SUFFIX "-${SWIFT_SDK_${sdk}_LIB_SUBDIR}-${arch}")
if(TARGET "swift-stdlib${VARIANT_SUFFIX}" AND TARGET "swift-test-stdlib${VARIANT_SUFFIX}")
add_dependencies("swift-stdlib${VARIANT_SUFFIX}"
${lipo_target}
${lipo_target_static})
if(NOT "${name}" STREQUAL "swiftStdlibCollectionUnittest")
add_dependencies("swift-test-stdlib${VARIANT_SUFFIX}"
${lipo_target}
${lipo_target_static})
endif()
endif()
endforeach()
endif() endif()
endforeach() endforeach()
else() else()
@@ -1328,6 +1344,7 @@ function(add_swift_library name)
LINK_FLAGS ${SWIFTLIB_LINK_FLAGS} LINK_FLAGS ${SWIFTLIB_LINK_FLAGS}
PRIVATE_LINK_LIBRARIES ${SWIFTLIB_PRIVATE_LINK_LIBRARIES} PRIVATE_LINK_LIBRARIES ${SWIFTLIB_PRIVATE_LINK_LIBRARIES}
INTERFACE_LINK_LIBRARIES ${SWIFTLIB_INTERFACE_LINK_LIBRARIES} INTERFACE_LINK_LIBRARIES ${SWIFTLIB_INTERFACE_LINK_LIBRARIES}
INCORPORATE_OBJECT_LIBRARIES ${SWIFTLIB_INCORPORATE_OBJECT_LIBRARIES}
${SWIFTLIB_DONT_EMBED_BITCODE_keyword} ${SWIFTLIB_DONT_EMBED_BITCODE_keyword}
${SWIFTLIB_API_NOTES_NON_OVERLAY_keyword} ${SWIFTLIB_API_NOTES_NON_OVERLAY_keyword}
${SWIFTLIB_IS_STDLIB_keyword} ${SWIFTLIB_IS_STDLIB_keyword}

View File

@@ -143,7 +143,6 @@ set(swift_core_private_link_libraries)
set(swift_stdlib_compile_flags) set(swift_stdlib_compile_flags)
if(CMAKE_SYSTEM_NAME STREQUAL "Darwin") if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
list(APPEND swift_core_link_flags "-all_load") list(APPEND swift_core_link_flags "-all_load")
list(APPEND swift_core_private_link_libraries swiftRuntime swiftStdlibStubs)
list(APPEND swift_core_framework_depends Foundation) list(APPEND swift_core_framework_depends Foundation)
list(APPEND swift_core_framework_depends CoreFoundation) list(APPEND swift_core_framework_depends CoreFoundation)
else() else()
@@ -158,10 +157,11 @@ else()
# effort has been completed. # effort has been completed.
#set(LINK_FLAGS #set(LINK_FLAGS
# -Wl,--whole-archive swiftRuntime -Wl,--no-whole-archive) # -Wl,--whole-archive swiftRuntime -Wl,--no-whole-archive)
list(APPEND swift_core_private_link_libraries swiftRuntime swiftStdlibStubs)
find_package(ICU REQUIRED COMPONENTS uc i18n) find_package(ICU REQUIRED COMPONENTS uc i18n)
list(APPEND swift_core_private_link_libraries list(APPEND swift_core_private_link_libraries
${ICU_UC_LIBRARY} ${ICU_I18N_LIBRARY}) ${ICU_UC_LIBRARY} ${ICU_I18N_LIBRARY})
include_directories(
${ICU_UC_INCLUDE_DIR} ${ICU_I18N_INCLUDE_DIR})
endif() endif()
if(CMAKE_SYSTEM_NAME STREQUAL "CYGWIN") if(CMAKE_SYSTEM_NAME STREQUAL "CYGWIN")
@@ -205,5 +205,6 @@ add_swift_library(swiftCore SHARED IS_STDLIB IS_STDLIB_CORE
SWIFT_COMPILE_FLAGS ${swift_stdlib_compile_flags} SWIFT_COMPILE_FLAGS ${swift_stdlib_compile_flags}
LINK_FLAGS ${swift_core_link_flags} LINK_FLAGS ${swift_core_link_flags}
PRIVATE_LINK_LIBRARIES ${swift_core_private_link_libraries} PRIVATE_LINK_LIBRARIES ${swift_core_private_link_libraries}
INCORPORATE_OBJECT_LIBRARIES swiftRuntime swiftStdlibStubs
FRAMEWORK_DEPENDS ${swift_core_framework_depends} FRAMEWORK_DEPENDS ${swift_core_framework_depends}
INSTALL_IN_COMPONENT stdlib) INSTALL_IN_COMPONENT stdlib)

View File

@@ -65,7 +65,7 @@ set(LLVM_OPTIONAL_SOURCES
${swift_runtime_objc_sources} ${swift_runtime_objc_sources}
${swift_runtime_leaks_sources}) ${swift_runtime_leaks_sources})
add_swift_library(swiftRuntime IS_STDLIB IS_STDLIB_CORE add_swift_library(swiftRuntime OBJECT_LIBRARY TARGET_LIBRARY
${swift_runtime_sources} ${swift_runtime_sources}
${swift_runtime_objc_sources} ${swift_runtime_objc_sources}
${swift_runtime_leaks_sources} ${swift_runtime_leaks_sources}

View File

@@ -1,6 +1,5 @@
set(swift_stubs_objc_sources) set(swift_stubs_objc_sources)
set(swift_stubs_unicode_normalization_sources) set(swift_stubs_unicode_normalization_sources)
set(swift_stubs_link_libraries)
if(SWIFT_HOST_VARIANT MATCHES "${SWIFT_DARWIN_VARIANTS}") if(SWIFT_HOST_VARIANT MATCHES "${SWIFT_DARWIN_VARIANTS}")
set(swift_stubs_objc_sources set(swift_stubs_objc_sources
@@ -10,16 +9,11 @@ if(SWIFT_HOST_VARIANT MATCHES "${SWIFT_DARWIN_VARIANTS}")
set(LLVM_OPTIONAL_SOURCES set(LLVM_OPTIONAL_SOURCES
UnicodeNormalization.cpp) UnicodeNormalization.cpp)
else() else()
find_package(ICU REQUIRED COMPONENTS uc i18n)
set(swift_stubs_unicode_normalization_sources set(swift_stubs_unicode_normalization_sources
UnicodeNormalization.cpp) UnicodeNormalization.cpp)
set(swift_stubs_link_libraries
${ICU_UC_LIBRARY} ${ICU_I18N_LIBRARY})
include_directories(
${ICU_UC_INCLUDE_DIR} ${ICU_I18N_INCLUDE_DIR})
endif() endif()
add_swift_library(swiftStdlibStubs IS_STDLIB IS_STDLIB_CORE add_swift_library(swiftStdlibStubs OBJECT_LIBRARY TARGET_LIBRARY
Assert.cpp Assert.cpp
GlobalObjects.cpp GlobalObjects.cpp
LibcShims.cpp LibcShims.cpp

View File

@@ -13,7 +13,6 @@ if(("${SWIFT_HOST_VARIANT_SDK}" STREQUAL "${SWIFT_PRIMARY_VARIANT_SDK}") AND
# some stdlib hooks to implement SwiftObject. # some stdlib hooks to implement SwiftObject.
list(APPEND PLATFORM_TARGET_LINK_LIBRARIES list(APPEND PLATFORM_TARGET_LINK_LIBRARIES
${FOUNDATION_LIBRARY} ${FOUNDATION_LIBRARY}
swiftCore${SWIFT_PRIMARY_VARIANT_SUFFIX}
swiftStdlibUnittest${SWIFT_PRIMARY_VARIANT_SUFFIX} swiftStdlibUnittest${SWIFT_PRIMARY_VARIANT_SUFFIX}
) )
elseif(SWIFT_HOST_VARIANT STREQUAL "freebsd") elseif(SWIFT_HOST_VARIANT STREQUAL "freebsd")
@@ -29,14 +28,16 @@ if(("${SWIFT_HOST_VARIANT_SDK}" STREQUAL "${SWIFT_PRIMARY_VARIANT_SDK}") AND
Enum.cpp Enum.cpp
Refcounting.cpp Refcounting.cpp
${PLATFORM_SOURCES} ${PLATFORM_SOURCES}
# The runtime tests link to internal runtime symbols, which aren't exported
# from the swiftCore dylib, so we need to link to both the runtime archive
# and the stdlib.
$<TARGET_OBJECTS:swiftRuntime${SWIFT_PRIMARY_VARIANT_SUFFIX}>
) )
# The runtime tests link to internal runtime symbols, which aren't exported
# from the swiftCore dylib, so we need to link to both the runtime archive
# and the stdlib.
# FIXME: cross-compile for all variants. # FIXME: cross-compile for all variants.
target_link_libraries(SwiftRuntimeTests target_link_libraries(SwiftRuntimeTests
swiftRuntime${SWIFT_PRIMARY_VARIANT_SUFFIX} swiftCore${SWIFT_PRIMARY_VARIANT_SUFFIX}
${PLATFORM_TARGET_LINK_LIBRARIES} ${PLATFORM_TARGET_LINK_LIBRARIES}
) )
endif() endif()