Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CMake: Tweak build order for D executables #3575

Merged
merged 7 commits into from
Oct 10, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .azure-pipelines/posix.yml
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ steps:
-DLLVM_ROOT_DIR=$PWD/../llvm \
-DD_COMPILER=$PWD/../host-ldc/bin/ldmd2 \
-DBUILD_SHARED_LIBS=OFF \
-DLDC_LINK_MANUALLY=OFF \
$BOOTSTRAP_CMAKE_FLAGS
ninja -j$PARALLEL_JOBS
bin/ldc2 -version
Expand All @@ -99,6 +100,7 @@ steps:
-DD_COMPILER=$PWD/../bootstrap-ldc/bin/ldmd2 \
-DCMAKE_INSTALL_PREFIX=$installDir \
-DINCLUDE_INSTALL_DIR=$installDir/import \
-DLDC_LINK_MANUALLY=OFF \
"${extraFlags[@]}"
ninja -j$PARALLEL_JOBS all ldc2-unittest all-test-runners
bin/ldc2 -version
Expand Down
8 changes: 4 additions & 4 deletions .azure-pipelines/windows.yml
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ steps:
mkdir bootstrap-ldc
cd bootstrap-ldc
cmake -G Ninja %BUILD_SOURCESDIRECTORY% -DCMAKE_C_COMPILER:PATH=clang-cl.exe -DCMAKE_CXX_COMPILER:PATH=clang-cl.exe -DCMAKE_BUILD_TYPE=Release -DLLVM_ROOT_DIR=%CD%/../llvm -DD_COMPILER=%CD%/../host-ldc/bin/ldmd2 -DBUILD_LTO_LIBS=ON
ninja -j2 || exit /b
ninja -j4 || exit /b
bin\ldc2 --version
displayName: Build bootstrap LDC
- script: |
Expand All @@ -92,7 +92,7 @@ steps:
mkdir build
cd build
cmake -G Ninja %BUILD_SOURCESDIRECTORY% -DCMAKE_C_COMPILER:PATH=clang-cl.exe -DCMAKE_CXX_COMPILER:PATH=clang-cl.exe -DCMAKE_BUILD_TYPE=Release %EXTRA_CMAKE_FLAGS% -DCMAKE_INSTALL_PREFIX=%INSTALL_DIR% -DINCLUDE_INSTALL_DIR=%INSTALL_DIR%/import -DLLVM_ROOT_DIR=%CD%/../llvm -DD_COMPILER=%CD%/../bootstrap-ldc/bin/ldmd2
ninja -j2 all ldc2-unittest all-test-runners || exit /b
ninja -j4 all ldc2-unittest all-test-runners || exit /b
bin\ldc2 --version
displayName: Build LDC & LDC D unittests & defaultlib unittest runners
- script: |
Expand All @@ -118,7 +118,7 @@ steps:
:: git's usr/bin/bash, unlike its bin/bash, leaves PATH as-is
set PATH=%CD%\gnu;C:\Program Files\Git\usr\bin;%PATH%
call "%VSINSTALLDIR%Common7\Tools\VsDevCmd.bat" -arch=%ARCH%
set DMD_TESTSUITE_MAKE_ARGS=-j2
set DMD_TESTSUITE_MAKE_ARGS=-j4
cd build
ctest -V -R "dmd-testsuite"
displayName: Run DMD testsuite
Expand All @@ -129,7 +129,7 @@ steps:
set PATH=%CD%\libcurl\ldc2;%CD%\gnu;C:\Program Files\Git\usr\bin;%PATH%
call "%VSINSTALLDIR%Common7\Tools\VsDevCmd.bat" -arch=%ARCH%
cd build
ctest -j2 --output-on-failure -E "dmd-testsuite|lit-tests|ldc2-unittest"
ctest -j4 --output-on-failure -E "dmd-testsuite|lit-tests|ldc2-unittest"
displayName: Run defaultlib unittests & druntime stand-alone tests
condition: succeededOrFailed()
- script: |
Expand Down
3 changes: 2 additions & 1 deletion .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ commonSteps: &commonSteps
cmake -G Ninja $CIRCLE_WORKING_DIRECTORY \
-DCMAKE_BUILD_TYPE=Release \
-DD_COMPILER=$PWD/../host-ldc/bin/ldmd2 \
-DLDC_LINK_MANUALLY=OFF \
$EXTRA_CMAKE_FLAGS
# Work around out-of-memory errors - retry twice with parallelization and one last time serially
targets='all ldc2-unittest all-test-runners'
Expand Down Expand Up @@ -124,7 +125,7 @@ jobs:
- LIBCLANG_COMMON_VERSION: "10"
- EXTRA_APT_PACKAGES: gdmd
- HOST_LDC_VERSION: 1.22.0
- EXTRA_CMAKE_FLAGS: "-DBUILD_SHARED_LIBS=ON -DBUILD_LTO_LIBS=ON -DLDC_INSTALL_LTOPLUGIN=ON -DLDC_INSTALL_LLVM_RUNTIME_LIBS=ON -DD_COMPILER=gdmd"
- EXTRA_CMAKE_FLAGS: "-DBUILD_SHARED_LIBS=ON -DBUILD_LTO_LIBS=ON -DLDC_INSTALL_LTOPLUGIN=ON -DLDC_INSTALL_LLVM_RUNTIME_LIBS=ON -DD_COMPILER=gdmd -DLDC_LINK_MANUALLY=ON"
macOS-x64:
<<: *commonSteps
macos:
Expand Down
3 changes: 2 additions & 1 deletion .cirrus.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ common_steps_template: &COMMON_STEPS_TEMPLATE
-DD_COMPILER=$PWD/../host-ldc/bin/ldmd2 \
-DCMAKE_INSTALL_PREFIX=$installDir \
-DINCLUDE_INSTALL_DIR=$installDir/import \
-DLDC_LINK_MANUALLY=OFF \
"${extraFlags[@]}"
ninja -j$PARALLELISM all ldc2-unittest all-test-runners
bin/ldc2 -version
Expand Down Expand Up @@ -132,7 +133,7 @@ task:
CI_OS: linux
LIBCLANG_COMMON_VERSION: "10"
EXTRA_APT_PACKAGES: "gdmd locales"
EXTRA_CMAKE_FLAGS: "-DBUILD_SHARED_LIBS=ON -DBUILD_LTO_LIBS=ON -DLDC_INSTALL_LTOPLUGIN=ON -DLDC_INSTALL_LLVM_RUNTIME_LIBS=ON -DD_COMPILER=gdmd"
EXTRA_CMAKE_FLAGS: "-DBUILD_SHARED_LIBS=ON -DBUILD_LTO_LIBS=ON -DLDC_INSTALL_LTOPLUGIN=ON -DLDC_INSTALL_LLVM_RUNTIME_LIBS=ON -DD_COMPILER=gdmd -DLDC_LINK_MANUALLY=ON"
PARALLELISM: 8
<< : *INSTALL_UBUNTU_PREREQUISITES_TEMPLATE
setup_gdmd_script: |
Expand Down
7 changes: 4 additions & 3 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,18 +23,18 @@ matrix:
env: LLVM_VERSION=9.0.0 OPTS="-DBUILD_SHARED_LIBS=ON -DRT_SUPPORT_SANITIZERS=ON"
- os: linux
d: ldc-0.17.6
env: LLVM_VERSION=8.0.0 OPTS="-DBUILD_SHARED_LIBS=OFF"
env: LLVM_VERSION=8.0.0 OPTS="-DBUILD_SHARED_LIBS=OFF -DLDC_LINK_MANUALLY=ON"
# FIXME: strange crashes, possibly due to C++ compiler mismatch
#- os: linux
# d: ldc
# env: LLVM_VERSION=7.0.1 OPTS="-DBUILD_SHARED_LIBS=ON"
- os: linux
d: dmd-beta
env: LLVM_VERSION=6.0.1 OPTS="-DLIB_SUFFIX=64"
env: LLVM_VERSION=6.0.1 OPTS="-DLIB_SUFFIX=64 -DLDC_LINK_MANUALLY=ON"
- os: osx
osx_image: xcode10.3
d: dmd-beta
env: LLVM_VERSION=10.0.0 OPTS="-DBUILD_SHARED_LIBS=ON -DRT_SUPPORT_SANITIZERS=ON"
env: LLVM_VERSION=10.0.0 OPTS="-DBUILD_SHARED_LIBS=ON -DRT_SUPPORT_SANITIZERS=ON -DLDC_LINK_MANUALLY=ON"
- os: osx
osx_image: xcode10.3
d: ldc-beta
Expand Down Expand Up @@ -118,6 +118,7 @@ script:
-DLLVM_ROOT_DIR=$LLVM_ROOT_DIR \
-DLDC_INSTALL_LTOPLUGIN=ON \
-DLDC_INSTALL_LLVM_RUNTIME_LIBS=ON \
-DLDC_LINK_MANUALLY=OFF \
$OPTS
# Build LDC & LDC D unittests & defaultlib unittest runners
- |
Expand Down
72 changes: 35 additions & 37 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -157,42 +157,42 @@ set(LDC_EXE_NAME ${PROGRAM_PREFIX}${LDC_EXE}${PROGRAM_SUFFIX})
set(LDMD_EXE_NAME ${PROGRAM_PREFIX}${LDMD_EXE}${PROGRAM_SUFFIX})

