diff --git a/CMakeLists.txt b/CMakeLists.txt index 46e3aa5ee..10a0e4623 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,22 +1,38 @@ -cmake_minimum_required(VERSION 3.4.3) +cmake_minimum_required(VERSION 3.15.1) -list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules") +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() 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 @@ -28,74 +44,37 @@ 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) -dispatch_common_warnings() - -option(ENABLE_DISPATCH_INIT_CONSTRUCTOR "enable libdispatch_init as a constructor" ON) -set(USE_LIBDISPATCH_INIT_CONSTRUCTOR ${ENABLE_DISPATCH_INIT_CONSTRUCTOR}) +include(DTrace) +include(SwiftSupport) # 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(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() - - 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" "") +option(ENABLE_DISPATCH_INIT_CONSTRUCTOR "enable libdispatch_init as a constructor" ON) +set(USE_LIBDISPATCH_INIT_CONSTRUCTOR ${ENABLE_DISPATCH_INIT_CONSTRUCTOR}) -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}) +option(ENABLE_DTRACE "enable dtrace support" "") -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() +if(CMAKE_SYSTEM_NAME STREQUAL Darwin OR CMAKE_SYSTEM_NAME STREQUAL FreeBSD) set(ENABLE_INTERNAL_PTHREAD_WORKQUEUES_DEFAULT OFF) +else() + set(ENABLE_INTERNAL_PTHREAD_WORKQUEUES_DEFAULT ON) endif() option(ENABLE_INTERNAL_PTHREAD_WORKQUEUES "use libdispatch's own implementation of pthread workqueues" ${ENABLE_INTERNAL_PTHREAD_WORKQUEUES_DEFAULT}) if(ENABLE_INTERNAL_PTHREAD_WORKQUEUES) @@ -114,6 +93,15 @@ 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) @@ -144,8 +132,6 @@ 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) @@ -181,7 +167,7 @@ else() set(USE_MACH_SEM 0) endif() if(CMAKE_SYSTEM_NAME STREQUAL Windows) - add_definitions(-DUSE_WIN32_SEM) + add_compile_definitions($<$,$>:USE_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 @@ -211,7 +197,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_definitions(-D_GNU_SOURCE=1) + add_compile_definitions($<$,$>:_GNU_SOURCE=1>) endif() check_symbol_exists(__printflike "bsd/sys/cdefs.h" HAVE_PRINTFLIKE) @@ -220,24 +206,20 @@ if(CMAKE_SYSTEM_NAME STREQUAL Android) endif() if(CMAKE_SYSTEM_NAME STREQUAL FreeBSD) - add_definitions(-D_WITH_DPRINTF) + add_compile_definitions($<$,$>:_WITH_DPRINTF>) endif() -if(ENABLE_DTRACE STREQUAL "") +if(ENABLE_DTRACE) find_program(dtrace_EXECUTABLE dtrace) - 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) + if(NOT dtrace_EXECUTABLE AND NOT ENABLE_DTRACE STREQUAL "") message(FATAL_ERROR "dtrace not found but explicitly requested") endif() - add_definitions(-DDISPATCH_USE_DTRACE=1) +endif() + +if(dtrace_EXECUTABLE) + add_compile_definitions($<$,$>:DISPATCH_USE_DTRACE=1>) else() - add_definitions(-DDISPATCH_USE_DTRACE=0) + add_compile_definitions($<$,$>:DISPATCH_USE_DTRACE=0>) endif() find_program(leaks_EXECUTABLE leaks) @@ -245,6 +227,7 @@ if(leaks_EXECUTABLE) set(HAVE_LEAKS TRUE) endif() + if(CMAKE_SYSTEM_NAME STREQUAL Darwin) add_custom_command(OUTPUT "${PROJECT_SOURCE_DIR}/dispatch/module.modulemap" @@ -266,19 +249,25 @@ 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_definitions(-DHAVE_CONFIG_H) +add_compile_definitions($<$,$>:HAVE_CONFIG_H>) -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}) + +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") endif() + add_subdirectory(dispatch) add_subdirectory(man) add_subdirectory(os) @@ -287,4 +276,3 @@ add_subdirectory(src) if(BUILD_TESTING) add_subdirectory(tests) endif() - diff --git a/cmake/modules/DispatchCompilerWarnings.cmake b/cmake/modules/DispatchCompilerWarnings.cmake index d568c721a..6ef9d3164 100644 --- a/cmake/modules/DispatchCompilerWarnings.cmake +++ b/cmake/modules/DispatchCompilerWarnings.cmake @@ -1,79 +1,75 @@ if("${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC") # TODO: someone needs to provide the msvc equivalent warning flags - macro(dispatch_common_warnings) - endmacro() else() - macro(dispatch_common_warnings) - add_compile_options(-Werror) - add_compile_options(-Wall) - add_compile_options(-Wextra) + 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) - endmacro() + 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>) endif() diff --git a/cmake/modules/SwiftSupport.cmake b/cmake/modules/SwiftSupport.cmake index da7a201e3..4310b54c9 100644 --- a/cmake/modules/SwiftSupport.cmake +++ b/cmake/modules/SwiftSupport.cmake @@ -1,221 +1,4 @@ -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 58419d430..120798711 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,297 +1,165 @@ -include(CheckCCompilerFlag) -include(SwiftSupport) -include(DTrace) - -add_subdirectory(BlocksRuntime) +if(NOT CMAKE_SYSTEM_NAME STREQUAL Darwin) + add_subdirectory(BlocksRuntime) +endif() 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) - -set_target_properties(dispatch - PROPERTIES - POSITION_INDEPENDENT_CODE YES) + 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(WIN32) - target_sources(dispatch - PRIVATE - shims/generic_sys_queue.h - shims/generic_win_stubs.c - shims/generic_win_stubs.h - shims/getprogname.c) +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() + if(DISPATCH_USE_INTERNAL_WORKQUEUE) - target_sources(dispatch - PRIVATE - event/workqueue.c - event/workqueue_internal.h) + target_sources(dispatch PRIVATE + event/workqueue.c + event/workqueue_internal.h) endif() -target_sources(dispatch - PRIVATE - block.cpp) + +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}) +endif() + 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) - 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(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}) +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) 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) +if(DISPATCH_ENABLE_ASSERTS) + target_compile_definitions(dispatch PRIVATE + -DDISPATCH_DEBUG=1) 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? -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() +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) 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() -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() + add_subdirectory(swift) endif() +install(TARGETS dispatch + ARCHIVE DESTINATION ${INSTALL_TARGET_DIR} + LIBRARY DESTINATION ${INSTALL_TARGET_DIR} + RUNTIME DESTINATION bin) diff --git a/src/swift/CMakeLists.txt b/src/swift/CMakeLists.txt new file mode 100644 index 000000000..a10d969a3 --- /dev/null +++ b/src/swift/CMakeLists.txt @@ -0,0 +1,56 @@ + +# 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()