Skip to content

Commit 8a30f4d

Browse files
authored
Merge pull request #4752 from kinke/standalone-runtime2
Better support building the runtime separately [mod]
2 parents 1f0c36e + 4d908d3 commit 8a30f4d

File tree

9 files changed

+48
-30
lines changed

9 files changed

+48
-30
lines changed

.github/actions/helper-build-ldc/action.yml

+3
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,14 @@ runs:
3030
installDir="$PWD/install"
3131
mkdir '${{ inputs.build_dir }}'
3232
cd '${{ inputs.build_dir }}'
33+
# wrt. CMAKE_C[XX]_COMPILER for Apple: https://github.com/ldc-developers/ldc/issues/3901
3334
cmake -G Ninja ../ldc \
3435
-DCMAKE_BUILD_TYPE=Release \
3536
-DLLVM_ROOT_DIR="$PWD/../${{ inputs.llvm_dir }}" \
3637
-DD_COMPILER='${{ inputs.host_dc }}' \
3738
-DLDC_LINK_MANUALLY=OFF \
39+
${{ runner.os == 'macOS' && '-DCMAKE_C_COMPILER=/usr/bin/cc' || '' }} \
40+
${{ runner.os == 'macOS' && '-DCMAKE_CXX_COMPILER=/usr/bin/c++' || '' }} \
3841
${{ inputs.specify_install_dir == 'true' && '-DCMAKE_INSTALL_PREFIX="$installDir"' || '' }} \
3942
${{ inputs.specify_install_dir == 'true' && '-DINCLUDE_INSTALL_DIR="$installDir/import"' || '' }} \
4043
${{ inputs.cmake_flags }}

.github/workflows/main.yml

+6-6
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,12 @@ jobs:
4141
arch: x86_64
4242
bootstrap_cmake_flags: >-
4343
-DBUILD_LTO_LIBS=ON
44-
-DD_COMPILER_FLAGS=-gcc=/usr/bin/c++
4544
# https://github.com/ldc-developers/ldc/issues/4462:
4645
# When using LTO, we need to explicitly export ~all symbols for plugin support via `ld64 -exported_symbol '__*'`.
4746
# Additionally `-w` to suppress resulting linker warnings.
4847
extra_cmake_flags: >-
4948
-DBUILD_LTO_LIBS=ON
50-
-DD_COMPILER_FLAGS="-gcc=/usr/bin/c++ -O -flto=full -defaultlib=phobos2-ldc-lto,druntime-ldc-lto -L-exported_symbol '-L__*' -L-w"
49+
-DD_COMPILER_FLAGS="-O -flto=full -defaultlib=phobos2-ldc-lto,druntime-ldc-lto -L-exported_symbol '-L__*' -L-w"
5150
-DEXTRA_CXXFLAGS=-flto=full
5251
with_pgo: true
5352

@@ -56,10 +55,9 @@ jobs:
5655
arch: arm64
5756
bootstrap_cmake_flags: >-
5857
-DBUILD_LTO_LIBS=ON
59-
-DD_COMPILER_FLAGS=-gcc=/usr/bin/c++
6058
extra_cmake_flags: >-
6159
-DBUILD_LTO_LIBS=ON
62-
-DD_COMPILER_FLAGS="-gcc=/usr/bin/c++ -O -flto=full -defaultlib=phobos2-ldc-lto,druntime-ldc-lto -L-exported_symbol '-L__*' -L-w"
60+
-DD_COMPILER_FLAGS="-O -flto=full -defaultlib=phobos2-ldc-lto,druntime-ldc-lto -L-exported_symbol '-L__*' -L-w"
6361
-DEXTRA_CXXFLAGS=-flto=full
6462
with_pgo: true
6563