# Setup D compiler flags (DMD syntax, which also works with LDMD).
set(DDMD_DFLAGS "-wi")
set(DDMD_LFLAGS "")
set(DFLAGS_BASE "-wi")
set(DFLAGS_BUILD_TYPE "") # DFLAGS derived from CMAKE_BUILD_TYPE
if(NOT MSVC_IDE)
# for multi-config builds, these options have to be added later to the custom command
if(CMAKE_BUILD_TYPE MATCHES "Debug")
append("-g" DDMD_DFLAGS)
append("-g" DFLAGS_BUILD_TYPE)
if(${D_COMPILER_ID} STREQUAL "LDMD")
append("-link-debuglib" DDMD_DFLAGS)
append("-link-debuglib" DFLAGS_BUILD_TYPE)
endif()
elseif(CMAKE_BUILD_TYPE MATCHES "RelWithDebInfo")
append("-g -O -inline -release" DDMD_DFLAGS)
append("-g -O -inline -release" DFLAGS_BUILD_TYPE)
else()
# Default to a Release build type
append("-O -inline -release" DDMD_DFLAGS)
append("-O -inline -release" DFLAGS_BUILD_TYPE)
endif()

if(LLVM_ENABLE_ASSERTIONS)
string(REPLACE " -release" "" DDMD_DFLAGS "${DDMD_DFLAGS}")
string(REPLACE " -release" "" DFLAGS_BUILD_TYPE "${DFLAGS_BUILD_TYPE}")
endif()
endif()

