From 91c435e9de559215cca35e4085f1e5711d09a01f Mon Sep 17 00:00:00 2001 From: Mishal Shah Date: Thu, 26 Sep 2019 10:27:44 -0700 Subject: [PATCH] Revert "build: port to new Swift support" --- CMakeLists.txt | 138 ++++--- cmake/modules/DispatchCompilerWarnings.cmake | 138 +++---- cmake/modules/SwiftSupport.cmake | 217 ++++++++++ src/CMakeLists.txt | 394 +++++++++++++------ src/swift/CMakeLists.txt | 56 --- 5 files changed, 626 insertions(+), 317 deletions(-) delete mode 100644 src/swift/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 10a0e4623..46e3aa5ee 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,38 +1,22 @@ -cmake_minimum_required(VERSION 3.15.1) +cmake_minimum_required(VERSION 3.4.3) -list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules) - -# NOTE(compnerd) enable CMP0091 - select MSVC runtime based on -# CMAKE_MSVC_RUNTIME_LIBRARY. Requires CMake 3.15 or newer. -if(POLICY CMP0091) - cmake_policy(SET CMP0091 NEW) -endif() +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules") project(dispatch - VERSION 1.3 - LANGUAGES C CXX) + VERSION 1.3 + LANGUAGES C CXX) if("${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC") include(ClangClCompileRules) endif() -if(CMAKE_SYSTEM_NAME STREQUAL Windows) - include(DispatchWindowsSupport) - dispatch_windows_arch_spelling(${CMAKE_SYSTEM_PROCESSOR} DISPATCH_MSVC_ARCH) - dispatch_windows_include_for_arch(${DISPATCH_MSVC_ARCH} DISPATCH_INCLUDES) - include_directories(BEFORE SYSTEM ${DISPATCH_INCLUDES}) - dispatch_windows_lib_for_arch(${CMAKE_SYSTEM_PROCESSOR} DISPATCH_LIBDIR) - link_directories(${DISPATCH_LIBDIR}) -endif() - set(CMAKE_C_STANDARD 11) set(CMAKE_C_STANDARD_REQUIRED YES) set(CMAKE_CXX_STANDARD 11) set(CMAKE_C_VISIBILITY_PRESET hidden) -set(CMAKE_C_VISIBILITY_INLINES_HIDDEN YES) # NOTE(compnerd) this is a horrible workaround for Windows to ensure that the # tests can run as there is no rpath equivalent and `PATH` is used to lookup the @@ -44,37 +28,74 @@ set(CMAKE_THREAD_PREFER_PTHREAD TRUE) set(THREADS_PREFER_PTHREAD_FLAG TRUE) find_package(Threads REQUIRED) -include(CheckCCompilerFlag) include(CheckCSourceCompiles) include(CheckFunctionExists) include(CheckIncludeFiles) include(CheckLibraryExists) include(CheckSymbolExists) include(GNUInstallDirs) +include(SwiftSupport) include(CTest) +set(SWIFT_LIBDIR "lib" CACHE PATH "Library folder name, defined by swift main buildscript") +set(INSTALL_LIBDIR "${SWIFT_LIBDIR}" CACHE PATH "Path where the libraries should be installed") + include(DispatchAppleOptions) include(DispatchSanitization) + include(DispatchCompilerWarnings) -include(DTrace) -include(SwiftSupport) +dispatch_common_warnings() + +option(ENABLE_DISPATCH_INIT_CONSTRUCTOR "enable libdispatch_init as a constructor" ON) +set(USE_LIBDISPATCH_INIT_CONSTRUCTOR ${ENABLE_DISPATCH_INIT_CONSTRUCTOR}) # NOTE(abdulras) this is the CMake supported way to control whether we generate # shared or static libraries. This impacts the behaviour of `add_library` in # what type of library it generates. option(BUILD_SHARED_LIBS "build shared libraries" ON) -option(DISPATCH_ENABLE_ASSERTS "enable debug assertions" FALSE) +option(ENABLE_SWIFT "enable libdispatch swift overlay" OFF) +if(ENABLE_SWIFT) + if(NOT CMAKE_SWIFT_COMPILER) + message(FATAL_ERROR "CMAKE_SWIFT_COMPILER must be defined to enable swift") + endif() -option(ENABLE_DISPATCH_INIT_CONSTRUCTOR "enable libdispatch_init as a constructor" ON) -set(USE_LIBDISPATCH_INIT_CONSTRUCTOR ${ENABLE_DISPATCH_INIT_CONSTRUCTOR}) + string(TOLOWER ${CMAKE_SYSTEM_NAME} swift_os) + get_swift_host_arch(swift_arch) + + if(BUILD_SHARED_LIBS) + set(swift_dir swift) + else() + set(swift_dir swift_static) + endif() + + set(INSTALL_TARGET_DIR "${INSTALL_LIBDIR}/${swift_dir}/${swift_os}" CACHE PATH "Path where the libraries will be installed") + set(INSTALL_DISPATCH_HEADERS_DIR "${INSTALL_LIBDIR}/${swift_dir}/dispatch" CACHE PATH "Path where the headers will be installed for libdispatch") + set(INSTALL_BLOCK_HEADERS_DIR "${INSTALL_LIBDIR}/${swift_dir}/Block" CACHE PATH "Path where the headers will be installed for the blocks runtime") + set(INSTALL_OS_HEADERS_DIR "${INSTALL_LIBDIR}/${swift_dir}/os" CACHE PATH "Path where the os/ headers will be installed") +endif() + +if(NOT ENABLE_SWIFT) + set(INSTALL_TARGET_DIR "${INSTALL_LIBDIR}" CACHE PATH "Path where the libraries will be installed") + set(INSTALL_DISPATCH_HEADERS_DIR "include/dispatch" CACHE PATH "Path where the headers will be installed") + set(INSTALL_BLOCK_HEADERS_DIR "include" CACHE PATH "Path where the headers will be installed for the blocks runtime") + set(INSTALL_OS_HEADERS_DIR "include/os" CACHE PATH "Path where the headers will be installed") +endif() + +option(DISPATCH_ENABLE_ASSERTS "enable debug assertions" FALSE) option(ENABLE_DTRACE "enable dtrace support" "") -if(CMAKE_SYSTEM_NAME STREQUAL Darwin OR CMAKE_SYSTEM_NAME STREQUAL FreeBSD) - set(ENABLE_INTERNAL_PTHREAD_WORKQUEUES_DEFAULT OFF) -else() +option(ENABLE_THREAD_LOCAL_STORAGE "enable usage of thread local storage via _Thread_local" ON) +set(DISPATCH_USE_THREAD_LOCAL_STORAGE ${ENABLE_THREAD_LOCAL_STORAGE}) + +if(CMAKE_SYSTEM_NAME STREQUAL Linux OR + CMAKE_SYSTEM_NAME STREQUAL Android OR + CMAKE_SYSTEM_NAME STREQUAL FreeBSD OR + CMAKE_SYSTEM_NAME STREQUAL Windows) set(ENABLE_INTERNAL_PTHREAD_WORKQUEUES_DEFAULT ON) +else() + set(ENABLE_INTERNAL_PTHREAD_WORKQUEUES_DEFAULT OFF) endif() option(ENABLE_INTERNAL_PTHREAD_WORKQUEUES "use libdispatch's own implementation of pthread workqueues" ${ENABLE_INTERNAL_PTHREAD_WORKQUEUES_DEFAULT}) if(ENABLE_INTERNAL_PTHREAD_WORKQUEUES) @@ -93,15 +114,6 @@ endif() option(INSTALL_PRIVATE_HEADERS "installs private headers in the same location as the public ones" OFF) -option(ENABLE_SWIFT "enable libdispatch swift overlay" OFF) -if(ENABLE_SWIFT) - enable_language(Swift) -endif() - -option(ENABLE_THREAD_LOCAL_STORAGE "enable usage of thread local storage via _Thread_local" ON) -set(DISPATCH_USE_THREAD_LOCAL_STORAGE ${ENABLE_THREAD_LOCAL_STORAGE}) - - check_symbol_exists(__GNU_LIBRARY__ "features.h" _GNU_SOURCE) if(_GNU_SOURCE) set(CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} -D_GNU_SOURCE) @@ -132,6 +144,8 @@ check_function_exists(strlcpy HAVE_STRLCPY) check_function_exists(sysconf HAVE_SYSCONF) check_function_exists(arc4random HAVE_ARC4RANDOM) +find_package(Threads REQUIRED) + check_include_files("TargetConditionals.h" HAVE_TARGETCONDITIONALS_H) check_include_files("dlfcn.h" HAVE_DLFCN_H) check_include_files("fcntl.h" HAVE_FCNTL_H) @@ -167,7 +181,7 @@ else() set(USE_MACH_SEM 0) endif() if(CMAKE_SYSTEM_NAME STREQUAL Windows) - add_compile_definitions($<$,$>:USE_WIN32_SEM>) + add_definitions(-DUSE_WIN32_SEM) endif() check_library_exists(pthread sem_init "" USE_POSIX_SEM) # NOTE: android has not always provided a libpthread, but uses the pthreads API @@ -197,7 +211,7 @@ check_symbol_exists(VQ_FREE_SPACE_CHANGE "sys/mount.h" HAVE_DECL_VQ_FREE_SPACE_C check_symbol_exists(strlcpy "string.h" HAVE_STRLCPY) check_symbol_exists(program_invocation_name "errno.h" HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME) if (HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME) - add_compile_definitions($<$,$>:_GNU_SOURCE=1>) + add_definitions(-D_GNU_SOURCE=1) endif() check_symbol_exists(__printflike "bsd/sys/cdefs.h" HAVE_PRINTFLIKE) @@ -206,20 +220,24 @@ if(CMAKE_SYSTEM_NAME STREQUAL Android) endif() if(CMAKE_SYSTEM_NAME STREQUAL FreeBSD) - add_compile_definitions($<$,$>:_WITH_DPRINTF>) + add_definitions(-D_WITH_DPRINTF) endif() -if(ENABLE_DTRACE) +if(ENABLE_DTRACE STREQUAL "") find_program(dtrace_EXECUTABLE dtrace) - if(NOT dtrace_EXECUTABLE AND NOT ENABLE_DTRACE STREQUAL "") + if(dtrace_EXECUTABLE) + add_definitions(-DDISPATCH_USE_DTRACE=1) + else() + add_definitions(-DDISPATCH_USE_DTRACE=0) + endif() +elseif(ENABLE_DTRACE) + find_program(dtrace_EXECUTABLE dtrace) + if(NOT dtrace_EXECUTABLE) message(FATAL_ERROR "dtrace not found but explicitly requested") endif() -endif() - -if(dtrace_EXECUTABLE) - add_compile_definitions($<$,$>:DISPATCH_USE_DTRACE=1>) + add_definitions(-DDISPATCH_USE_DTRACE=1) else() - add_compile_definitions($<$,$>:DISPATCH_USE_DTRACE=0>) + add_definitions(-DDISPATCH_USE_DTRACE=0) endif() find_program(leaks_EXECUTABLE leaks) @@ -227,7 +245,6 @@ if(leaks_EXECUTABLE) set(HAVE_LEAKS TRUE) endif() - if(CMAKE_SYSTEM_NAME STREQUAL Darwin) add_custom_command(OUTPUT "${PROJECT_SOURCE_DIR}/dispatch/module.modulemap" @@ -249,25 +266,19 @@ add_custom_target(module-maps ALL DEPENDS "${PROJECT_SOURCE_DIR}/dispatch/module.modulemap" "${PROJECT_SOURCE_DIR}/private/module.modulemap") - configure_file("${PROJECT_SOURCE_DIR}/cmake/config.h.in" "${PROJECT_BINARY_DIR}/config/config_ac.h") -add_compile_definitions($<$,$>:HAVE_CONFIG_H>) +add_definitions(-DHAVE_CONFIG_H) - -if(ENABLE_SWIFT) - set(INSTALL_TARGET_DIR "${CMAKE_INSTALL_LIBDIR}/swift$<$>:_static>/$" CACHE PATH "Path where the libraries will be installed") - set(INSTALL_DISPATCH_HEADERS_DIR "${CMAKE_INSTALL_LIBDIR}/swift$<$>:_static>/dispatch" CACHE PATH "Path where the headers will be installed for libdispatch") - set(INSTALL_BLOCK_HEADERS_DIR "${CMAKE_INSTALL_LIBDIR}/swift$<$>:_static>/Block" CACHE PATH "Path where the headers will be installed for the blocks runtime") - set(INSTALL_OS_HEADERS_DIR "${CMAKE_INSTALL_LIBDIR}/swift$<$>:_static>/os" CACHE PATH "Path where the os/ headers will be installed") -else() - set(INSTALL_TARGET_DIR "${CMAKE_INSTALL_LIBDIR}" CACHE PATH "Path where the libraries will be installed") - set(INSTALL_DISPATCH_HEADERS_DIR "include/dispatch" CACHE PATH "Path where the headers will be installed") - set(INSTALL_BLOCK_HEADERS_DIR "include" CACHE PATH "Path where the headers will be installed for the blocks runtime") - set(INSTALL_OS_HEADERS_DIR "include/os" CACHE PATH "Path where the headers will be installed") +if(CMAKE_SYSTEM_NAME STREQUAL Windows) + include(DispatchWindowsSupport) + dispatch_windows_arch_spelling(${CMAKE_SYSTEM_PROCESSOR} DISPATCH_MSVC_ARCH) + dispatch_windows_include_for_arch(${DISPATCH_MSVC_ARCH} DISPATCH_INCLUDES) + include_directories(BEFORE SYSTEM ${DISPATCH_INCLUDES}) + dispatch_windows_lib_for_arch(${CMAKE_SYSTEM_PROCESSOR} DISPATCH_LIBDIR) + link_directories(${DISPATCH_LIBDIR}) endif() - add_subdirectory(dispatch) add_subdirectory(man) add_subdirectory(os) @@ -276,3 +287,4 @@ add_subdirectory(src) if(BUILD_TESTING) add_subdirectory(tests) endif() + diff --git a/cmake/modules/DispatchCompilerWarnings.cmake b/cmake/modules/DispatchCompilerWarnings.cmake index 6ef9d3164..d568c721a 100644 --- a/cmake/modules/DispatchCompilerWarnings.cmake +++ b/cmake/modules/DispatchCompilerWarnings.cmake @@ -1,75 +1,79 @@ if("${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC") # TODO: someone needs to provide the msvc equivalent warning flags + macro(dispatch_common_warnings) + endmacro() else() - add_compile_options($<$,$>:-Werror>) - add_compile_options($<$,$>:-Wall>) - add_compile_options($<$,$>:-Wextra>) + macro(dispatch_common_warnings) + add_compile_options(-Werror) + add_compile_options(-Wall) + add_compile_options(-Wextra) - add_compile_options($<$,$>:-Warray-bounds-pointer-arithmetic>) - add_compile_options($<$,$>:-Wassign-enum>) - add_compile_options($<$,$>:-Watomic-properties>) - add_compile_options($<$,$>:-Wcomma>) - add_compile_options($<$,$>:-Wconditional-uninitialized>) - add_compile_options($<$,$>:-Wconversion>) - add_compile_options($<$,$>:-Wcovered-switch-default>) - add_compile_options($<$,$>:-Wdate-time>) - add_compile_options($<$,$>:-Wdeprecated>) - add_compile_options($<$,$>:-Wdocumentation>) - add_compile_options($<$,$>:-Wdouble-promotion>) - add_compile_options($<$,$>:-Wduplicate-enum>) - add_compile_options($<$,$>:-Wexpansion-to-defined>) - add_compile_options($<$,$>:-Wfloat-equal>) - add_compile_options($<$,$>:-Widiomatic-parentheses>) - add_compile_options($<$,$>:-Winfinite-recursion>) - add_compile_options($<$,$>:-Wmissing-prototypes>) - add_compile_options($<$,$>:-Wnewline-eof>) - add_compile_options($<$,$>:-Wnullable-to-nonnull-conversion>) - add_compile_options($<$,$>:-Wobjc-interface-ivars>) - add_compile_options($<$,$>:-Wover-aligned>) - add_compile_options($<$,$>:-Wpacked>) - add_compile_options($<$,$>:-Wpointer-arith>) - add_compile_options($<$,$>:-Wselector>) - add_compile_options($<$,$>:-Wshadow>) - add_compile_options($<$,$>:-Wshorten-64-to-32>) - add_compile_options($<$,$>:-Wsign-conversion>) - add_compile_options($<$,$>:-Wstatic-in-inline>) - add_compile_options($<$,$>:-Wsuper-class-method-mismatch>) - add_compile_options($<$,$>:-Wswitch>) - add_compile_options($<$,$>:-Wunguarded-availability>) - add_compile_options($<$,$>:-Wunreachable-code>) - add_compile_options($<$,$>:-Wunused>) + add_compile_options(-Warray-bounds-pointer-arithmetic) + add_compile_options(-Wassign-enum) + add_compile_options(-Watomic-properties) + add_compile_options(-Wcomma) + add_compile_options(-Wconditional-uninitialized) + add_compile_options(-Wconversion) + add_compile_options(-Wcovered-switch-default) + add_compile_options(-Wdate-time) + add_compile_options(-Wdeprecated) + add_compile_options(-Wdocumentation) + add_compile_options(-Wdouble-promotion) + add_compile_options(-Wduplicate-enum) + add_compile_options(-Wexpansion-to-defined) + add_compile_options(-Wfloat-equal) + add_compile_options(-Widiomatic-parentheses) + add_compile_options(-Winfinite-recursion) + add_compile_options(-Wmissing-prototypes) + add_compile_options(-Wnewline-eof) + add_compile_options(-Wnullable-to-nonnull-conversion) + add_compile_options(-Wobjc-interface-ivars) + add_compile_options(-Wover-aligned) + add_compile_options(-Wpacked) + add_compile_options(-Wpointer-arith) + add_compile_options(-Wselector) + add_compile_options(-Wshadow) + add_compile_options(-Wshorten-64-to-32) + add_compile_options(-Wsign-conversion) + add_compile_options(-Wstatic-in-inline) + add_compile_options(-Wsuper-class-method-mismatch) + add_compile_options(-Wswitch) + add_compile_options(-Wunguarded-availability) + add_compile_options(-Wunreachable-code) + add_compile_options(-Wunused) - add_compile_options($<$,$>:-Wno-unknown-warning-option>) - add_compile_options($<$,$>:-Wno-trigraphs>) - add_compile_options($<$,$>:-Wno-four-char-constants>) - add_compile_options($<$,$>:-Wno-disabled-macro-expansion>) - add_compile_options($<$,$>:-Wno-pedantic>) - add_compile_options($<$,$>:-Wno-bad-function-cast>) - add_compile_options($<$,$>:-Wno-c++-compat>) - add_compile_options($<$,$>:-Wno-c++98-compat>) - add_compile_options($<$,$>:-Wno-c++98-compat-pedantic>) - add_compile_options($<$,$>:-Wno-cast-align>) - add_compile_options($<$,$>:-Wno-cast-qual>) - add_compile_options($<$,$>:-Wno-documentation-unknown-command>) - add_compile_options($<$,$>:-Wno-format-nonliteral>) - add_compile_options($<$,$>:-Wno-missing-variable-declarations>) - add_compile_options($<$,$>:-Wno-old-style-cast>) - add_compile_options($<$,$>:-Wno-padded>) - add_compile_options($<$,$>:-Wno-reserved-id-macro>) - add_compile_options($<$,$>:-Wno-shift-sign-overflow>) - add_compile_options($<$,$>:-Wno-undef>) - add_compile_options($<$,$>:-Wno-unreachable-code-aggressive>) - add_compile_options($<$,$>:-Wno-unused-macros>) - add_compile_options($<$,$>:-Wno-used-but-marked-unused>) - add_compile_options($<$,$>:-Wno-vla>) + add_compile_options(-Wno-unknown-warning-option) + add_compile_options(-Wno-trigraphs) + add_compile_options(-Wno-four-char-constants) + add_compile_options(-Wno-disabled-macro-expansion) + add_compile_options(-Wno-pedantic) + add_compile_options(-Wno-bad-function-cast) + add_compile_options(-Wno-c++-compat) + add_compile_options(-Wno-c++98-compat) + add_compile_options(-Wno-c++98-compat-pedantic) + add_compile_options(-Wno-cast-align) + add_compile_options(-Wno-cast-qual) + add_compile_options(-Wno-documentation-unknown-command) + add_compile_options(-Wno-format-nonliteral) + add_compile_options(-Wno-missing-variable-declarations) + add_compile_options(-Wno-old-style-cast) + add_compile_options(-Wno-padded) + add_compile_options(-Wno-reserved-id-macro) + add_compile_options(-Wno-shift-sign-overflow) + add_compile_options(-Wno-undef) + add_compile_options(-Wno-unreachable-code-aggressive) + add_compile_options(-Wno-unused-macros) + add_compile_options(-Wno-used-but-marked-unused) + add_compile_options(-Wno-vla) - if(CMAKE_SYSTEM_NAME STREQUAL Android) - add_compile_options($<$,$>:-Wno-incompatible-function-pointer-types>) - add_compile_options($<$,$>:-Wno-implicit-function-declaration>) - add_compile_options($<$,$>:-Wno-conversion>) - add_compile_options($<$,$>:-Wno-int-conversion>) - add_compile_options($<$,$>:-Wno-shorten-64-to-32>) - endif() - add_compile_options($<$,$>:-Wno-error=assign-enum>) + if(CMAKE_SYSTEM_NAME STREQUAL Android) + add_compile_options(-Wno-incompatible-function-pointer-types) + add_compile_options(-Wno-implicit-function-declaration) + add_compile_options(-Wno-conversion) + add_compile_options(-Wno-int-conversion) + add_compile_options(-Wno-shorten-64-to-32) + endif() + add_compile_options(-Wno-error=assign-enum) + endmacro() endif() diff --git a/cmake/modules/SwiftSupport.cmake b/cmake/modules/SwiftSupport.cmake index 4310b54c9..da7a201e3 100644 --- a/cmake/modules/SwiftSupport.cmake +++ b/cmake/modules/SwiftSupport.cmake @@ -1,4 +1,221 @@ +include(CMakeParseArguments) + +function(add_swift_target target) + set(options LIBRARY;SHARED;STATIC) + set(single_value_options MODULE_NAME;MODULE_LINK_NAME;MODULE_PATH;MODULE_CACHE_PATH;OUTPUT;TARGET) + set(multiple_value_options CFLAGS;DEPENDS;LINK_FLAGS;RESOURCES;SOURCES;SWIFT_FLAGS) + + cmake_parse_arguments(AST "${options}" "${single_value_options}" "${multiple_value_options}" ${ARGN}) + + set(compile_flags ${CMAKE_SWIFT_FLAGS}) + set(link_flags ${CMAKE_SWIFT_LINK_FLAGS}) + + if(AST_TARGET) + list(APPEND compile_flags -target;${AST_TARGET}) + list(APPEND link_flags -target;${AST_TARGET}) + endif() + if(AST_MODULE_NAME) + list(APPEND compile_flags -module-name;${AST_MODULE_NAME}) + else() + list(APPEND compile_flags -module-name;${target}) + endif() + if(AST_MODULE_LINK_NAME) + list(APPEND compile_flags -module-link-name;${AST_MODULE_LINK_NAME}) + endif() + if(AST_MODULE_CACHE_PATH) + list(APPEND compile_flags -module-cache-path;${AST_MODULE_CACHE_PATH}) + endif() + if(CMAKE_BUILD_TYPE MATCHES Debug OR CMAKE_BUILD_TYPE MATCHES RelWithDebInfo) + list(APPEND compile_flags -g) + endif() + if(AST_SWIFT_FLAGS) + foreach(flag ${AST_SWIFT_FLAGS}) + list(APPEND compile_flags ${flag}) + endforeach() + endif() + if(AST_CFLAGS) + foreach(flag ${AST_CFLAGS}) + list(APPEND compile_flags -Xcc;${flag}) + endforeach() + endif() + if(AST_LINK_FLAGS) + foreach(flag ${AST_LINK_FLAGS}) + list(APPEND link_flags ${flag}) + endforeach() + endif() + if(AST_LIBRARY) + if(AST_STATIC AND AST_SHARED) + message(SEND_ERROR "add_swift_target asked to create library as STATIC and SHARED") + elseif(AST_STATIC OR NOT BUILD_SHARED_LIBS) + set(library_kind STATIC) + elseif(AST_SHARED OR BUILD_SHARED_LIBS) + set(library_kind SHARED) + endif() + else() + if(AST_STATIC OR AST_SHARED) + message(SEND_ERROR "add_swift_target asked to create executable as STATIC or SHARED") + endif() + endif() + if(NOT AST_OUTPUT) + if(AST_LIBRARY) + if(AST_SHARED OR BUILD_SHARED_LIBS) + set(AST_OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${target}.dir/${CMAKE_SHARED_LIBRARY_PREFIX}${target}${CMAKE_SHARED_LIBRARY_SUFFIX}) + else() + set(AST_OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${target}.dir/${CMAKE_STATIC_LIBRARY_PREFIX}${target}${CMAKE_STATIC_LIBRARY_SUFFIX}) + endif() + else() + set(AST_OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${target}.dir/${target}${CMAKE_EXECUTABLE_SUFFIX}) + endif() + endif() + if(CMAKE_SYSTEM_NAME STREQUAL Windows) + if(AST_SHARED OR BUILD_SHARED_LIBS) + set(IMPORT_LIBRARY ${CMAKE_CURRENT_BINARY_DIR}/${target}.dir/${CMAKE_IMPORT_LIBRARY_PREFIX}${target}${CMAKE_IMPORT_LIBRARY_SUFFIX}) + endif() + endif() + + set(sources) + foreach(source ${AST_SOURCES}) + get_filename_component(location ${source} PATH) + if(IS_ABSOLUTE ${location}) + list(APPEND sources ${source}) + else() + list(APPEND sources ${CMAKE_CURRENT_SOURCE_DIR}/${source}) + endif() + endforeach() + + set(objs) + set(mods) + set(docs) + set(i 0) + foreach(source ${sources}) + get_filename_component(name ${source} NAME) + + set(obj ${CMAKE_CURRENT_BINARY_DIR}/${target}.dir/${name}${CMAKE_C_OUTPUT_EXTENSION}) + set(mod ${CMAKE_CURRENT_BINARY_DIR}/${target}.dir/${name}.swiftmodule) + set(doc ${CMAKE_CURRENT_BINARY_DIR}/${target}.dir/${name}.swiftdoc) + + set(all_sources ${sources}) + list(INSERT all_sources ${i} -primary-file) + + add_custom_command(OUTPUT + ${obj} + ${mod} + ${doc} + DEPENDS + ${source} + ${AST_DEPENDS} + COMMAND + ${CMAKE_SWIFT_COMPILER} -frontend ${compile_flags} -emit-module-path ${mod} -emit-module-doc-path ${doc} -o ${obj} -c ${all_sources}) + + list(APPEND objs ${obj}) + list(APPEND mods ${mod}) + list(APPEND docs ${doc}) + + math(EXPR i "${i}+1") + endforeach() + + if(AST_LIBRARY) + get_filename_component(module_directory ${AST_MODULE_PATH} DIRECTORY) + + set(module ${AST_MODULE_PATH}) + set(documentation ${module_directory}/${AST_MODULE_NAME}.swiftdoc) + + add_custom_command(OUTPUT + ${module} + ${documentation} + DEPENDS + ${mods} + ${docs} + ${AST_DEPENDS} + COMMAND + ${CMAKE_SWIFT_COMPILER} -frontend ${compile_flags} -sil-merge-partial-modules -emit-module ${mods} -o ${module} -emit-module-doc-path ${documentation}) + endif() + + if(AST_LIBRARY) + if(CMAKE_SYSTEM_NAME STREQUAL Windows OR CMAKE_SYSTEM_NAME STREQUAL Darwin) + set(emit_library -emit-library) + else() + set(emit_library -emit-library -Xlinker -soname -Xlinker ${CMAKE_SHARED_LIBRARY_PREFIX}${target}${CMAKE_SHARED_LIBRARY_SUFFIX}) + endif() + endif() + if(NOT AST_LIBRARY OR library_kind STREQUAL SHARED) + add_custom_command(OUTPUT + ${AST_OUTPUT} + DEPENDS + ${objs} + ${AST_DEPENDS} + COMMAND + ${CMAKE_SWIFT_COMPILER} ${emit_library} ${link_flags} -o ${AST_OUTPUT} ${objs}) + add_custom_target(${target} + ALL + DEPENDS + ${AST_OUTPUT} + ${module} + ${documentation}) + else() + add_library(${target}-static STATIC ${objs}) + add_dependencies(${target}-static ${AST_DEPENDS}) + get_filename_component(ast_output_bn ${AST_OUTPUT} NAME) + if(NOT CMAKE_STATIC_LIBRARY_PREFIX STREQUAL "") + string(REGEX REPLACE "^${CMAKE_STATIC_LIBRARY_PREFIX}" "" ast_output_bn ${ast_output_bn}) + endif() + if(NOT CMAKE_STATIC_LIBRARY_SUFFIX STREQUAL "") + string(REGEX REPLACE "${CMAKE_STATIC_LIBRARY_SUFFIX}$" "" ast_output_bn ${ast_output_bn}) + endif() + get_filename_component(ast_output_dn ${AST_OUTPUT} DIRECTORY) + set_target_properties(${target}-static + PROPERTIES + LINKER_LANGUAGE C + ARCHIVE_OUTPUT_DIRECTORY ${ast_output_dn} + OUTPUT_DIRECTORY ${ast_output_dn} + OUTPUT_NAME ${ast_output_bn}) + add_custom_target(${target} + ALL + DEPENDS + ${target}-static + ${module} + ${documentation}) + endif() + + if(AST_RESOURCES) + add_custom_command(TARGET + ${target} + POST_BUILD + COMMAND + ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/${target} + COMMAND + ${CMAKE_COMMAND} -E copy ${AST_OUTPUT} ${CMAKE_CURRENT_BINARY_DIR}/${target} + COMMAND + ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/${target}/Resources + COMMAND + ${CMAKE_COMMAND} -E copy ${AST_RESOURCES} ${CMAKE_CURRENT_BINARY_DIR}/${target}/Resources) + else() + add_custom_command(TARGET + ${target} + POST_BUILD + COMMAND + ${CMAKE_COMMAND} -E copy ${AST_OUTPUT} ${CMAKE_CURRENT_BINARY_DIR}) + if(CMAKE_SYSTEM_NAME STREQUAL Windows) + if(AST_SHARED OR BUILD_SHARED_LIBS) + add_custom_command(TARGET + ${target} + POST_BUILD + COMMAND + ${CMAKE_COMMAND} -E copy ${IMPORT_LIBRARY} ${CMAKE_CURRENT_BINARY_DIR}) + endif() + endif() + endif() +endfunction() + +function(add_swift_library library) + add_swift_target(${library} LIBRARY ${ARGN}) +endfunction() + +function(add_swift_executable executable) + add_swift_target(${executable} ${ARGN}) +endfunction() + # Returns the current achitecture name in a variable # # Usage: diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 120798711..58419d430 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,165 +1,297 @@ +include(CheckCCompilerFlag) -if(NOT CMAKE_SYSTEM_NAME STREQUAL Darwin) - add_subdirectory(BlocksRuntime) -endif() +include(SwiftSupport) +include(DTrace) + +add_subdirectory(BlocksRuntime) add_library(dispatch - allocator.c - apply.c - benchmark.c - data.c - init.c - introspection.c - io.c - mach.c - object.c - once.c - queue.c - semaphore.c - source.c - time.c - transform.c - voucher.c - shims.c - protocol.defs - provider.d - allocator_internal.h - data_internal.h - inline_internal.h - internal.h - introspection_internal.h - io_internal.h - mach_internal.h - object_internal.h - queue_internal.h - semaphore_internal.h - shims.h - source_internal.h - trace.h - voucher_internal.h - event/event.c - event/event_config.h - event/event_epoll.c - event/event_internal.h - event/event_kevent.c - event/event_windows.c - firehose/firehose_internal.h - shims/android_stubs.h - shims/atomic.h - shims/atomic_sfb.h - shims/getprogname.h - shims/hw_config.h - shims/lock.c - shims/lock.h - shims/perfmon.h - shims/time.h - shims/tsd.h - shims/yield.c - shims/yield.h) + allocator.c + apply.c + benchmark.c + data.c + init.c + introspection.c + io.c + mach.c + object.c + once.c + queue.c + semaphore.c + source.c + time.c + transform.c + voucher.c + shims.c + protocol.defs + provider.d + allocator_internal.h + data_internal.h + inline_internal.h + internal.h + introspection_internal.h + io_internal.h + mach_internal.h + object_internal.h + queue_internal.h + semaphore_internal.h + shims.h + source_internal.h + trace.h + voucher_internal.h + event/event.c + event/event_config.h + event/event_epoll.c + event/event_internal.h + event/event_kevent.c + event/event_windows.c + firehose/firehose_internal.h + shims/android_stubs.h + shims/atomic.h + shims/atomic_sfb.h + shims/getprogname.h + shims/hw_config.h + shims/lock.c + shims/lock.h + shims/perfmon.h + shims/time.h + shims/tsd.h + shims/yield.c + shims/yield.h) -if(CMAKE_SYSTEM_NAME STREQUAL Windows) - target_sources(dispatch PRIVATE - shims/generic_sys_queue.h - shims/generic_win_stubs.c - shims/generic_win_stubs.h - shims/getprogname.c) -endif() +set_target_properties(dispatch + PROPERTIES + POSITION_INDEPENDENT_CODE YES) -if(DISPATCH_USE_INTERNAL_WORKQUEUE) - target_sources(dispatch PRIVATE - event/workqueue.c - event/workqueue_internal.h) +if(WIN32) + target_sources(dispatch + PRIVATE + shims/generic_sys_queue.h + shims/generic_win_stubs.c + shims/generic_win_stubs.h + shims/getprogname.c) endif() - -target_sources(dispatch PRIVATE - block.cpp) - -if(ENABLE_DTRACE) - dtrace_usdt_probe(${CMAKE_CURRENT_SOURCE_DIR}/provider.d OUTPUT_SOURCES - dispatch_dtrace_provider_headers) - target_sources(dispatch PRIVATE - ${dispatch_dtrace_provider_headers}) +if(DISPATCH_USE_INTERNAL_WORKQUEUE) + target_sources(dispatch + PRIVATE + event/workqueue.c + event/workqueue_internal.h) endif() - +target_sources(dispatch + PRIVATE + block.cpp) if(HAVE_OBJC) # TODO(compnerd) split DispatchStubs.cc into a separate component for the ObjC # registration and a separate component for the swift compiler's emission of a # call to the ObjC autorelease elision entry point. - target_sources(dispatch PRIVATE - data.m - object.m - swift/DispatchStubs.cc) + target_sources(dispatch + PRIVATE + data.m + object.m + swift/DispatchStubs.cc) endif() +if(ENABLE_SWIFT) + set(swift_optimization_flags) + if(NOT CMAKE_BUILD_TYPE MATCHES Debug) + set(swift_optimization_flags -O) + endif() + # NOTE(compnerd) Today regardless of whether or not ObjC interop is enabled, + # swift will use an autoreleased return value convention for certain CF + # functions (including some that are used/related to dispatch). This means + # that the swift compiler in callers to such functions will call the function, + # and then pass the result of the function to + # objc_retainAutoreleasedReturnValue. In a context where we have ObjC interop + # disabled, we do not have access to the objc runtime so an implementation of + # objc_retainAutoreleasedReturnValue is not available. To work around this, we + # provide a shim for objc_retainAutoreleasedReturnValue in DispatchStubs.cc + # that just calls retain on the object. Once we fix the swift compiler to + # switch to a different model for handling these arguments with objc-interop + # disabled these shims can be eliminated. + add_library(DispatchStubs + STATIC + swift/DispatchStubs.cc) + target_include_directories(DispatchStubs + PRIVATE + ${PROJECT_SOURCE_DIR}) + set_target_properties(DispatchStubs + PROPERTIES + POSITION_INDEPENDENT_CODE YES) -set_target_properties(dispatch PROPERTIES - POSITION_INDEPENDENT_CODE YES) - -target_include_directories(dispatch PRIVATE - ${PROJECT_BINARY_DIR} - ${PROJECT_SOURCE_DIR} - ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_BINARY_DIR} - ${PROJECT_SOURCE_DIR}/private) -target_include_directories(dispatch SYSTEM BEFORE PRIVATE - "${BlocksRuntime_INCLUDE_DIR}") - -if(CMAKE_SYSTEM_NAME STREQUAL Windows) - target_compile_definitions(dispatch PRIVATE - _CRT_NONSTDC_NO_WARNINGS - _CRT_SECURE_NO_WARNINGS) -elseif(CMAKE_SYSTEM_NAME STREQUAL Android) - target_compile_definitions(dispatch PRIVATE - -U_GNU_SOURCE) + add_swift_library(swiftDispatch + CFLAGS + -fblocks + -fmodule-map-file=${PROJECT_SOURCE_DIR}/dispatch/module.modulemap + DEPENDS + module-maps + DispatchStubs + LINK_FLAGS + -L $ + -lDispatchStubs + -L $ + -lBlocksRuntime + -L $ + -ldispatch + $<$,$>:-lmsvcrtd> + $<$,$>>:-lmsvcrt> + MODULE_NAME + Dispatch + MODULE_LINK_NAME + swiftDispatch + MODULE_PATH + ${CMAKE_CURRENT_BINARY_DIR}/swift/Dispatch.swiftmodule + SOURCES + swift/Block.swift + swift/Data.swift + swift/Dispatch.swift + swift/IO.swift + swift/Private.swift + swift/Queue.swift + swift/Source.swift + swift/Time.swift + swift/Wrapper.swift + SWIFT_FLAGS + -I ${PROJECT_SOURCE_DIR} + ${swift_optimization_flags} + $<$:-Xcc> + $<$:-D_MT> + # TODO(compnerd) handle /MT builds + $<$:-Xcc> + $<$:-D_DLL> + TARGET + ${CMAKE_SWIFT_COMPILER_TARGET}) endif() -if(DISPATCH_ENABLE_ASSERTS) - target_compile_definitions(dispatch PRIVATE - -DDISPATCH_DEBUG=1) +if(ENABLE_DTRACE) + dtrace_usdt_probe(${CMAKE_CURRENT_SOURCE_DIR}/provider.d + OUTPUT_SOURCES + dispatch_dtrace_provider_headers) + target_sources(dispatch + PRIVATE + ${dispatch_dtrace_provider_headers}) +endif() +target_include_directories(dispatch + PRIVATE + ${PROJECT_BINARY_DIR} + ${PROJECT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_BINARY_DIR} + ${PROJECT_SOURCE_DIR}/private) +target_include_directories(dispatch + SYSTEM BEFORE PRIVATE + "${BlocksRuntime_INCLUDE_DIR}") +if(WIN32) + target_compile_definitions(dispatch + PRIVATE + _CRT_NONSTDC_NO_WARNINGS) endif() - if("${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC") target_compile_options(dispatch PRIVATE /EHs-c-) - target_compile_options(dispatch PRIVATE /W3) else() target_compile_options(dispatch PRIVATE -fno-exceptions) - target_compile_options(dispatch PRIVATE -Wall) endif() - +if(DISPATCH_ENABLE_ASSERTS) + target_compile_definitions(dispatch + PRIVATE + -DDISPATCH_DEBUG=1) +endif() +if(CMAKE_SYSTEM_NAME STREQUAL Windows) + target_compile_definitions(dispatch + PRIVATE + -D_CRT_SECURE_NO_WARNINGS) +elseif(CMAKE_SYSTEM_NAME STREQUAL Android) + target_compile_options(dispatch + PRIVATE + -U_GNU_SOURCE) +endif() +if("${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC") + target_compile_options(dispatch + PRIVATE + /W3) +else() + target_compile_options(dispatch + PRIVATE + -Wall) +endif() # FIXME(compnerd) add check for -fblocks? -target_compile_options(dispatch PRIVATE -fblocks) - -check_c_compiler_flag("-momit-leaf-frame-pointer -Werror -Wall -O3" C_SUPPORTS_OMIT_LEAF_FRAME_POINTER) -if (C_SUPPORTS_OMIT_LEAF_FRAME_POINTER) - target_compile_options(dispatch PRIVATE -momit-leaf-frame-pointer) +if("${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC") + target_compile_options(dispatch + PRIVATE + -Xclang -fblocks) +else() + check_c_compiler_flag("-momit-leaf-frame-pointer -Werror -Wall -O3" C_SUPPORTS_OMIT_LEAF_FRAME_POINTER) + target_compile_options(dispatch PRIVATE -fblocks) + if (C_SUPPORTS_OMIT_LEAF_FRAME_POINTER) + target_compile_options(dispatch PRIVATE -momit-leaf-frame-pointer) + endif() endif() - if(LibRT_FOUND) target_link_libraries(dispatch PRIVATE RT::rt) endif() -target_link_libraries(dispatch PRIVATE - Threads::Threads - BlocksRuntime::BlocksRuntime) +target_link_libraries(dispatch + PRIVATE + Threads::Threads + BlocksRuntime::BlocksRuntime) if(CMAKE_SYSTEM_NAME STREQUAL Windows) - target_link_libraries(dispatch PRIVATE - ShLwApi - WS2_32 - WinMM - synchronization) + target_link_libraries(dispatch + PRIVATE + ShLwApi + WS2_32 + WinMM + synchronization) endif() - if(CMAKE_SYSTEM_NAME STREQUAL Darwin) - set_property(TARGET dispatch APPEND_STRING PROPERTY LINK_FLAGS - "-Xlinker -compatibility_version -Xlinker 1" - "-Xlinker -current_version -Xlinker ${VERSION}" - "-Xlinker -dead_strip" - "-Xlinker -alias_list -Xlinker ${PROJECT_SOURCE_DIR}/xcodeconfig/libdispatch.aliases") + set_property(TARGET dispatch + APPEND_STRING + PROPERTY LINK_FLAGS + "-Xlinker -compatibility_version -Xlinker 1" + "-Xlinker -current_version -Xlinker ${VERSION}" + "-Xlinker -dead_strip" + "-Xlinker -alias_list -Xlinker ${PROJECT_SOURCE_DIR}/xcodeconfig/libdispatch.aliases") endif() -if(ENABLE_SWIFT) - add_subdirectory(swift) -endif() - -install(TARGETS dispatch +install(TARGETS + dispatch ARCHIVE DESTINATION ${INSTALL_TARGET_DIR} LIBRARY DESTINATION ${INSTALL_TARGET_DIR} RUNTIME DESTINATION bin) + +if(ENABLE_SWIFT) + install(FILES + ${CMAKE_CURRENT_BINARY_DIR}/swift/Dispatch.swiftmodule + ${CMAKE_CURRENT_BINARY_DIR}/swift/Dispatch.swiftdoc + DESTINATION + ${INSTALL_TARGET_DIR}/${swift_arch}) + + if(BUILD_SHARED_LIBS) + set(library_kind SHARED) + else() + set(library_kind STATIC) + endif() + + set(swiftDispatch_OUTPUT_FILE + ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_${library_kind}_LIBRARY_PREFIX}swiftDispatch${CMAKE_${library_kind}_LIBRARY_SUFFIX}) + + if(CMAKE_SYSTEM_NAME STREQUAL Windows AND BUILD_SHARED_LIBS) + install(FILES + ${swiftDispatch_OUTPUT_FILE} + DESTINATION + bin) + install(FILES + ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_IMPORT_LIBRARY_PREFIX}swiftDispatch${CMAKE_IMPORT_LIBRARY_SUFFIX} + DESTINATION + ${INSTALL_TARGET_DIR}) + else() + install(FILES + ${swiftDispatch_OUTPUT_FILE} + DESTINATION + ${INSTALL_TARGET_DIR}) + endif() + + if(NOT BUILD_SHARED_LIBS) + install(FILES + $ + DESTINATION + ${INSTALL_TARGET_DIR}) + endif() +endif() + diff --git a/src/swift/CMakeLists.txt b/src/swift/CMakeLists.txt deleted file mode 100644 index a10d969a3..000000000 --- a/src/swift/CMakeLists.txt +++ /dev/null @@ -1,56 +0,0 @@ - -# NOTE(compnerd) Today regardless of whether or not ObjC interop is enabled, -# swift will use an autoreleased return value convention for certain CF -# functions (including some that are used/related to dispatch). This means that -# the swift compiler in callers to such functions will call the function, and -# then pass the result of the function to objc_retainAutoreleasedReturnValue. In -# a context where we have ObjC interop disabled, we do not have access to the -# objc runtime so an implementation of objc_retainAutoreleasedReturnValue is not -# available. To work around this, we provide a shim for -# objc_retainAutoreleasedReturnValue in DispatchStubs.cc that just calls retain -# on the object. Once we fix the swift compiler to switch to a different model -# for handling these arguments with objc-interop disabled these shims can be -# eliminated. -add_library(DispatchStubs STATIC - DispatchStubs.cc) -target_include_directories(DispatchStubs PRIVATE - ${PROJECT_SOURCE_DIR}) -set_target_properties(DispatchStubs PROPERTIES - POSITION_INDEPENDENT_CODE YES) - -add_library(swiftDispatch - Block.swift - Data.swift - Dispatch.swift - IO.swift - Private.swift - Queue.swift - Source.swift - Time.swift - Wrapper.swift) -target_compile_options(swiftDispatch PRIVATE - "SHELL:-Xcc -fblocks" - "SHELL:-Xcc -fmodule-map-file=${PROJECT_SOURCE_DIR}/dispatch/module.modulemap" - "SHELL:-Xcc -I${PROJECT_SOURCE_DIR}") -set_target_properties(swiftDispatch PROPERTIES - Swift_MODULE_NAME Dispatch - Swift_MODULE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/swift) -target_link_libraries(swiftDispatch PRIVATE - DispatchStubs - BlocksRuntime::BlocksRuntime - dispatch) -add_dependencies(swiftDispatch module-maps) - -get_swift_host_arch(swift_arch) -install(FILES - ${CMAKE_CURRENT_BINARY_DIR}/swift/Dispatch.swiftmodule - ${CMAKE_CURRENT_BINARY_DIR}/swift/Dispatch.swiftdoc - DESTINATION ${INSTALL_TARGET_DIR}/${swift_arch}) -install(TARGETS swiftDispatch - ARCHIVE DESTINATION ${INSTALL_TARGET_DIR} - LIBRARY DESTINATION ${INSTALL_TARGET_DIR} - RUNTIME DESTINATION bin) -if(NOT BUILD_SHARED_LIBS) - install(TARGETS DispatchStubs - DESTINATION ${INSTALL_TARGET_DIR}) -endif()