@@ -77,8 +75,10 @@ jobs:
7775
os: windows-2022
7876
arch: x86
7977
bootstrap_cmake_flags: -DBUILD_LTO_LIBS=ON
78+
# `RT_CFLAGS=-m32` needed to make 64-bit clang-cl output 32-bit code for druntime integration tests
8079
extra_cmake_flags: >-
8180
-DBUILD_LTO_LIBS=ON
81+
-DRT_CFLAGS=-m32
8282
# Undefined symbol errors with FullLTO; ThinLTO used to work, but apparently miscompiles a lexer.d:138 assertion since v1.33.
8383
# "-DD_COMPILER_FLAGS=-O -flto=thin -defaultlib=phobos2-ldc-lto,druntime-ldc-lto"
8484
# -DEXTRA_CXXFLAGS=-flto=thin
@@ -94,9 +94,9 @@ jobs:
9494
with:
9595
submodules: true
9696
fetch-depth: 50
97-
- name: 'macOS 14: Switch to Xcode 16 Beta 6'
97+
- name: 'macOS 14: Switch to Xcode 16'
9898
if: matrix.os == 'macos-14'
99-
run: sudo xcode-select -switch /Applications/Xcode_16_beta_6.app
99+
run: sudo xcode-select -switch /Applications/Xcode_16.app
100100
- name: Install prerequisites
101101
uses: ./.github/actions/1-setup
102102
with:

.github/workflows/supported_llvm_versions.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,12 @@ jobs:
2525
os: macos-14
2626
host_dc: ldc-beta
2727
llvm_version: 17.0.5
28-
cmake_flags: -DBUILD_SHARED_LIBS=ON -DRT_SUPPORT_SANITIZERS=ON -DD_COMPILER_FLAGS=-gcc=/usr/bin/c++ -DCMAKE_EXE_LINKER_FLAGS=-L/opt/homebrew/opt/zstd/lib
28+
cmake_flags: -DBUILD_SHARED_LIBS=ON -DRT_SUPPORT_SANITIZERS=ON -DCMAKE_EXE_LINKER_FLAGS=-L/opt/homebrew/opt/zstd/lib -DCMAKE_C_COMPILER=/usr/bin/cc -DCMAKE_CXX_COMPILER=/usr/bin/c++
2929
- job_name: macOS 14, LLVM 16, latest LDC beta
3030
os: macos-14
3131
host_dc: ldc-beta
3232
llvm_version: 16.0.5
33-
cmake_flags: -DBUILD_SHARED_LIBS=OFF -DD_COMPILER_FLAGS=-gcc=/usr/bin/c++ -DCMAKE_EXE_LINKER_FLAGS=-L/opt/homebrew/opt/zstd/lib
33+
cmake_flags: -DBUILD_SHARED_LIBS=OFF -DCMAKE_EXE_LINKER_FLAGS=-L/opt/homebrew/opt/zstd/lib -DCMAKE_C_COMPILER=/usr/bin/cc -DCMAKE_CXX_COMPILER=/usr/bin/c++
3434
- job_name: Ubuntu 20.04, LLVM 15, latest DMD beta
3535
os: ubuntu-20.04
3636
host_dc: dmd-beta

runtime/CMakeLists.txt

+7-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
project(runtime C ASM)
2-
31
cmake_minimum_required(VERSION 3.4.3)
2+
project(runtime C ASM)
43

54
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR})
65