if(MSVC)
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
message(STATUS "Let D host compiler output 64bit object files")
append("-m64" DDMD_DFLAGS)
append("-m64" DFLAGS_BASE)
else()
message(STATUS "Let D host compiler output 32bit COFF object files")
if(${D_COMPILER_ID} STREQUAL "DigitalMars")
append("-m32mscoff" DDMD_DFLAGS)
append("-m32mscoff" DFLAGS_BASE)
else()
append("-m32" DDMD_DFLAGS)
append("-m32" DFLAGS_BASE)
endif()
endif()

if(${D_COMPILER_ID} STREQUAL "DigitalMars" AND (MSVC_VERSION GREATER 1800)) # VS 2015+
append("-Llegacy_stdio_definitions.lib" DDMD_DFLAGS)
append("-Llegacy_stdio_definitions.lib" DFLAGS_BASE)
endif()

# Link against the static MSVC runtime; CMake's C(++) flags apparently default to the dynamic one.
Expand All @@ -216,9 +216,6 @@ if(MSVC)
endforeach()
endif()

append("-J${PROJECT_SOURCE_DIR}/dmd/res" DDMD_DFLAGS) # Needed for importing text files
string(STRIP "${DDMD_DFLAGS}" DDMD_DFLAGS)

# Use separate compiler flags for the frontend and for the LDC-specific parts,
# as enabling warnings on the DMD frontend only leads to a lot of clutter in
# the output (LLVM_CXXFLAGS sometimes already includes -Wall).
Expand Down Expand Up @@ -442,6 +439,7 @@ endif()
#
# Configure the build system to use LTO and/or PGO while building LDC
#
set(DFLAGS_LDC "")
include(HandleLTOPGOBuildOptions)

