[ Please CC me I am not subscribed to all mailing-lists ] [ Please CC some more folks if you like ] Hi, when dealing/experimenting with BPF together with pahole/dwarves and dwarf-v5 and clang-lto I fell over that there is usage of CXX in tools directory. Especially, I wanted to build and run test_progs from BPF selftests. One BPF selftest called "test_cpp" used GNU/g++ (and even /usr/bin/ld) and NOT LLVM/clang++. For details see the linux-bpf/dwarves thread "[PATCH dwarves] dwarf_loader: handle DWARF5 DW_OP_addrx properly" in [1]. Lemme check: $ git grep CXX tools/ tools/build/Build.include:cxx_flags = -Wp,-MD,$(depfile) -Wp,-MT,$@ $(CXXFLAGS) -D"BUILD_STR(s)=\#s" $(CXXFLAGS_$(basetarget).o) $(CXXFLAGS_$(obj)) tools/build/Makefile.build:quiet_cmd_cxx_o_c = CXX $@ tools/build/Makefile.build: cmd_cxx_o_c = $(CXX) $(cxx_flags) -c -o $@ $< tools/build/Makefile.feature: feature-$(1) := $(shell $(MAKE) OUTPUT=$(OUTPUT_FEATURES) CC="$(CC)" CXX="$(CXX)" CFLAGS="$(EXTRA_CFLAGS) $(FEATURE_CHECK_CFLAGS-$(1))" CXXFLAGS="$(EXTRA_CXXFLAGS) $(FEATURE_CHECK_CXXFLAGS-$(1))" LDFLAGS="$(LDFLAGS) $(FEATURE_CHECK_LDFLAGS-$(1))" -C $(feature_dir) $(OUTPUT_FEATURES)test-$1.bin >/dev/nu ll 2>/dev/null && echo 1 || echo 0) tools/build/feature/Makefile:__BUILDXX = $(CXX) $(CXXFLAGS) -MD -Wall -Werror -o $@ $(patsubst %.bin,%.cpp,$(@F)) $(LDFLAGS) ... tools/perf/Makefile.config:USE_CXX = 0 tools/perf/Makefile.config: CXXFLAGS += -DHAVE_LIBCLANGLLVM_SUPPORT -I$(shell $(LLVM_CONFIG) --includedir) tools/perf/Makefile.config: $(call detected,CONFIG_CXX) tools/perf/Makefile.config: USE_CXX = 1 tools/perf/Makefile.perf:export srctree OUTPUT RM CC CXX LD AR CFLAGS CXXFLAGS V BISON FLEX AWK tools/perf/Makefile.perf:ifeq ($(USE_CXX), 1) tools/perf/util/Build:perf-$(CONFIG_CXX) += c++/ ... tools/scripts/Makefile.include:$(call allow-override,CXX,$(CROSS_COMPILE)g++) ... tools/testing/selftests/bpf/Makefile:CXX ?= $(CROSS_COMPILE)g++ tools/testing/selftests/bpf/Makefile: $(call msg,CXX,,$@) tools/testing/selftests/bpf/Makefile: $(Q)$(CXX) $(CFLAGS) $^ $(LDLIBS) -o $@ The problem is if you pass LLVM=1 there is no clang(++) assigned to CXX automagically. [2] says: LLVM has substitutes for GNU binutils utilities. Kbuild supports LLVM=1 to enable them. make LLVM=1 They can be enabled individually. The full list of the parameters: make CC=clang LD=ld.lld AR=llvm-ar NM=llvm-nm STRIP=llvm-strip \ OBJCOPY=llvm-objcopy OBJDUMP=llvm-objdump READELF=llvm-readelf \ HOSTCC=clang HOSTCXX=clang++ HOSTAR=llvm-ar HOSTLD=ld.lld [ EndOfQuote ] So you need to pass CXX=clang++ manually when playing in tools directory: MAKE="make V=1 MAKE_OPTS="HOSTCC=clang HOSTCXX=clang++ HOSTLD=ld.lld CC=clang CXX=clang++ LD=ld.lld LLVM=1 LLVM_IAS=1" MAKE_OPTS="MAKE_OPTS $PAHOLE=/opt/pahole/bin/pahole" $ LC_ALL=C $MAKE $MAKE_OPTS -C tools/testing/selftests/bpf/ clean $ LC_ALL=C $MAKE $MAKE_OPTS -C tools/testing/selftests/bpf/ Unsure, if tools needs a special treatment in things of CXX or LLVM=1 needs to be enhanced with CCX=clang++. If we have HOSTCXX why not have a CXX in toplevel Makefile? In "tools: Factor Clang, LLC and LLVM utils definitions" (see [3]) I did some factor-ing. For the records: Here Linus Git is my base. Ideas? Thanks. Regards, - Sedat - P.S.: Just a small note: I know there is less usage of CXX code in the linux-kernel. [1] https://lore.kernel.org/bpf/CA+icZUWh6YOkCKG72SndqUbQNwG+iottO4=cPyRRVjaHD2=0qw@xxxxxxxxxxxxxx/T/#m22907f838d2d27be24e8959a53473a62f21cecea [2] https://www.kernel.org/doc/html/latest/kbuild/llvm.html#llvm-utilities [3] https://git.kernel.org/linus/211a741cd3e124bffdc13ee82e7e65f204e53f60