@@ -337,7 +336,7 @@ if(LDC_EXE)
337336
"$<$<BOOL:${SHARED_LIBS_SUPPORTED}>:${MULTILIB_DIR}>"
338337
${conf_path}.in
339338
${conf_path}
340-
DEPENDS ${LDC_EXE} ${LDC_EXE_FULL}
339+
DEPENDS ${LDC_EXE_FULL}
341340
)
342341
add_custom_command(OUTPUT ${install_conf_path} VERBATIM
343342
COMMAND ${PROJECT_PARENT_DIR}/tools/add-multilib-section.sh
@@ -347,7 +346,7 @@ if(LDC_EXE)
347346
"$<$<BOOL:${SHARED_LIBS_SUPPORTED}>:${MULTILIB_INSTALL_DIR}>"
348347
${install_conf_path}.in
349348
${install_conf_path}
350-
DEPENDS ${LDC_EXE} ${LDC_EXE_FULL}
349+
DEPENDS ${LDC_EXE_FULL}
351350
)
352351
add_custom_target(add-multilib-section ALL
353352
DEPENDS ${conf_path} ${install_conf_path}
@@ -437,7 +436,9 @@ macro(dc src_files src_basedir d_flags output_basedir emit_bc all_at_once single
437436
list(APPEND dc_flags -flto=thin --output-bc)
438437
endif()
439438

440-
set(dc_deps ${LDC_EXE} ${LDC_EXE_FULL} ${GCCBUILTINS})
439+
# dc_deps can only contain paths, otherwise cmake will ignore the dependency.
440+
# See: https://github.com/ldc-developers/ldc/pull/4743#issuecomment-2323156173
441+
set(dc_deps ${LDC_EXE_FULL} ${GCCBUILTINS})
441442
if(TARGET add-multilib-section)
442443
# Make sure the config files are available before invoking LDC.
443444
set(dc_deps ${dc_deps} add-multilib-section)
@@ -905,6 +906,7 @@ install(FILES ${GCCBUILTINS} DESTINATION ${INCLUDE_INSTALL_DIR}/ldc)
905906
#
906907
# Test targets.
907908
#
909+
enable_testing()
908910

909911
# Build the "test runner" executables containing the druntime and Phobos unit
910912
# tests. They are invoked with the modules to test later.

runtime/DRuntimeIntegrationTests.cmake

+12-4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
enable_language(CXX) # for CMAKE_CXX_COMPILER
2+
13
# Try to find GNU make, use specific version first (BSD) and fall back to default 'make' (Linux)
24
find_program(GNU_MAKE_BIN NAMES gmake gnumake make)
35
if(NOT GNU_MAKE_BIN)
@@ -34,8 +36,13 @@ else()
3436
endif()
3537
endif()
3638

37-
if(NOT "${TARGET_SYSTEM}" MATCHES "MSVC")
38-
set(cflags_base "CFLAGS_BASE=-Wall -Wl,-rpath,${CMAKE_BINARY_DIR}/lib${LIB_SUFFIX}")
39+
string(REPLACE ";" " " dflags_base "${D_EXTRA_FLAGS}")
40+
41+
string(REPLACE ";" " " cflags_base "${RT_CFLAGS}")
42+
if("${TARGET_SYSTEM}" MATCHES "MSVC")
43+
set(cflags_base "${cflags_base} /Wall")
44+
else()
45+
set(cflags_base "${cflags_base} -Wall -Wl,-rpath,${CMAKE_BINARY_DIR}/lib${LIB_SUFFIX}")
3946
endif()
4047

4148
set(linkdl "")
@@ -72,9 +79,10 @@ foreach(name ${testnames})
7279
)
7380
add_test(NAME ${fullname}
7481
COMMAND ${GNU_MAKE_BIN} -C ${PROJECT_SOURCE_DIR}/druntime/test/${name}
75-
ROOT=${outdir} DMD=${LDMD_EXE_FULL} BUILD=${build}
82+
ROOT=${outdir} DMD=${LDMD_EXE_FULL} BUILD=${build} SHARED=1
83+
CC=${CMAKE_C_COMPILER} CXX=${CMAKE_CXX_COMPILER}
7684
DRUNTIME=${druntime_path_build} DRUNTIMESO=${shared_druntime_path_build}
77-
SHARED=1 ${cflags_base} ${linkdl}
85+
CFLAGS_BASE=${cflags_base} DFLAGS_BASE=${dflags_base} ${linkdl}
7886
)
7987
set_tests_properties(${fullname} PROPERTIES DEPENDS clean-${fullname})
8088
endforeach()

runtime/druntime/test/common.mak

+4-2
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,10 @@ ifeq (,$(findstring ldmd2,$(DMD)))
3737
CFLAGS_BASE+=--target=x86_64-darwin-apple # ARM cpu is not supported by dmd
3838
endif
3939
endif
40-
# LDC: use `-defaultlib=druntime-ldc [-link-defaultlib-shared]` instead of `-defaultlib= -L$(DRUNTIME[_IMPLIB])`
41-
DFLAGS:=$(MODEL_FLAG) $(PIC) -w -I../../src -I../../import -I$(SRC) -defaultlib=$(if $(findstring ldmd2,$(DMD)),druntime-ldc,) -preview=dip1000 $(if $(findstring $(OS),windows),,-L-lpthread -L-lm $(LINKDL))
40+
# LDC:
41+
# * include optional DFLAGS_BASE
42+
# * use `-defaultlib=druntime-ldc [-link-defaultlib-shared]` instead of `-defaultlib= -L$(DRUNTIME[_IMPLIB])`
43+
DFLAGS:=$(MODEL_FLAG) $(PIC) $(if $(findstring ldmd2,$(DMD)),$(DFLAGS_BASE),) -w -I../../src -I../../import -I$(SRC) -defaultlib=$(if $(findstring ldmd2,$(DMD)),druntime-ldc,) -preview=dip1000 $(if $(findstring $(OS),windows),,-L-lpthread -L-lm $(LINKDL))
4244
# LINK_SHARED may be set by importing makefile
4345
ifeq (,$(findstring ldmd2,$(DMD)))
4446
DFLAGS+=$(if $(LINK_SHARED),-L$(DRUNTIME_IMPLIB) $(if $(findstring $(OS),windows),-dllimport=all),-L$(DRUNTIME))

runtime/druntime/test/shared/Makefile

+6-6
Original file line numberDiff line numberDiff line change
@@ -131,24 +131,24 @@ $(ROOT)/dynamiccast$(DOTDLL): $(SRC)/dynamiccast.d $(if $(LINK_SHARED),$(DRUNTI
131131
ifeq (windows,$(OS))
132132
CC:=cl
133133
CC_OUTFLAG:=/Fe
134-
# we additionally specify the .obj output path (/Fo) to prevent collisions
135-
CC_EXTRAS:=
134+
# additionally specify the .obj output directory to prevent collisions
135+
CC_EXTRAS:=/Fo$(ROOT)/
136136
else
137137
CC_OUTFLAG:=-o
138138
CC_EXTRAS:=$(LDL) -pthread
139139
endif
140140

141141
$(ROOT)/linkD$(DOTEXE): $(SRC)/linkD.c $(ROOT)/lib$(DOTDLL) $(DRUNTIMESO)
142-
$(QUIET)$(CC) $(CFLAGS) $(CC_OUTFLAG)$@ $(if $(findstring $(OS),windows),/Fo$@.obj,) $< $(ROOT)/lib$(DOTIMPLIB) $(CC_EXTRAS)
142+
$(QUIET)$(CC) $(CFLAGS) $(CC_OUTFLAG)$@ $< $(ROOT)/lib$(DOTIMPLIB) $(CC_EXTRAS)
143143

144144
$(ROOT)/linkDR$(DOTEXE): $(SRC)/linkDR.c $(ROOT)/lib$(DOTDLL) $(DRUNTIMESO)
145-
$(QUIET)$(CC) $(CFLAGS) $(CC_OUTFLAG)$@ $(if $(findstring $(OS),windows),/Fo$@.obj,) $< $(DRUNTIME_IMPLIB) $(CC_EXTRAS)
145+
$(QUIET)$(CC) $(CFLAGS) $(CC_OUTFLAG)$@ $< $(DRUNTIME_IMPLIB) $(CC_EXTRAS)
146146

147147
$(ROOT)/loadDR$(DOTEXE): $(SRC)/loadDR.c $(ROOT)/lib$(DOTDLL) $(DRUNTIMESO)
148-
$(QUIET)$(CC) $(CFLAGS) $(CC_OUTFLAG)$@ $(if $(findstring $(OS),windows),/Fo$@.obj,) $< $(CC_EXTRAS)
148+
$(QUIET)$(CC) $(CFLAGS) $(CC_OUTFLAG)$@ $< $(CC_EXTRAS)
149149

150150
$(ROOT)/host$(DOTEXE): $(SRC)/host.c $(ROOT)/plugin1$(DOTDLL) $(ROOT)/plugin2$(DOTDLL)
151-
$(QUIET)$(CC) $(CFLAGS) $(CC_OUTFLAG)$@ $(if $(findstring $(OS),windows),/Fo$@.obj,) $< $(CC_EXTRAS)
151+
$(QUIET)$(CC) $(CFLAGS) $(CC_OUTFLAG)$@ $< $(CC_EXTRAS)
152152

153153
$(ROOT)/liblinkdep$(DOTDLL): $(ROOT)/lib$(DOTDLL)
154154
$(ROOT)/liblinkdep$(DOTDLL): DFLAGS+=-L$(ROOT)/lib$(DOTIMPLIB)

runtime/druntime/test/stdcpp/Makefile

+5-5
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ include ../common.mak
44

55
ifeq (windows,$(OS))
66

7-
CC:=cl
7+
CXX:=cl
88
EXTRA_CXXFLAGS:=/nologo /EHsc
99
EXTRA_DFLAGS:=
1010

@@ -23,19 +23,19 @@ $(ROOT)/%: $(SRC)/%.cpp $(SRC)/%_test.d
2323
@echo Testing $*
2424
@mkdir -p $(dir $@)
2525

26-
$(QUIET)$(CC) /MT $(EXTRA_CXXFLAGS) -c /Fo$@_cpp$(DOTOBJ) $<
26+
$(QUIET)$(CXX) /MT $(CXXFLAGS_BASE) $(EXTRA_CXXFLAGS) -c /Fo$@_cpp$(DOTOBJ) $<
2727
$(QUIET)$(DMD) -mscrtlib=libcmt $(DFLAGS) $(EXTRA_DFLAGS) -main -unittest -version=CoreUnittest -version=_MSC_VER_$(MSC_VER) -of$@$(DOTEXE) $@_cpp$(DOTOBJ) $(SRC)/$*_test.d
2828
$(QUIET)$(TIMELIMIT)$@ $(RUN_ARGS)
2929

30-
$(QUIET)$(CC) /MD $(EXTRA_CXXFLAGS) -c /Fo$@_cpp$(DOTOBJ) $<
30+
$(QUIET)$(CXX) /MD $(CXXFLAGS_BASE) $(EXTRA_CXXFLAGS) -c /Fo$@_cpp$(DOTOBJ) $<
3131
$(QUIET)$(DMD) -mscrtlib=msvcrt $(DFLAGS) $(EXTRA_DFLAGS) -main -unittest -version=CoreUnittest -version=_MSC_VER_$(MSC_VER) -of$@$(DOTEXE) $@_cpp$(DOTOBJ) $(SRC)/$*_test.d
3232
$(QUIET)$(TIMELIMIT)$@ $(RUN_ARGS)
3333

34-
$(QUIET)$(CC) /MTd $(EXTRA_CXXFLAGS) -c /Fo$@_cpp$(DOTOBJ) $<
34+
$(QUIET)$(CXX) /MTd $(CXXFLAGS_BASE) $(EXTRA_CXXFLAGS) -c /Fo$@_cpp$(DOTOBJ) $<
3535
$(QUIET)$(DMD) -mscrtlib=libcmtd $(DFLAGS) $(EXTRA_DFLAGS) -main -unittest -version=CoreUnittest -version=_MSC_VER_$(MSC_VER) -of$@$(DOTEXE) $@_cpp$(DOTOBJ) $(SRC)/$*_test.d
3636
$(QUIET)$(TIMELIMIT)$@ $(RUN_ARGS)
3737

38-
$(QUIET)$(CC) /MDd $(EXTRA_CXXFLAGS) -c /Fo$@_cpp$(DOTOBJ) $<
38+
$(QUIET)$(CXX) /MDd $(CXXFLAGS_BASE) $(EXTRA_CXXFLAGS) -c /Fo$@_cpp$(DOTOBJ) $<
3939
$(QUIET)$(DMD) -mscrtlib=msvcrtd $(DFLAGS) $(EXTRA_DFLAGS) -main -unittest -version=CoreUnittest -version=_MSC_VER_$(MSC_VER) -of$@$(DOTEXE) $@_cpp$(DOTOBJ) $(SRC)/$*_test.d
4040
$(QUIET)$(TIMELIMIT)$@ $(RUN_ARGS)
4141

runtime/ldc-build-runtime.d.in

+3
Original file line numberDiff line numberDiff line change
@@ -150,9 +150,12 @@ void prepareLdcSource() {
150150
void runCMake() {
151151
const wd = WorkingDirScope(config.buildDir);
152152

153+
const ldmdExecutable = buildPath(config.ldcExecutable.dirName, "ldmd2" ~ exeSuffix);
154+
153155
string[] args = [
154156
"cmake",
155157
"-DLDC_EXE_FULL=" ~ config.ldcExecutable,
158+
"-DLDMD_EXE_FULL=" ~ ldmdExecutable,
156159
"-DDMDFE_MINOR_VERSION=@DMDFE_MINOR_VERSION@",
157160
"-DDMDFE_PATCH_VERSION=@DMDFE_PATCH_VERSION@",
158161
];

0 commit comments

Comments
 (0)