#
Expand All @@ -463,10 +461,11 @@ endif()
#

include_directories(. dmd)
append("-I${PROJECT_SOURCE_DIR}" DDMD_DFLAGS)
append("-I${PROJECT_BINARY_DIR}" DDMD_DFLAGS)
append("-I${PROJECT_SOURCE_DIR}" DFLAGS_LDC)
append("-I${PROJECT_BINARY_DIR}" DFLAGS_LDC)
append("-J${PROJECT_SOURCE_DIR}/dmd/res" DFLAGS_LDC)

append("-version=IN_LLVM" DDMD_DFLAGS)
append("-version=IN_LLVM" DFLAGS_LDC)
append("-DIN_LLVM" LDC_CXXFLAGS)
append("-DOPAQUE_VTBLS" LDC_CXXFLAGS)
# Predefine LDC_INSTALL_PREFIX as raw string literal, requiring shell + CMake escaping.
Expand Down Expand Up @@ -529,7 +528,7 @@ else()
# Define a 'HOST_D' CMake linker language for the static LDCShared
# library, using the host ldmd2 compiler ≥ v1.5 as archiver, which
# supports LTO objects and cross-archiving.
set(CMAKE_HOST_D_CREATE_STATIC_LIBRARY "${D_COMPILER} -lib ${D_COMPILER_FLAGS} ${DDMD_DFLAGS} -of=<TARGET> <OBJECTS>")
set(CMAKE_HOST_D_CREATE_STATIC_LIBRARY "${D_COMPILER} -lib ${D_COMPILER_FLAGS} ${DFLAGS_BASE} -of=<TARGET> <OBJECTS>")
set(LDC_LIB_LANGUAGE HOST_D)
endif()
endif()
Expand Down Expand Up @@ -626,28 +625,27 @@ if(LDC_ENABLE_PLUGINS)
endif()
message(STATUS "Building LDC with plugin support: ${LDC_ENABLE_PLUGINS} (LDC_ENABLE_PLUGINS=${LDC_ENABLE_PLUGINS})")

set(LDC_LINK_MANUALLY OFF)
if(UNIX AND (CMAKE_COMPILER_IS_GNUCXX OR (${CMAKE_CXX_COMPILER_ID} MATCHES "Clang")))
# On Unix-like systems, DMD and LDC will use the C compiler for linking, but
# will pass on -L options prefixed by -Xlinker to directly forward them to
# the underlying ld. Since there are some flags the GCC driver handles itself
# rather than passing them to ld, we cannot just directly translate
# LDC_LINKERFLAG_LIST to -L options. To be able to handle general linker flags,
# we manually invoke the linker instead of using the D compiler to do so.
set(LDC_LINK_MANUALLY ON)

