So, this went rather smooth. just had to copy over stuff from wasm.

The patch builds the compiler-rt libraries for windows. in short,
there will be 2 new files in libclang-rt-18-dev:

/usr/lib/llvm-18/lib/clang/18/lib/windows/libclang_rt.builtins-i386.a
/usr/lib/llvm-18/lib/clang/18/lib/windows/libclang_rt.builtins-x86_64.a

The result is that, aslong as mingw-w64-x86-64-dev is installed, this will work:
clang -rtlib=compiler-rt -target x86_64-w64-mingw test.cpp

Notably, I hard-coded those archs, windows support would make sense
for aarch64 and armv7 aswell.
I am unsure how the policy is, when to build which target
architecture, clang/llvm wont care.

maybe place all windows builtins into an libclang-rt-18-dev-w64
package for all architectures?

regards, Norbert

Am Di., 30. Apr. 2024 um 22:14 Uhr schrieb Norbert Lange <nolang...@gmail.com>:
>
> Am So., 28. Apr. 2024 um 18:17 Uhr schrieb Sylvestre Ledru
> <sylves...@debian.org>:
> >
> > Hello
> >
> >
> > Le 16/09/2023 à 00:29, Norbert Lange a écrit :
> > > Package: libclang-rt-16-dev
> > > Version: 1:16.0.6-3
> > > Severity: wishlist
> > > X-Debbugs-Cc: nolang...@gmail.com
> > >
> > > Adding the compiler-rt library for windows / mingw-64 would allow ease 
> > > building
> > > mingw-64 tools,
> > > the builtins seem to be pretty universal for any windows target.
> > >
> > > There is a project providing a full mingw toolchain for reference:
> > > https://github.com/mstorsjo/llvm-mingw
> > >
> > > I am able to create the builtins just with the mingw-w64-common package 
> > > and
> > > debians llvm/clang like this:
> >
> > Sorry but I am not a windows user (or interested by this space), could
> > you please provide a MR to implement this?
>
> I am not windows user (or interested by this space) but I am forced to build
> for it and I prefer still staying away from that OS as much as possible.
>
> The package is a a bit of a monster though, both in complexity as well
> as build-time.
> Any tips for hacking around?
>
> Ill try to look at 'build-wasm/compiler-rt-%'.
>
> I am meant to use STAGE2 binaries? Are those the final ones?
>
> Given that clang is a native crosscompiler, I guess it makes sense providing
> the mingw builtins as "all" package like libclang-rt-18-dev-wasm32?
>
> Ill see if I  find time for that next week.
>
> Regards, Norbert
diff -burN debian.orig/control debian/control
--- debian.orig/control	2024-04-04 07:52:43.000000000 +0200
+++ debian/control	2024-06-17 14:40:56.331727789 +0200
@@ -29,6 +29,7 @@
     llvm-spirv-18 [amd64 arm64 armhf i386 ppc64 ppc64el riscv64 s390x] <!stage1> | hello [amd64 arm64 armhf i386 ppc64 ppc64el riscv64 s390x] <!stage1>,
     spirv-tools [linux-any] <!stage1> | hello [linux-any],
     wasi-libc | hello,
+    mingw-w64-common [amd64 arm64 armhf i386],
     libcurl4-openssl-dev <!stage1> | libcurl-dev <!stage1>,
     libgrpc++-dev [amd64 arm64 armel armhf mips64el mipsel ppc64 ppc64el powerpc riscv64 s390x] <!stage1>,
     protobuf-compiler-grpc [amd64 arm64 armel armhf mips64el mipsel ppc64 ppc64el powerpc riscv64 s390x] <!stage1>,
diff -burN debian.orig/rules debian/rules
--- debian.orig/rules	2024-05-19 09:27:15.000000000 +0200
+++ debian/rules	2024-06-17 14:45:48.531063108 +0200
@@ -938,6 +938,38 @@
 STAGE_2_WASM_CFLAGS := $(filter-out -march=% -mfpu=% -fcf-protection% -mbranch-protection%, $(STAGE_2_CFLAGS))
 STAGE_2_WASM_CXXFLAGS := $(filter-out -march=% -mfpu=% -fcf-protection% -mbranch-protection%, $(STAGE_2_CXXFLAGS))
 
