[pkg-d-commits] [ldc] 57/95: CMake: Enable building both static and shared sets of stdlibs
Matthias Klumpp
mak at moszumanska.debian.org
Thu Jul 13 20:54:00 UTC 2017
This is an automated email from the git hooks/post-receive script.
mak pushed a commit to annotated tag v1.3.0-beta1
in repository ldc.
commit c8a63ec5f26b9bf9edeb17e971a2f5134cf9ccc6
Author: Martin <noone at nowhere.com>
Date: Sun Jan 8 20:56:56 2017 +0100
CMake: Enable building both static and shared sets of stdlibs
Via `-DBUILD_SHARED_LIBS=BOTH`.
Compile the Phobos modules only once for static+shared libs.
Build a single ldc-profile-rt.a (per architecture); `-d-version=Shared`
was just copy-pasted and not needed, so no need for an extra
ldc-profile-rt-shared.a.
---
circle.yml | 2 +-
runtime/CMakeLists.txt | 363 ++++++++++++++++----------
runtime/profile-rt/DefineBuildProfileRT.cmake | 16 +-
3 files changed, 224 insertions(+), 157 deletions(-)
diff --git a/circle.yml b/circle.yml
index ea84c86..c58751c 100644
--- a/circle.yml
+++ b/circle.yml
@@ -56,7 +56,7 @@ test:
- cd build && export CC=clang && export CXX=clang++ && cmake .. && make -j3 && bin/ldc2 -version || exit 1
# Now build LDC with itself and use this second build for further testing
- - CC=clang CXX=clang++ cmake -DD_COMPILER="build/bin/ldmd2" -DLDC_INSTALL_LTOPLUGIN=ON .
+ - CC=clang CXX=clang++ cmake -DD_COMPILER="build/bin/ldmd2" -DLDC_INSTALL_LTOPLUGIN=ON -DBUILD_SHARED_LIBS=BOTH .
- make -j3
- bin/ldc2 -version || exit 1
diff --git a/runtime/CMakeLists.txt b/runtime/CMakeLists.txt
index 502ec0f..1cfe7bd 100644
--- a/runtime/CMakeLists.txt
+++ b/runtime/CMakeLists.txt
@@ -11,7 +11,7 @@ set(DMDFE_VERSION ${D_VERSION}.${DMDFE_MINOR_VERSION}.${DMDFE_PATCH_VERS
set(MULTILIB OFF CACHE BOOL "Build both 32/64 bit runtime libraries")
set(BUILD_BC_LIBS OFF CACHE BOOL "Build the runtime as LLVM bitcode libraries")
set(INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/include/d CACHE PATH "Path to install D modules to")
-set(BUILD_SHARED_LIBS OFF CACHE BOOL "Whether to build the runtime as a shared library")
+set(BUILD_SHARED_LIBS OFF CACHE STRING "Whether to build the runtime as a shared library (ON|OFF|BOTH)")
set(D_FLAGS -w CACHE STRING "Runtime build flags, separated by ;")
set(D_FLAGS_DEBUG -g;-link-debuglib CACHE STRING "Runtime build flags (debug libraries), separated by ;")
set(D_FLAGS_RELEASE -O3;-release CACHE STRING "Runtime build flags (release libraries), separated by ;")
@@ -31,17 +31,18 @@ else()
set(MULTILIB_SUFFIX 64)
endif()
-if(BUILD_SHARED_LIBS)
+set(SHARED_LIB_SUFFIX "")
+if(NOT ${BUILD_SHARED_LIBS} STREQUAL "OFF")
if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "Linux" AND
NOT ${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD" AND
NOT APPLE)
message(FATAL_ERROR "Shared libraries (BUILD_SHARED_LIBS) are only supported on Linux, macOS and FreeBSD for the time being.")
endif()
- list(APPEND D_FLAGS -relocation-model=pic)
- set(D_LIBRARY_TYPE SHARED)
-else()
- set(D_LIBRARY_TYPE STATIC)
+ # Only use the `-shared` lib suffix if static libs are generated too
+ if(NOT ${BUILD_SHARED_LIBS} STREQUAL "ON")
+ set(SHARED_LIB_SUFFIX "-shared")
+ endif()
endif()
get_directory_property(PROJECT_PARENT_DIR DIRECTORY ${PROJECT_SOURCE_DIR} PARENT_DIRECTORY)
@@ -186,8 +187,12 @@ if((${CMAKE_SYSTEM_NAME} MATCHES "Linux") OR (${CMAKE_SYSTEM_NAME} MATCHES "Free
set(MULTILIB_ADDITIONAL_INSTALL_PATH "\n \"-L-L${CMAKE_INSTALL_PREFIX}/lib${MULTILIB_SUFFIX}\",\n \"-L--no-warn-search-mismatch\",")
endif()
- if(BUILD_SHARED_LIBS)
- set(SHARED_LIBS_RPATH "\n \"-L-rpath=${CMAKE_BINARY_DIR}/lib${LIB_SUFFIX}\",")
+ if(NOT ${BUILD_SHARED_LIBS} STREQUAL "OFF")
+ if(MULTILIB)
+ set(SHARED_LIBS_RPATH "\n \"-L-rpath=${CMAKE_BINARY_DIR}/lib${LIB_SUFFIX}:${CMAKE_BINARY_DIR}/lib${MULTILIB_SUFFIX}\",")
+ else()
+ set(SHARED_LIBS_RPATH "\n \"-L-rpath=${CMAKE_BINARY_DIR}/lib${LIB_SUFFIX}\",")
+ endif()
endif()
endif()
@@ -316,16 +321,10 @@ endmacro()
macro(compile_druntime d_flags lib_suffix path_suffix outlist_o outlist_bc)
get_target_suffix("${lib_suffix}" "${path_suffix}" target_suffix)
- if(BUILD_SHARED_LIBS)
- set(shared ";-d-version=Shared")
- else()
- set(shared)
- endif()
-
foreach(f ${DRUNTIME_D})
dc(
${f}
- "${d_flags}${shared}"
+ "${d_flags}"
"${RUNTIME_DIR}"
"${target_suffix}"
${outlist_o}
@@ -369,16 +368,19 @@ function(set_common_library_properties target)
endif()
endfunction()
-# Builds a copy of druntime/Phobos from the source files gathered above. The
-# names of the added library targets are appended to outlist_targets.
-macro(build_runtime d_flags c_flags ld_flags lib_suffix path_suffix outlist_targets)
+# Builds a copy of druntime/Phobos from the specified object (bitcode) files.
+# The names of the added library targets are appended to outlist_targets.
+macro(build_runtime_libs druntime_o druntime_bc phobos2_o phobos2_bc c_flags ld_flags
+ lib_suffix path_suffix is_shared outlist_targets)
set(output_path ${CMAKE_BINARY_DIR}/lib${path_suffix})
- set(druntime_o "")
- set(druntime_bc "")
- compile_druntime("${d_flags}" "${lib_suffix}" "${path_suffix}" druntime_o druntime_bc)
+ set(library_type STATIC)
+ if("${is_shared}" STREQUAL "ON")
+ set(library_type SHARED)
+ endif()
- add_library(druntime-ldc${target_suffix} ${D_LIBRARY_TYPE}
+ get_target_suffix("${lib_suffix}" "${path_suffix}" target_suffix)
+ add_library(druntime-ldc${target_suffix} ${library_type}
${druntime_o} ${DRUNTIME_C} ${DRUNTIME_ASM})
set_target_properties(
druntime-ldc${target_suffix} PROPERTIES
@@ -395,7 +397,7 @@ macro(build_runtime d_flags c_flags ld_flags lib_suffix path_suffix outlist_targ
# libraries otherwise implicitly added by LDC to make it loadable from
# C executables.
- if(BUILD_SHARED_LIBS)
+ if("${is_shared}" STREQUAL "ON")
if(${CMAKE_SYSTEM} MATCHES "Linux")
set(dso_system_libs "m" "pthread" "rt" "dl")
else()
@@ -407,11 +409,7 @@ macro(build_runtime d_flags c_flags ld_flags lib_suffix path_suffix outlist_targ
list(APPEND ${outlist_targets} druntime-ldc${target_suffix})
if(PHOBOS2_DIR)
- set(phobos2_o "")
- set(phobos2_bc "")
- compile_phobos2("${d_flags}" "${lib_suffix}" "${path_suffix}" phobos2_o phobos2_bc)
-
- add_library(phobos2-ldc${target_suffix} ${D_LIBRARY_TYPE}
+ add_library(phobos2-ldc${target_suffix} ${library_type}
${phobos2_o} ${PHOBOS2_C})
set_target_properties(
phobos2-ldc${target_suffix} PROPERTIES
@@ -424,7 +422,7 @@ macro(build_runtime d_flags c_flags ld_flags lib_suffix path_suffix outlist_targ
)
set_common_library_properties(phobos2-ldc${target_suffix})
- if(BUILD_SHARED_LIBS)
+ if("${is_shared}" STREQUAL "ON")
# TODO: As for druntime, adapt once shared libraries are supported
# on more operating systems.
target_link_libraries(phobos2-ldc${target_suffix}
@@ -462,9 +460,45 @@ macro(build_runtime d_flags c_flags ld_flags lib_suffix path_suffix outlist_targ
endif()
endmacro()
-# Builds both a debug and a release copy of druntime/Phobos.
+# Builds a static and/or shared copy of druntime/Phobos.
+macro(build_runtime_variant d_flags c_flags ld_flags lib_suffix path_suffix outlist_targets)
+ # Only build Phobos module once. If a shared Phobos lib is generated (too),
+ # compile explicitly with `-relocation-model=pic`.
+ set(phobos2_d_flags "${d_flags}")
+ if(NOT ${BUILD_SHARED_LIBS} STREQUAL "OFF")
+ list(APPEND ${phobos2_d_flags} -relocation-model=pic)
+ endif()
+
+ set(phobos2_o "")
+ set(phobos2_bc "")
+ compile_phobos2("${phobos2_d_flags}" "${lib_suffix}" "${path_suffix}" phobos2_o phobos2_bc)
+
+ # static druntime/Phobos
+ if(NOT ${BUILD_SHARED_LIBS} STREQUAL "ON")
+ set(druntime_o "")
+ set(druntime_bc "")
+ compile_druntime("${d_flags}" "${lib_suffix}" "${path_suffix}" druntime_o druntime_bc)
+
+ build_runtime_libs("${druntime_o}" "${druntime_bc}" "${phobos2_o}" "${phobos2_bc}"
+ "${c_flags}" "${ld_flags}" "${lib_suffix}" "${path_suffix}" "OFF"
+ ${outlist_targets})
+ endif()
+ # shared druntime/Phobos
+ if(NOT ${BUILD_SHARED_LIBS} STREQUAL "OFF")
+ set(druntime_o "")
+ set(druntime_bc "")
+ compile_druntime("${d_flags};-relocation-model=pic;-d-version=Shared" "${lib_suffix}${SHARED_LIB_SUFFIX}" "${path_suffix}" druntime_o druntime_bc)
+
+ build_runtime_libs("${druntime_o}" "${druntime_bc}" "${phobos2_o}" "${phobos2_bc}"
+ "${c_flags}" "${ld_flags}" "${lib_suffix}${SHARED_LIB_SUFFIX}" "${path_suffix}" "ON"
+ ${outlist_targets})
+ endif()
+endmacro()
+
+# Builds static and/or shared pairs of debug+release copies of druntime/Phobos.
macro(build_runtime_variants d_flags c_flags ld_flags path_suffix outlist_targets)
- build_runtime(
+ # static and/or shared release druntime/Phobos
+ build_runtime_variant(
"${d_flags};${D_FLAGS};${D_FLAGS_RELEASE}"
"${c_flags}"
"${ld_flags}"
@@ -472,7 +506,8 @@ macro(build_runtime_variants d_flags c_flags ld_flags path_suffix outlist_target
"${path_suffix}"
${outlist_targets}
)
- build_runtime(
+ # static and/or shared debug druntime/Phobos
+ build_runtime_variant(
"${d_flags};${D_FLAGS};${D_FLAGS_DEBUG}"
"${c_flags}"
"${ld_flags}"
@@ -480,9 +515,15 @@ macro(build_runtime_variants d_flags c_flags ld_flags path_suffix outlist_target
"${path_suffix}"
${outlist_targets}
)
+endmacro()
+
+# Builds static and/or shared debug+release druntime/Phobos + static profile-rt.
+macro(build_all_runtime_variants d_flags c_flags ld_flags path_suffix outlist_targets)
+ build_runtime_variants("${d_flags}" "${c_flags}" "${ld_flags}" "${path_suffix}" ${outlist_targets})
if(LDC_WITH_PGO)
- build_profile_runtime("${d_flags};${D_FLAGS};${D_FLAGS_RELEASE}" "${c_flags}" "${ld_flags}" "${path_suffix}" ${outlist_targets})
+ # static profile-rt
+ build_profile_runtime("${d_flags};${D_FLAGS};${D_FLAGS_RELEASE}" "${c_flags}" "${ld_flags}" "" "${path_suffix}" ${outlist_targets})
get_target_suffix("" "${path_suffix}" target_suffix)
set_common_library_properties(ldc-profile-rt${target_suffix})
endif()
@@ -492,65 +533,75 @@ endmacro()
include(profile-rt/DefineBuildProfileRT.cmake)
#
-# Set up build targets.
+# Set up build and install targets
#
set(RT_CFLAGS "")
-# This is a bit of a mess as we need to join the two libraries together on
-# OS X before installing them. After this has run, LIBS_TO_INSTALL contains
-# a list of library "base names" to install (i.e. without the multilib suffix,
-# if any).
-set(LIBS_TO_INSTALL)
-if(BUILD_SHARED_LIBS)
- set(OSX_LIBEXT "dylib")
-else()
- set(OSX_LIBEXT "a")
-endif()
-if(MULTILIB)
- if(APPLE)
- # On OS X, build a "fat" library.
-
- # Some suffix for the target/file names of the host-native arch so
- # that they don't collide with the final combined ones.
- set(hostsuffix "${LIB_SUFFIX}${HOST_BITNESS}")
-
- set(hosttargets)
- build_runtime_variants("" "${RT_CFLAGS}" "${LD_FLAGS}" "${hostsuffix}" hosttargets)
- #build_profile_runtime ("" "${RT_CFLAGS}" "${LD_FLAGS}" "${hostsuffix}" hosttargets)
-
- set(multitargets)
- build_runtime_variants("-m${MULTILIB_SUFFIX}" "-m${MULTILIB_SUFFIX} ${RT_CFLAGS}" "-m${MULTILIB_SUFFIX} ${LD_FLAGS}" "${MULTILIB_SUFFIX}" multitargets)
- #build_profile_runtime ("-m${MULTILIB_SUFFIX}" "-m${MULTILIB_SUFFIX} ${RT_CFLAGS}" "-m${MULTILIB_SUFFIX} ${LD_FLAGS}" "${MULTILIB_SUFFIX}" multitargets)
-
- foreach(targetname ${hosttargets})
- string(REPLACE "_${hostsuffix}" "" t ${targetname})
-
- add_custom_command(
- OUTPUT ${CMAKE_BINARY_DIR}/lib${LIB_SUFFIX}/lib${t}.${OSX_LIBEXT}
- COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/lib${LIB_SUFFIX}
- COMMAND "lipo"
- ARGS ${CMAKE_BINARY_DIR}/lib${MULTILIB_SUFFIX}/lib${t}.${OSX_LIBEXT} ${CMAKE_BINARY_DIR}/lib${hostsuffix}/lib${t}.${OSX_LIBEXT} -create -output ${CMAKE_BINARY_DIR}/lib${LIB_SUFFIX}/lib${t}.${OSX_LIBEXT}
- DEPENDS ${hosttargets} ${multitargets}
- )
-
- add_custom_target(${t} ALL DEPENDS ${CMAKE_BINARY_DIR}/lib${LIB_SUFFIX}/lib${t}.${OSX_LIBEXT})
- list(APPEND LIBS_TO_INSTALL ${t})
- endforeach()
- else()
- build_runtime_variants("" "${RT_CFLAGS}" "${LD_FLAGS}" "${LIB_SUFFIX}" LIBS_TO_INSTALL)
- #build_profile_runtime ("" "${RT_CFLAGS}" "${LD_FLAGS}" "${LIB_SUFFIX}" LIBS_TO_INSTALL)
- build_runtime_variants("-m${MULTILIB_SUFFIX}" "-m${MULTILIB_SUFFIX} ${RT_CFLAGS}" "-m${MULTILIB_SUFFIX} ${LD_FLAGS}" "${MULTILIB_SUFFIX}" dummy)
- #build_profile_runtime ("-m${MULTILIB_SUFFIX}" "-m${MULTILIB_SUFFIX} ${RT_CFLAGS}" "-m${MULTILIB_SUFFIX} ${LD_FLAGS}" "${MULTILIB_SUFFIX}" dummy)
+if(APPLE AND MULTILIB)
+ # On OS X, build "fat" libraries containing code for both architectures.
+
+ # Some suffix for the target/file names of the host-native arch so
+ # that they don't collide with the final combined ones.
+ set(hostsuffix "${LIB_SUFFIX}${HOST_BITNESS}")
+
+ set(libtargets)
+ build_all_runtime_variants("" "${RT_CFLAGS}" "${LD_FLAGS}" "${hostsuffix}" libtargets)
+ build_all_runtime_variants("-m${MULTILIB_SUFFIX}" "-m${MULTILIB_SUFFIX} ${RT_CFLAGS}" "-m${MULTILIB_SUFFIX} ${LD_FLAGS}" "${MULTILIB_SUFFIX}" libtargets)
+
+ # KLUDGE: Cannot use `$<TARGET_LINKER_FILE:target>` in custom command.
+ # Set up the list of generated libs (without 'lib' prefix) to be merged manually.
+ set(libs_to_install ldc-profile-rt.a)
+ if(NOT ${BUILD_SHARED_LIBS} STREQUAL "ON")
+ list(APPEND libs_to_install druntime-ldc.a druntime-ldc-debug.a
+ phobos2-ldc.a phobos2-ldc-debug.a
+ )
+ endif()
+ if(NOT ${BUILD_SHARED_LIBS} STREQUAL "OFF")
+ set(suffix ${SHARED_LIB_SUFFIX}.dylib)
+ list(APPEND libs_to_install druntime-ldc${suffix} druntime-ldc-debug${suffix}
+ phobos2-ldc${suffix} phobos2-ldc-debug${suffix}
+ )
endif()
+
+ foreach(lib ${libs_to_install})
+ set(host_path ${CMAKE_BINARY_DIR}/lib${hostsuffix}/lib${lib})
+ set(multi_path ${CMAKE_BINARY_DIR}/lib${MULTILIB_SUFFIX}/lib${lib})
+ set(final_path ${CMAKE_BINARY_DIR}/lib${LIB_SUFFIX}/lib${lib})
+
+ add_custom_command(
+ OUTPUT ${final_path}
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/lib${LIB_SUFFIX}
+ COMMAND "lipo"
+ ARGS ${multi_path} ${host_path} -create -output ${final_path}
+ DEPENDS ${libtargets}
+ )
+
+ set(target_name "")
+ get_filename_component(target_name ${lib} NAME_WE)
+ add_custom_target(${target_name} ALL DEPENDS ${final_path})
+
+ install(FILES ${final_path}
+ DESTINATION ${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX})
+ endforeach()
else()
- build_runtime_variants("" "${RT_CFLAGS}" "${LD_FLAGS}" "${LIB_SUFFIX}" LIBS_TO_INSTALL)
- #build_profile_runtime ("" "${RT_CFLAGS}" "${LD_FLAGS}" "${LIB_SUFFIX}" LIBS_TO_INSTALL)
-endif()
+ set(libs_to_install)
+ build_all_runtime_variants("" "${RT_CFLAGS}" "${LD_FLAGS}" "${LIB_SUFFIX}" libs_to_install)
-#
-# Install target.
-#
+ # don't add multilib targets to libs_to_install
+ if(MULTILIB)
+ build_all_runtime_variants("-m${MULTILIB_SUFFIX}" "-m${MULTILIB_SUFFIX} ${RT_CFLAGS}" "-m${MULTILIB_SUFFIX} ${LD_FLAGS}" "${MULTILIB_SUFFIX}" dummy)
+ endif()
+
+ foreach(libname ${libs_to_install})
+ install(TARGETS ${libname}
+ DESTINATION ${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX})
+ if(MULTILIB)
+ install(TARGETS ${libname}_${MULTILIB_SUFFIX}
+ DESTINATION ${CMAKE_INSTALL_PREFIX}/lib${MULTILIB_SUFFIX})
+ endif()
+ endforeach()
+endif()
set(DRUNTIME_PACKAGES core etc ldc)
@@ -564,26 +615,6 @@ if(PHOBOS2_DIR)
endif()
install(FILES ${GCCBUILTINS} DESTINATION ${INCLUDE_INSTALL_DIR}/ldc)
-foreach(libname ${LIBS_TO_INSTALL})
- if(APPLE)
- install(
- FILES ${CMAKE_BINARY_DIR}/lib${LIB_SUFFIX}/lib${libname}.${OSX_LIBEXT}
- DESTINATION ${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}
- )
- else()
- install(
- TARGETS ${libname}
- DESTINATION ${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}
- )
- if(MULTILIB)
- install(
- TARGETS ${libname}_${MULTILIB_SUFFIX}
- DESTINATION ${CMAKE_INSTALL_PREFIX}/lib${MULTILIB_SUFFIX}
- )
- endif()
- endif()
-endforeach()
-
#
# Test targets.
@@ -595,50 +626,32 @@ endforeach()
# link the test runners against those. Some linker command-line magic is
# required to make sure all objects are pulled in.
-macro(append_flags_to_pull_in_all_objects lib name_suffix target_suffix output_flags)
- if(BUILD_SHARED_LIBS)
+macro(append_flags_to_pull_in_all_objects lib name_suffix target_suffix is_shared output_flags)
+ if("${is_shared}" STREQUAL "ON")
if(MSVC OR APPLE)
list(APPEND ${output_flags} "-L$<TARGET_LINKER_FILE:${lib}${target_suffix}>")
else()
- list(APPEND ${output_flags} -L--no-as-needed -L-l${lib}${name_suffix} -L--as-needed)
+ list(APPEND ${output_flags} -L--no-as-needed "-L-l${lib}${name_suffix}" -L--as-needed)
endif()
else()
if(MSVC)
# the MS linker supports /WHOLEARCHIVE since VS 2015 Update 2
- list(APPEND ${output_flags} -L/WHOLEARCHIVE:${lib}${name_suffix})
+ list(APPEND ${output_flags} "-L/WHOLEARCHIVE:${lib}${name_suffix}")
elseif(APPLE)
list(APPEND ${output_flags} "-L-Wl,-force_load,$<TARGET_LINKER_FILE:${lib}${target_suffix}>")
else()
- list(APPEND ${output_flags} -L--whole-archive -L-l${lib}${name_suffix} -L--no-whole-archive)
+ list(APPEND ${output_flags} -L--whole-archive "-L-l${lib}${name_suffix}" -L--no-whole-archive)
endif()
endif()
endmacro()
-macro(build_test_runner name_suffix path_suffix d_flags c_flags)
- set(flags "${D_FLAGS};${d_flags};-unittest")
-
- set(unittest_libs "")
- build_runtime(
- "${flags}"
- "${RT_CFLAGS} ${c_flags}"
- "${LD_FLAGS} ${c_flags}"
- "-unittest${name_suffix}"
- "${path_suffix}"
- unittest_libs
- )
-
- # Only build the unittest libraries when running the tests. Unfortunately,
- # I couldn't find an easier way to make a test depend on a CMake target than
- # just invoking the build command through the CMake executable.
- set_target_properties(${unittest_libs} PROPERTIES EXCLUDE_FROM_ALL ON EXCLUDE_FROM_DEFAULT_BUILD ON)
- foreach(l ${unittest_libs})
- add_test(build-${l} "${CMAKE_COMMAND}" --build ${CMAKE_BINARY_DIR} --target ${l})
- endforeach()
-
+# Adds test targets for a pair of druntime/Phobos test runners.
+function(build_test_runners name_suffix path_suffix is_shared)
+ set(target_suffix)
get_target_suffix("${name_suffix}" "${path_suffix}" target_suffix)
set(tmpflags "${flags}")
- append_flags_to_pull_in_all_objects("druntime-ldc-unittest" "${name_suffix}" "${target_suffix}" tmpflags)
+ append_flags_to_pull_in_all_objects("druntime-ldc-unittest" "${name_suffix}" "${target_suffix}" "${is_shared}" tmpflags)
add_test(NAME build-druntime-test-runner${target_suffix}
COMMAND ${LDC_EXE_FULL}
-of${PROJECT_BINARY_DIR}/druntime-test-runner${target_suffix}${CMAKE_EXECUTABLE_SUFFIX}
@@ -650,7 +663,7 @@ macro(build_test_runner name_suffix path_suffix d_flags c_flags)
if(PHOBOS2_DIR)
set(tmpflags "${flags}")
- append_flags_to_pull_in_all_objects("phobos2-ldc-unittest" "${name_suffix}" "${target_suffix}" tmpflags)
+ append_flags_to_pull_in_all_objects("phobos2-ldc-unittest" "${name_suffix}" "${target_suffix}" "${is_shared}" tmpflags)
set(libarg "druntime-ldc-unittest${name_suffix}")
add_test(NAME build-phobos2-test-runner${target_suffix}
COMMAND ${LDC_EXE_FULL}
@@ -662,13 +675,60 @@ macro(build_test_runner name_suffix path_suffix d_flags c_flags)
DEPENDS "build-druntime-ldc-unittest${target_suffix};build-phobos2-ldc-unittest${target_suffix}"
)
endif()
-endmacro()
+endfunction()
+
+# Generates build and test targets for a static and/or shared pair of druntime/Phobos unittests.
+function(build_test_runner_variant name_suffix path_suffix d_flags c_flags)
+ set(flags "${D_FLAGS};${d_flags};-unittest")
-build_test_runner("" "${LIB_SUFFIX}" "${D_FLAGS_RELEASE}" "")
-build_test_runner("-debug" "${LIB_SUFFIX}" "${D_FLAGS_DEBUG}" "")
+ # static and/or shared pair(s) of druntime/Phobos unittests
+ set(unittest_libs "")
+ build_runtime_variant(
+ "${flags}"
+ "${RT_CFLAGS} ${c_flags}"
+ "${LD_FLAGS} ${c_flags}"
+ "-unittest${name_suffix}"
+ "${path_suffix}"
+ unittest_libs
+ )
+
+ # Only build the unittest libraries when running the tests. Unfortunately,
+ # I couldn't find an easier way to make a test depend on a CMake target than
+ # just invoking the build command through the CMake executable.
+ set_target_properties(${unittest_libs} PROPERTIES EXCLUDE_FROM_ALL ON EXCLUDE_FROM_DEFAULT_BUILD ON)
+ foreach(l ${unittest_libs})
+ add_test(build-${l} "${CMAKE_COMMAND}" --build ${CMAKE_BINARY_DIR} --target ${l})
+
+ # Shared Phobos libraries depend on druntime (linked in).
+ # Reflect this via a CTest dependency to prevent problematic parallel builds
+ # of shared druntime, e.g., via parallel execution of tests
+ # build-druntime-ldc-unittest-shared and build-phobos2-ldc-unittest-shared.
+ if(${l} MATCHES "^phobos2-")
+ set(suffix "")
+ string(SUBSTRING ${l} 8 -1 suffix)
+ set_tests_properties(build-${l} PROPERTIES DEPENDS build-druntime-${suffix})
+ endif()
+ endforeach()
+
+ # static druntime/Phobos test runners
+ if(NOT ${BUILD_SHARED_LIBS} STREQUAL "ON")
+ build_test_runners("${name_suffix}" "${path_suffix}" "OFF")
+ endif()
+ # shared druntime/Phobos test runners
+ if(NOT ${BUILD_SHARED_LIBS} STREQUAL "OFF")
+ build_test_runners("${name_suffix}${SHARED_LIB_SUFFIX}" "${path_suffix}" "ON")
+ endif()
+endfunction()
+
+# Generates build and test targets for static and/or shared debug+release druntime/Phobos unittests.
+function(build_test_runner_variants path_suffix d_flags c_flags)
+ build_test_runner_variant("" "${path_suffix}" "${D_FLAGS_RELEASE};${d_flags}" "${c_flags}")
+ build_test_runner_variant("-debug" "${path_suffix}" "${D_FLAGS_DEBUG};${d_flags}" "${c_flags}")
+endfunction()
+
+build_test_runner_variants("${LIB_SUFFIX}" "" "")
if(MULTILIB AND ${HOST_BITNESS} EQUAL 64)
- build_test_runner("" "${MULTILIB_SUFFIX}" "${D_FLAGS_RELEASE};-m32" "-m32")
- build_test_runner("-debug" "${MULTILIB_SUFFIX}" "${D_FLAGS_DEBUG};-m32" "-m32")
+ build_test_runner_variants("${MULTILIB_SUFFIX}" "-m32" "-m32")
endif()
# Add the druntime/Phobos test runner invocations for all the different modules.
@@ -709,17 +769,32 @@ function(add_runtime_tests name_suffix path_suffix)
endif()
endfunction()
-add_runtime_tests("" "${LIB_SUFFIX}")
-add_runtime_tests("-debug" "${LIB_SUFFIX}")
+function(add_runtime_tests_variants path_suffix)
+ if(NOT ${BUILD_SHARED_LIBS} STREQUAL "ON")
+ add_runtime_tests("" "${path_suffix}")
+ add_runtime_tests("-debug" "${path_suffix}")
+ endif()
+ if(NOT ${BUILD_SHARED_LIBS} STREQUAL "OFF")
+ add_runtime_tests("${SHARED_LIB_SUFFIX}" "${path_suffix}")
+ add_runtime_tests("-debug${SHARED_LIB_SUFFIX}" "${path_suffix}")
+ endif()
+endfunction()
+
+add_runtime_tests_variants("${LIB_SUFFIX}")
if(MULTILIB AND ${HOST_BITNESS} EQUAL 64)
- add_runtime_tests("" "${MULTILIB_SUFFIX}")
- add_runtime_tests("-debug" "${MULTILIB_SUFFIX}")
+ add_runtime_tests_variants("${MULTILIB_SUFFIX}")
endif()
# Add the standalone druntime tests.
# TODO: Add test/excetions and test/init_fini.
-if(BUILD_SHARED_LIBS)
- set(druntime_path "$<TARGET_FILE:druntime-ldc>")
+if(NOT ${BUILD_SHARED_LIBS} STREQUAL "OFF")
+ if(MULTILIB AND APPLE)
+ # KLUDGE: The library target is a custom command for multilib builds (lipo),
+ # so cannot use TARGET_FILE directly. Should stash away that name instead.
+ set(druntime_path "${CMAKE_BINARY_DIR}/lib${LIB_SUFFIX}/libdruntime-ldc${SHARED_LIB_SUFFIX}.dylib")
+ else()
+ set(druntime_path "$<TARGET_FILE:druntime-ldc${SHARED_LIB_SUFFIX}>")
+ endif()
set(outdir ${PROJECT_BINARY_DIR}/druntime-test-shared)
add_test(NAME clean-druntime-test-shared
diff --git a/runtime/profile-rt/DefineBuildProfileRT.cmake b/runtime/profile-rt/DefineBuildProfileRT.cmake
index fe6128d..f26711d 100644
--- a/runtime/profile-rt/DefineBuildProfileRT.cmake
+++ b/runtime/profile-rt/DefineBuildProfileRT.cmake
@@ -68,16 +68,10 @@ if (LDC_WITH_PGO)
macro(compile_profilert_D d_flags lib_suffix path_suffix outlist_o outlist_bc)
get_target_suffix("${lib_suffix}" "${path_suffix}" target_suffix)
- if(BUILD_SHARED_LIBS)
- set(shared ";-d-version=Shared")
- else()
- set(shared)
- endif()
-
foreach(f ${LDC_PROFRT_D})
dc(
${f}
- "${d_flags}${shared}"
+ "${d_flags}"
"${PROFILERT_DIR}"
"${target_suffix}"
${outlist_o}
@@ -86,19 +80,17 @@ if (LDC_WITH_PGO)
endforeach()
endmacro()
- macro(build_profile_runtime d_flags c_flags ld_flags path_suffix outlist_targets)
- get_target_suffix("" "${path_suffix}" target_suffix)
-
+ macro(build_profile_runtime d_flags c_flags ld_flags lib_suffix path_suffix outlist_targets)
set(output_path ${CMAKE_BINARY_DIR}/lib${path_suffix})
set(profilert_d_o "")
set(profilert_d_bc "")
- compile_profilert_D("${d_flags}" "" "${path_suffix}" profilert_d_o profilert_d_bc)
+ compile_profilert_D("${d_flags};-relocation-model=pic" "${lib_suffix}" "${path_suffix}" profilert_d_o profilert_d_bc)
add_library(ldc-profile-rt${target_suffix} STATIC ${profilert_d_o} ${LDC_PROFRT_C} ${LDC_PROFRT_CXX})
set_target_properties(
ldc-profile-rt${target_suffix} PROPERTIES
- OUTPUT_NAME ldc-profile-rt
+ OUTPUT_NAME ldc-profile-rt${lib_suffix}
VERSION ${LDC_VERSION}
LINKER_LANGUAGE C
ARCHIVE_OUTPUT_DIRECTORY ${output_path}
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-d/ldc.git
More information about the pkg-d-commits
mailing list