if(NOT DEFINED D_LINKER_ARGS)
include(ExtractDMDSystemLinker)
message(STATUS "Host D compiler linker program: ${D_LINKER_COMMAND}")
message(STATUS "Host D compiler linker flags: ${D_LINKER_ARGS}")
if(NOT DEFINED LDC_LINK_MANUALLY)
if(MSVC)
# Use the D host compiler for linking D executables.
set(LDC_LINK_MANUALLY OFF)
else()
# On Unix-like systems, default to having CMake link the D executables via the C++ compiler.
# (Using the D compiler needs -Xcc and -gcc support, see file BuildDExecutable.cmake.)
set(LDC_LINK_MANUALLY ON)
endif()
endif()
if(LDC_LINK_MANUALLY AND NOT DEFINED D_LINKER_ARGS)
include(ExtractDMDSystemLinker)
message(STATUS "Host D compiler linker program: ${D_LINKER_COMMAND}")
message(STATUS "Host D compiler linker flags: ${D_LINKER_ARGS}")
endif()

build_d_executable(
"${LDC_EXE}"
"${LDC_EXE_FULL}"
"${LDC_D_SOURCE_FILES}"
""
"${DFLAGS_BUILD_TYPE} ${DFLAGS_LDC}"
"${LDC_LINKERFLAG_LIST}"
"${FE_RES}"
"${LDC_LIB}"
Expand Down Expand Up @@ -689,7 +687,7 @@ build_d_executable(
"${LDMD_EXE}"
"${LDMD_EXE_FULL}"
"${LDMD_D_SOURCE_FILES}"
""
"${DFLAGS_BUILD_TYPE}"
"${LDC_LINKERFLAG_LIST}"
""
"LDMD_CXX_LIB"
Expand Down Expand Up @@ -829,11 +827,11 @@ build_d_executable(
"${LDC_UNITTEST_EXE}"
"${LDC_UNITTEST_EXE_FULL}"
"${LDC_D_SOURCE_FILES}"
"-unittest"
"-g -unittest ${DFLAGS_LDC}"
"${LDC_LINKERFLAG_LIST}"
""
"${LDC_LIB}"
ON # always build separately (faster with parallelization)
${COMPILE_D_MODULES_SEPARATELY}
)
set_target_properties("${LDC_UNITTEST_EXE}" PROPERTIES EXCLUDE_FROM_ALL ON)
add_test(NAME build-ldc2-unittest COMMAND "${CMAKE_COMMAND}" --build ${CMAKE_BINARY_DIR} --target ldc2-unittest)
Expand All @@ -859,7 +857,7 @@ build_d_executable(
"${LDC_BUILD_RUNTIME_EXE}"
"${LDC_BUILD_RUNTIME_EXE_FULL}"
"${PROJECT_BINARY_DIR}/ldc-build-runtime.d"
""
"${DFLAGS_BUILD_TYPE}"
""
"${PROJECT_SOURCE_DIR}/runtime/ldc-build-runtime.d.in"
""
Expand Down
8 changes: 4 additions & 4 deletions azure-pipelines.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,13 @@ jobs:
OS: windows
MODEL: 64
ARCH: x64
EXTRA_CMAKE_FLAGS: -DBUILD_LTO_LIBS=ON -DD_COMPILER_FLAGS="-flto=full -defaultlib=phobos2-ldc-lto,druntime-ldc-lto" -DEXTRA_CXXFLAGS=-flto=full
EXTRA_CMAKE_FLAGS: -DBUILD_LTO_LIBS=ON -DD_COMPILER_FLAGS="-O -flto=full -defaultlib=phobos2-ldc-lto,druntime-ldc-lto" -DEXTRA_CXXFLAGS=-flto=full
x86:
OS: windows
MODEL: 32
ARCH: x86
# Undefined symbol errors with FullLTO; ThinLTO works.
EXTRA_CMAKE_FLAGS: -DBUILD_LTO_LIBS=ON -DD_COMPILER_FLAGS="-flto=thin -defaultlib=phobos2-ldc-lto,druntime-ldc-lto" -DEXTRA_CXXFLAGS=-flto=thin
EXTRA_CMAKE_FLAGS: -DBUILD_LTO_LIBS=ON -DD_COMPILER_FLAGS="-O -flto=thin -defaultlib=phobos2-ldc-lto,druntime-ldc-lto" -DEXTRA_CXXFLAGS=-flto=thin
# Let CMake configure 64-bit clang-cl for 32-bit code emission.
CFLAGS: -m32
CXXFLAGS: -m32
Expand Down Expand Up @@ -117,7 +117,7 @@ jobs:
# Also don't use relax relocations for the C(++) parts of the default libraries in order to
# support older user binutils (e.g., Ubuntu 14.04).
BOOTSTRAP_CMAKE_FLAGS: -DBUILD_LTO_LIBS=ON -DLDC_INSTALL_LTOPLUGIN=ON
EXTRA_CMAKE_FLAGS: -DMULTILIB=ON -DBUILD_LTO_LIBS=ON -DCMAKE_EXE_LINKER_FLAGS=-static-libstdc++ -DJITRT_EXTRA_LDFLAGS=-static-libstdc++ -DRT_CFLAGS=-Wa,-mrelax-relocations=no -DLDC_INSTALL_LTOPLUGIN=ON -DLDC_INSTALL_LLVM_RUNTIME_LIBS=ON -DD_COMPILER_FLAGS="-flto=full -defaultlib=phobos2-ldc-lto,druntime-ldc-lto" -DEXTRA_CXXFLAGS=-flto=full
EXTRA_CMAKE_FLAGS: -DMULTILIB=ON -DBUILD_LTO_LIBS=ON -DCMAKE_EXE_LINKER_FLAGS=-static-libstdc++ -DJITRT_EXTRA_LDFLAGS=-static-libstdc++ -DRT_CFLAGS=-Wa,-mrelax-relocations=no -DLDC_INSTALL_LTOPLUGIN=ON -DLDC_INSTALL_LLVM_RUNTIME_LIBS=ON -DD_COMPILER_FLAGS="-O -flto=full -defaultlib=phobos2-ldc-lto,druntime-ldc-lto" -DEXTRA_CXXFLAGS=-flto=full
steps:
- template: .azure-pipelines/posix.yml

Expand All @@ -129,7 +129,7 @@ jobs:
CI_OS: osx
ARCH: x86_64
BOOTSTRAP_CMAKE_FLAGS: -DBUILD_LTO_LIBS=ON
EXTRA_CMAKE_FLAGS: -DBUILD_LTO_LIBS=ON -DD_COMPILER_FLAGS="-flto=full -defaultlib=phobos2-ldc-lto,druntime-ldc-lto" -DEXTRA_CXXFLAGS=-flto=full
EXTRA_CMAKE_FLAGS: -DBUILD_LTO_LIBS=ON -DD_COMPILER_FLAGS="-O -flto=full -defaultlib=phobos2-ldc-lto,druntime-ldc-lto" -DEXTRA_CXXFLAGS=-flto=full
MACOSX_DEPLOYMENT_TARGET: 10.9
IOS_DEPLOYMENT_TARGET: 12.0
steps:
Expand Down
3 changes: 2 additions & 1 deletion bitrise.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,8 @@ workflows:
-DD_COMPILER=ldmd2 \
-DBUILD_SHARED_LIBS=OFF \
-DCMAKE_BUILD_TYPE=Release \
-DLLVM_ROOT_DIR="$LLVM_ROOT_DIR"
-DLLVM_ROOT_DIR="$LLVM_ROOT_DIR" \
-DLDC_LINK_MANUALLY=OFF
ninja -j2
envman add --key LDC_BINARY --value "$(pwd)/bin/ldc2"

Expand Down
Loading