Skip to content

Commit 90ddad8

Browse files
authored
Update the build logic for LLVM libcxx (#21792)
This allows libc++ and libc++abi to be built on FreeBSD. However, these libraries still cannot be built with GCC nor on macOS, though that condition predates this change.
1 parent 69f3284 commit 90ddad8

File tree

2 files changed

+69
-22
lines changed

2 files changed

+69
-22
lines changed

Make.inc

+8-2
Original file line numberDiff line numberDiff line change
@@ -1069,8 +1069,14 @@ endif
10691069
# Custom libcxx
10701070
ifeq ($(BUILD_CUSTOM_LIBCXX),1)
10711071
LDFLAGS += -L$(build_libdir)
1072-
CXXLDFLAGS += -L$(build_libdir) -lc++abi -stdlib=libc++ -lc++
1073-
CPPFLAGS += -I$(build_includedir)/c++/v1
1072+
CXXLDFLAGS += -L$(build_libdir) -lc++abi -lc++
1073+
ifeq ($(USECLANG),1)
1074+
CXXLDFLAGS += -stdlib=libc++
1075+
else
1076+
ifeq ($(USEGCC),1)
1077+
$(error BUILD_CUSTOM_LIBCXX is currently only supported with Clang. Try setting BUILD_CUSTOM_LIBCXX=0)
1078+
endif
1079+
endif # Clang
10741080
CUSTOM_LD_LIBRARY_PATH := LD_LIBRARY_PATH="$(build_libdir)"
10751081
ifeq ($(USEICC),1)
10761082
CXXFLAGS += -cxxlib-nostd -static-intel

deps/llvm.mk

+61-20
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,19 @@ LLVM_CPPFLAGS += -flto
179179
LLVM_LDFLAGS += -flto
180180
endif # LLVM_LTO
181181

182+
ifeq ($(BUILD_CUSTOM_LIBCXX),1)
183+
LLVM_LDFLAGS += -Wl,-rpath,$(build_libdir)
184+
LLVM_CPPFLAGS += -I$(build_includedir)
185+
# We don't want to link to libc++ while trying to build it, so we define these
186+
# flags separately so that we can still pass them to the main LLVM build
187+
LLVM_LIBCXX_LDFLAGS := -lc++ -lc++abi
188+
ifeq ($(USEICC),1)
189+
LLVM_LDFLAGS += -no_cpprt
190+
endif # USEICC
191+
else
192+
LLVM_LIBCXX_LDFLAGS :=
193+
endif # BUILD_CUSTOM_LIBCXX
194+
182195
ifneq ($(LLVM_CXXFLAGS),)
183196
LLVM_FLAGS += CXXFLAGS="$(LLVM_CXXFLAGS)"
184197
LLVM_MFLAGS += CXXFLAGS="$(LLVM_CXXFLAGS)"
@@ -188,25 +201,16 @@ LLVM_FLAGS += CFLAGS="$(LLVM_CFLAGS)"
188201
LLVM_MFLAGS += CFLAGS="$(LLVM_CFLAGS)"
189202
endif # LLVM_CFLAGS
190203

191-
ifeq ($(BUILD_CUSTOM_LIBCXX),1)
192-
LLVM_LDFLAGS += -Wl,-R$(build_libdir) -lc++ -lc++abi
193-
ifeq ($(USEICC),1)
194-
LLVM_LDFLAGS += -no_cpprt
195-
endif # USEICC
196-
endif # BUILD_CUSTOM_LIBCXX
197-
198204
ifneq ($(LLVM_CPPFLAGS),)
199205
LLVM_FLAGS += CPPFLAGS="$(LLVM_CPPFLAGS)"
200206
LLVM_MFLAGS += CPPFLAGS="$(LLVM_CPPFLAGS)"
201207
endif
202208
ifneq ($(LLVM_LDFLAGS),)
203-
LLVM_FLAGS += LDFLAGS="$(LLVM_LDFLAGS)"
204-
LLVM_MFLAGS += LDFLAGS="$(LLVM_LDFLAGS)"
209+
LLVM_FLAGS += LDFLAGS="$(LLVM_LDFLAGS) $(LLVM_LIBCXX_LDFLAGS)"
210+
LLVM_MFLAGS += LDFLAGS="$(LLVM_LDFLAGS) $(LLVM_LIBCXX_LDFLAGS)"
205211
endif
206212
LLVM_CMAKE += -DCMAKE_C_FLAGS="$(LLVM_CPPFLAGS) $(LLVM_CFLAGS)" \
207-
-DCMAKE_CXX_FLAGS="$(LLVM_CPPFLAGS) $(LLVM_CXXFLAGS)" \
208-
-DCMAKE_EXE_LINKER_FLAGS="$(LLVM_LDFLAGS)" \
209-
-DCMAKE_SHARED_LINKER_FLAGS="$(LLVM_LDFLAGS)"
213+
-DCMAKE_CXX_FLAGS="$(LLVM_CPPFLAGS) $(LLVM_CXXFLAGS)"
210214

211215
ifeq ($(BUILD_LLVM_CLANG),1)
212216
LLVM_MFLAGS += OPTIONAL_PARALLEL_DIRS=clang
@@ -275,46 +279,83 @@ LLVM_FLAGS += --with-python="$(shell $(SRCDIR)/tools/find_python2)"
275279

276280
ifeq ($(BUILD_CUSTOM_LIBCXX),1)
277281

282+
# Take a snapshot of the CMake flags before linking to -lc++ and -lc++abi
283+
# These are added to the LLVM CMake flags further down
284+
LLVM_CMAKE_LIBCXX := $(LLVM_CMAKE) \
285+
-DCMAKE_EXE_LINKER_FLAGS="$(LLVM_LDFLAGS)" \
286+
-DCMAKE_SHARED_LINKER_FLAGS="$(LLVM_LDFLAGS)"
287+
278288
ifeq ($(USEICC),1)
279289
LIBCXX_EXTRA_FLAGS := -Bstatic -lirc -Bdynamic
280290
endif
281291

292+
# These libraries require unwind.h from the libunwind dependency
293+
ifeq ($(USE_SYSTEM_LIBUNWIND),0)
294+
ifeq ($(OS),Darwin)
295+
BUILT_UNWIND := $(build_prefix)/manifest/osxunwind
296+
else
297+
BUILT_UNWIND := $(build_prefix)/manifest/unwind
298+
endif # Darwin
299+
else
300+
BUILT_UNWIND :=
301+
endif # Building libunwind
302+
282303
$(LLVM_SRC_DIR)/projects/libcxx: $(LLVM_LIBCXX_TAR) | $(LLVM_SRC_DIR)/source-extracted
283304
([ ! -d $@ ] && \
284305
git clone $(LLVM_GIT_URL_LIBCXX) $@ ) || \
285306
(cd $@ && \
286307
git pull --ff-only)
287-
$(LLVM_SRC_DIR)/projects/libcxx/.git/HEAD: | $(LLVM_SRC_DIR)/projects/libcxx/.git/HEAD
308+
$(LLVM_SRC_DIR)/projects/libcxx/.git/HEAD: | $(LLVM_SRC_DIR)/projects/libcxx
288309
$(LLVM_SRC_DIR)/projects/libcxxabi: $(LLVM_LIBCXXABI_TAR) | $(LLVM_SRC_DIR)/source-extracted
289310
([ ! -d $@ ] && \
290311
git clone $(LLVM_GIT_URL_LIBCXXABI) $@ ) || \
291312
(cd $@ && \
292313
git pull --ff-only)
293314
$(LLVM_SRC_DIR)/projects/libcxxabi/.git/HEAD: | $(LLVM_SRC_DIR)/projects/libcxxabi
294-
$(LLVM_BUILD_DIR)/libcxx-build/Makefile: | $(LLVM_SRC_DIR)/projects/libcxx $(LLVM_SRC_DIR)/projects/libcxxabi
315+
$(LLVM_BUILD_DIR)/libcxx-build/Makefile: | $(LLVM_SRC_DIR)/projects/libcxx $(LLVM_SRC_DIR)/projects/libcxxabi $(BUILT_UNWIND)
295316
mkdir -p $(dir $@)
296317
cd $(dir $@) && \
297-
$(CMAKE) -G "Unix Makefiles" $(CMAKE_COMMON) $(LLVM_CMAKE) -DLIBCXX_CXX_ABI=libcxxabi -DLIBCXX_CXX_ABI_INCLUDE_PATHS="$(LLVM_SRC_DIR)/projects/libcxxabi/include" $(LLVM_SRC_DIR)/projects/libcxx -DCMAKE_SHARED_LINKER_FLAGS="$(LDFLAGS) -L$(build_libdir) $(LIBCXX_EXTRA_FLAGS)"
298-
$(LLVM_BUILD_DIR)/libcxxabi-build/Makefile: | $(LLVM_SRC_DIR)/projects/libcxxabi $(LLVM_SRC_DIR)/projects/libcxx
318+
$(CMAKE) -G "Unix Makefiles" $(CMAKE_COMMON) $(LLVM_CMAKE_LIBCXX) -DLIBCXX_CXX_ABI=libcxxabi -DLIBCXX_CXX_ABI_INCLUDE_PATHS="$(LLVM_SRC_DIR)/projects/libcxxabi/include" $(LLVM_SRC_DIR)/projects/libcxx -DCMAKE_SHARED_LINKER_FLAGS="$(LDFLAGS) -L$(build_libdir) $(LIBCXX_EXTRA_FLAGS)"
319+
$(LLVM_BUILD_DIR)/libcxxabi-build/Makefile: | $(LLVM_SRC_DIR)/projects/libcxxabi $(LLVM_SRC_DIR)/projects/libcxx $(BUILT_UNWIND)
299320
mkdir -p $(dir $@)
300321
cd $(dir $@) && \
301-
$(CMAKE) -G "Unix Makefiles" $(CMAKE_COMMON) $(LLVM_CMAKE) -DLLVM_ABI_BREAKING_CHECKS="WITH_ASSERTS" -DLLVM_PATH="$(LLVM_SRC_DIR)" $(LLVM_SRC_DIR)/projects/libcxxabi -DLIBCXXABI_CXX_ABI_LIBRARIES="$(LIBCXX_EXTRA_FLAGS)" -DCMAKE_CXX_FLAGS="$(LLVM_CPPFLAGS) $(LLVM_CXXFLAGS) -std=c++11"
322+
$(CMAKE) -G "Unix Makefiles" $(CMAKE_COMMON) $(LLVM_CMAKE_LIBCXX) -DLLVM_ABI_BREAKING_CHECKS="WITH_ASSERTS" -DLLVM_PATH="$(LLVM_SRC_DIR)" $(LLVM_SRC_DIR)/projects/libcxxabi -DLIBCXXABI_CXX_ABI_LIBRARIES="$(LIBCXX_EXTRA_FLAGS)" -DCMAKE_CXX_FLAGS="$(LLVM_CPPFLAGS) $(LLVM_CXXFLAGS) -std=c++11"
302323
$(LLVM_BUILD_DIR)/libcxxabi-build/lib/libc++abi.so.1.0: $(LLVM_BUILD_DIR)/libcxxabi-build/Makefile $(LLVM_SRC_DIR)/projects/libcxxabi/.git/HEAD
303324
$(MAKE) -C $(LLVM_BUILD_DIR)/libcxxabi-build
304325
touch -c $@
305326
$(build_libdir)/libc++abi.so.1.0: $(LLVM_BUILD_DIR)/libcxxabi-build/lib/libc++abi.so.1.0
306327
$(MAKE) -C $(LLVM_BUILD_DIR)/libcxxabi-build install
307328
touch -c $@
329+
# Building this library installs these headers, which breaks other dependencies
330+
-rm -rf $(build_includedir)/c++
308331
$(LLVM_BUILD_DIR)/libcxx-build/lib/libc++.so.1.0: $(build_libdir)/libc++abi.so.1.0 $(LLVM_BUILD_DIR)/libcxx-build/Makefile $(LLVM_SRC_DIR)/projects/libcxx/.git/HEAD
309332
$(MAKE) -C $(LLVM_BUILD_DIR)/libcxx-build
310333
$(build_libdir)/libc++.so.1.0: $(LLVM_BUILD_DIR)/libcxx-build/lib/libc++.so.1.0
311334
$(MAKE) -C $(LLVM_BUILD_DIR)/libcxx-build install
312335
touch -c $@
336+
# Building this library installs these headers, which breaks other dependencies
337+
-rm -rf $(build_includedir)/c++
313338
get-libcxx: $(LLVM_SRC_DIR)/projects/libcxx
314339
get-libcxxabi: $(LLVM_SRC_DIR)/projects/libcxxabi
315340
install-libcxxabi: $(build_libdir)/libc++abi.so.1.0
316341
install-libcxx: $(build_libdir)/libc++.so.1.0
317-
endif
342+
endif # BUILD_CUSTOM_LIBCXX
343+
344+
# We want to be able to clean without having to pass BUILD_CUSTOM_LIBCXX=1, so define these
345+
# outside of the conditional above
346+
clean-libcxx:
347+
-$(MAKE) -C $(LLVM_BUILD_DIR)/libcxx-build clean
348+
clean-libcxxabi:
349+
-$(MAKE) -C $(LLVM_BUILD_DIR)/libcxxabi-build clean
350+
distclean-libcxx:
351+
-rm -rf $(LLVM_LIBCXX_TAR) $(LLVM_SRC_DIR)/projects/libcxx $(LLVM_BUILD_DIR)/libcxx-build
352+
distclean-libcxxabi:
353+
-rm -rf $(LLVM_LIBCXXABI_TAR) $(LLVM_SRC_DIR)/projects/libcxxabi $(LLVM_BUILD_DIR)/libcxxabi-build
354+
355+
# We want to ensure that the libcxx linking flags don't get passed to the libcxx build, since it will
356+
# error on a fresh build
357+
LLVM_CMAKE += -DCMAKE_EXE_LINKER_FLAGS="$(LLVM_LDFLAGS) $(LLVM_LIBCXX_LDFLAGS)" \
358+
-DCMAKE_SHARED_LINKER_FLAGS="$(LLVM_LDFLAGS) $(LLVM_LIBCXX_LDFLAGS)"
318359

319360
ifeq ($(BUILD_CUSTOM_LIBCXX),1)
320361
LIBCXX_DEPENDENCY := $(build_libdir)/libc++abi.so.1.0 $(build_libdir)/libc++.so.1.0
@@ -573,11 +614,11 @@ endif # LLVM_USE_CMAKE
573614
$(eval $(call staged-install,llvm,llvm-$$(LLVM_VER)/build_$$(LLVM_BUILDTYPE), \
574615
LLVM_INSTALL,,,))
575616

576-
clean-llvm:
617+
clean-llvm: clean-libcxx clean-libcxxabi
577618
-rm $(LLVM_BUILDDIR_withtype)/build-configured $(LLVM_BUILDDIR_withtype)/build-compiled
578619
-$(MAKE) -C $(LLVM_BUILDDIR_withtype) clean
579620

580-
distclean-llvm:
621+
distclean-llvm: distclean-libcxx distclean-libcxxabi
581622
-rm -rf $(LLVM_TAR) $(LLVM_CLANG_TAR) \
582623
$(LLVM_COMPILER_RT_TAR) $(LLVM_LIBCXX_TAR) $(LLVM_LLDB_TAR) \
583624
$(LLVM_SRC_DIR) $(LLVM_BUILDDIR_withtype)

0 commit comments

Comments
 (0)