+build-mingw/compiler-rt-%: cpu = $(@:build-mingw/compiler-rt-%=%)
+build-mingw/compiler-rt-%:
+	@echo "Building compiler-rt for $(cpu)-w64-windows-gnu"
+	@echo "Using cmake: $(CMAKE_BIN)"
+	mkdir -p "$@"
+	$(CMAKE_BIN) -B "$@" -S compiler-rt/lib/builtins/ \
+		-G Ninja \
+		$(SCCACHE_CMAKE) \
+		-DCMAKE_SYSTEM_NAME=Windows \
+		-DCMAKE_SYSROOT=/usr/share/mingw-w64 \
+		-DCMAKE_C_COMPILER_TARGET=$(cpu)-w64-windows-gnu \
+		-DCMAKE_CXX_COMPILER_TARGET=$(cpu)-w64-windows-gnu \
+		-DCMAKE_ASM_COMPILER_TARGET=$(cpu)-w64-windows-gnu \
+		-DCMAKE_C_COMPILER=$(STAGE_2_BIN_DIR)/clang \
+		-DCMAKE_CXX_COMPILER=$(STAGE_2_BIN_DIR)/clang++ \
+		-DCMAKE_C_FLAGS="$(opt_flags)" \
+		-DCMAKE_CXX_FLAGS="$(opt_flags)" \
+		-DCMAKE_SHARED_LINKER_FLAGS="$(STAGE_2_LDFLAGS) -L$(STAGE_2_LIB_DIR)" \
+		-DCMAKE_MODULE_LINKER_FLAGS="$(STAGE_2_LDFLAGS) -L$(STAGE_2_LIB_DIR)" \
+		-DCMAKE_EXE_LINKER_FLAGS="$(STAGE_2_LDFLAGS) -L$(STAGE_2_LIB_DIR)" \
+		-DCMAKE_INSTALL_PREFIX=/usr/lib/llvm-$(LLVM_VERSION)/lib/clang/$(LLVM_VERSION) \
+		-DCMAKE_INSTALL_DATADIR=lib \
+		-DCMAKE_INSTALL_INCLUDEDIR=include \
+		-DLLVM_CMAKE_DIR=$(STAGE_2_BIN_DIR)/../ \
+		-DCOMPILER_RT_DEFAULT_TARGET_ONLY=ON \
+		-DCOMPILER_RT_USE_BUILTINS_LIBRARY=ON \
+		-DCOMPILER_RT_EXCLUDE_ATOMIC_BUILTIN=OFF \
+		-DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=ONLY \
+		-DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY \
+		-DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ONLY
+	ninja -C "$@" -j $(NJOBS) $(VERBOSE)
+
 build-wasm/compiler-rt-%: cpu = $(@:build-wasm/compiler-rt-%=%)
 build-wasm/compiler-rt-%:
 	@echo "Building compiler-rt for $(cpu)"
@@ -1062,6 +1094,13 @@
   build-wasm/compiler-rt-wasm64
 	touch $@
 
+# Build compiler-rt for wasm32 and wasm64. Build libcxx only for wasm32, as
+# libcxx requires wasi-libc, which only exists for wasm32 right now.
+stamps/debian-mingw-build: \
+  build-mingw/compiler-rt-x86_64\
+  build-mingw/compiler-rt-i686
+	touch $@
+
 stamps/sccache-stats:
 # If we used sccache, shows stats
 	if test -f $(SCCACHE_CMD); then \
@@ -1077,6 +1116,7 @@
   stamps/debian-libfuzzer-build \
   $(if $(filter libclc-%, $(packages)),stamps/debian-libclc-build) \
   $(if $(filter %-wasm32 %-wasm64, $(packages)),stamps/debian-wasm-build) \
+  stamps/debian-mingw-build \
   stamps/sccache-stats
 
 override_dh_prep: stamps/build_doc
@@ -1252,6 +1292,12 @@
 		DESTDIR=$(DEB_INST) ninja $(VERBOSE) -C build-wasm/libcxx-wasm32-wasi install; \
 	fi
 
+	if test -d build-mingw/compiler-rt-x86_64; then \
+		DESTDIR=$(DEB_INST) ninja $(VERBOSE) -C build-mingw/compiler-rt-x86_64 install; \
+	fi
+	if test -d build-mingw/compiler-rt-i686; then \
+		DESTDIR=$(DEB_INST) ninja $(VERBOSE) -C build-mingw/compiler-rt-i686 install; \
+	fi
 
 # Rename binaries
 	mkdir -p $(DEB_INST)/usr/bin/

Reply via email to