From 2b5a159732045d46be5716e13950e952c848da41 Mon Sep 17 00:00:00 2001 From: Jaromil Date: Thu, 26 Dec 2024 17:40:06 +0100 Subject: [PATCH] fix: embed own source and refactor build a bit --- GNUmakefile | 15 +++++----- build/embed-source.sh | 64 +++++++++++++++++++++++++++++++++++++++++++ build/init.mk | 44 +++++++++++++++++++++++++++++ build/linux.mk | 15 +--------- build/musl.mk | 16 +---------- build/osx.mk | 15 +--------- build/win-native.mk | 26 +++--------------- build/win-wsl.mk | 31 ++------------------- 8 files changed, 125 insertions(+), 101 deletions(-) create mode 100644 build/embed-source.sh diff --git a/GNUmakefile b/GNUmakefile index 6b88cc8..9f9ae10 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -25,28 +25,27 @@ _: ## ------: ## __ Production targets musl-linux: ## 🗿 Build a fully static cjit using musl-libc on Linux - $(MAKE) -f build/musl.mk + $(MAKE) -f build/musl.mk lib/tinycc/libtcc.a embed-musl cjit @rm -f .build_done* date | tee .build_done_musl linux-x86: ## 🐧 Build a dynamically linked cjit using libs found on Linux x86 - $(MAKE) -f build/linux.mk + $(MAKE) -f build/linux.mk embed-posix cjit @rm -f .build_done* date | tee .build_done_linux win-wsl: ## 🪟 Build cjit.exe for WIN64 on an Ubuntu WSL VM using gcc-mingw-w64 - $(MAKE) -f build/win-wsl.mk + $(MAKE) -f build/win-wsl.mk cross-win embed-win cjit.exe @rm -f .build_done* date | tee .build_done_win win-native: ## 🪟 Build cjit.exe for WIN64 on Windows Server - cd ./lib/tinycc; bash configure --targetos=WIN32 --config-backtrace=no; make libtcc.a libtcc1.a - $(MAKE) -f build/win-native.mk + $(MAKE) -f build/win-native.mk embed-win cjit.exe @rm -f .build_done* date | tee .build_done_win apple-osx: ## 🍎 Build cjit.command for Apple/OSX using clang static - $(MAKE) -f build/osx.mk + $(MAKE) -f build/osx.mk embed-posix cjit.command @rm -f .build_done* date | tee .build_done_osx @@ -54,11 +53,11 @@ _: ## ------: ## __ Debugging targets debug-gdb: ## 🔬 Build using the address sanitizer to detect memory leaks - $(MAKE) -f build/linux.mk GDB=1 + $(MAKE) -f build/linux.mk embed-posix cjit GDB=1 date | tee .build_done_linux debug-asan: ## 🔬 Build using the address sanitizer to detect memory leaks - $(MAKE) -f build/linux.mk ASAN=1 + $(MAKE) -f build/linux.mk embed-posix cjit ASAN=1 date | tee .build_done_linux _: ## diff --git a/build/embed-source.sh b/build/embed-source.sh new file mode 100644 index 0000000..aabcce5 --- /dev/null +++ b/build/embed-source.sh @@ -0,0 +1,64 @@ +#!/bin/bash + +dst=src/embed_source.c + +[ -r src/assets.h ] || { + >&2 echo "Build must generate src/assets.h first" + exit 1 +} + +[ -r src/assets.c ] || { + >&2 echo "Build must generate src/assets.c first" + exit 1 +} + +command -v xxd > /dev/null || { + >&2 echo "Error not found: xxd binary not installed" + exit 1 +} + +set -e +#set -x + +name=cjit_source +[ -r ${dst} ] && exit 0 + +mkdir -p pristine && cd pristine +rm -rf ${name}* +if [ -r ../.git/config ]; then + git clone ../ ${name} + rm -rf ${name}/.git* +else + rsync -rax ../ --exclude pristine ${name} +fi + +tar --format ustar -czf ../${name}.tar.gz ${name} +cd - +echo "// Embedded: $path" > $dst +echo "// source generated by cjit/build/embed-path.sh" >> $dst +echo "// `date`" >> $dst +echo "// ${name}" >> $dst +mv ${name}.tar.gz ${name} +xxd -i ${name} >> $dst +rm -f ${name} + +# must be constant variables in stack +# sed inplace is not portable +if [[ "$OSTYPE" == "darwin"* ]]; then + sed -i'' -e 's/unsigned char/const char/' $dst + sed -i'' -e 's/unsigned int/const unsigned int/' $dst +else + sed -i -e 's/unsigned char/const char/' $dst + sed -i -e 's/unsigned int/const unsigned int/' $dst +fi + +# xxd already converts dots in underscores +varname=`echo $name | sed 's/\./_/g'` + +# generate assets in source for extract_assets(char *tmpdir) +echo >> src/assets.h +echo "extern char *${varname};" >> src/assets.h +echo "extern unsigned int ${varname}_len;" >> src/assets.h +echo >> src/assets.h + +exit 0 diff --git a/build/init.mk b/build/init.mk index 8351559..0b67ac8 100644 --- a/build/init.mk +++ b/build/init.mk @@ -27,3 +27,47 @@ tinycc_config ?= --cc=${cc} --extra-cflags="${cflags}" --extra-ldflags="${ldflag ifdef DEBUG tinycc_config += --debug endif + +embed-posix: lib/tinycc/libtcc1.a + $(info Embedding assets for POSIX build) + bash build/init-assets.sh + bash build/embed-asset-path.sh lib/tinycc/libtcc1.a + bash build/embed-asset-path.sh lib/tinycc/include + bash build/embed-asset-path.sh assets/misc + bash build/embed-asset-path.sh assets/stb + @echo >> src/assets.c + @echo "return(true);" >> src/assets.c + @echo "}" >> src/assets.c + bash build/embed-source.sh + @echo >> src/assets.h + @echo "#endif" >> src/assets.h + +embed-win: lib/tinycc/libtcc.a lib/tinycc/libtcc1.a + $(info Embedding assets for Windows build) + bash build/init-assets.sh + bash build/embed-asset-path.sh lib/tinycc/libtcc1.a + bash build/embed-asset-path.sh lib/tinycc/include + bash build/embed-asset-path.sh lib/tinycc/win32/include tinycc_win32 + bash build/embed-asset-path.sh assets/win32ports + bash build/embed-asset-path.sh assets/misc + bash build/embed-asset-path.sh assets/stb + @echo >> src/assets.c + @echo "return(true);" >> src/assets.c + @echo "}" >> src/assets.c + bash build/embed-source.sh + @echo >> src/assets.h + @echo "#endif" >> src/assets.h + +embed-musl: lib/tinycc/libtcc1.a + $(info Generating assets) + bash build/init-assetss.sh + bash build/embed-asset-path.sh lib/tinycc/libtcc1.a + bash build/embed-asset-path.sh lib/tinycc/include + bash build/embed-asset-path.sh assets/misc + bash build/embed-asset-path.sh /lib/x86_64-linux-musl/libc.so + bash build/embed-asset-path.sh assets/stb + @echo >> src/assets.c + @echo "return(true);" >> src/assets.c + @echo "}" >> src/assets.c + @echo >> src/assets.h + @echo "#endif" >> src/assets.h diff --git a/build/linux.mk b/build/linux.mk index aff5fd2..97a358d 100644 --- a/build/linux.mk +++ b/build/linux.mk @@ -13,20 +13,7 @@ SOURCES += \ src/embed_misc.o \ src/embed_stb.o -all: embed cjit - -embed: lib/tinycc/libtcc1.a - $(info Generating assets) - bash build/init-assets.sh - bash build/embed-asset-path.sh lib/tinycc/libtcc1.a - bash build/embed-asset-path.sh lib/tinycc/include - bash build/embed-asset-path.sh assets/misc - bash build/embed-asset-path.sh assets/stb - @echo >> src/assets.c - @echo "return(true);" >> src/assets.c - @echo "}" >> src/assets.c - @echo >> src/assets.h - @echo "#endif" >> src/assets.h +all: embed-posix cjit tinycc_config += --with-libgcc ifeq ($(shell sestatus | awk -F': *' '/SELinux status:/ {print $2}'), enabled) diff --git a/build/musl.mk b/build/musl.mk index c65625b..31215e8 100644 --- a/build/musl.mk +++ b/build/musl.mk @@ -24,21 +24,7 @@ SOURCES += \ tinycc_config += --config-musl --enable-static tynycc_config += --extra-cflags=-static --extra-ldflags=-static -all: lib/tinycc/libtcc.a embed cjit - -embed: lib/tinycc/libtcc1.a - $(info Generating assets) - bash build/init-assetss.sh - bash build/embed-asset-path.sh lib/tinycc/libtcc1.a - bash build/embed-asset-path.sh lib/tinycc/include - bash build/embed-asset-path.sh assets/misc - bash build/embed-asset-path.sh /lib/x86_64-linux-musl/libc.so - bash build/embed-asset-path.sh assets/stb - @echo >> src/assets.c - @echo "return(true);" >> src/assets.c - @echo "}" >> src/assets.c - @echo >> src/assets.h - @echo "#endif" >> src/assets.h +all: lib/tinycc/libtcc.a embed-musl cjit cjit: ${SOURCES} $(cc) $(cflags) -o $@ $(SOURCES) ${ldadd} diff --git a/build/osx.mk b/build/osx.mk index ea150db..6db222e 100644 --- a/build/osx.mk +++ b/build/osx.mk @@ -10,20 +10,7 @@ SOURCES += \ src/embed_misc.o \ src/embed_stb.o -all: embed cjit.command - -embed: lib/tinycc/libtcc1.a - $(info Generating assets) - bash build/init-assets.sh - bash build/embed-asset-path.sh lib/tinycc/libtcc1.a - bash build/embed-asset-path.sh lib/tinycc/include - bash build/embed-asset-path.sh assets/misc - bash build/embed-asset-path.sh assets/stb - @echo >> src/assets.c - @echo "return(true);" >> src/assets.c - @echo "}" >> src/assets.c - @echo >> src/assets.h - @echo "#endif" >> src/assets.h +all: embed-posix cjit.command cjit.command: ${SOURCES} $(cc) $(cflags) -o $@ $(SOURCES) ${ldflags} ${ldadd} diff --git a/build/win-native.mk b/build/win-native.mk index a7c8504..81ff8d0 100755 --- a/build/win-native.mk +++ b/build/win-native.mk @@ -20,6 +20,8 @@ cflags += -DCJIT_BUILD_WIN ldflags := -static-libgcc ldadd := lib/tinycc/libtcc.a -lshlwapi +tinycc_config += --targetos=WIN32 --config-backtrace=no + SOURCES += src/win-compat.o \ src/embed_libtcc1.a.o \ src/embed_include.o \ @@ -28,31 +30,11 @@ SOURCES += src/win-compat.o \ src/embed_misc.o \ src/embed_stb.o -all: embed cjit.exe - -embed: lib/tinycc/libtcc1.a - $(info Generating assets) - bash build/init-assets.sh - bash build/embed-asset-path.sh lib/tinycc/libtcc1.a - bash build/embed-asset-path.sh lib/tinycc/include - bash build/embed-asset-path.sh lib/tinycc/win32/include tinycc_win32 - bash build/embed-asset-path.sh assets/win32ports - bash build/embed-asset-path.sh assets/misc - bash build/embed-asset-path.sh assets/stb - @echo >> src/assets.c - @echo "return(true);" >> src/assets.c - @echo "}" >> src/assets.c - @echo >> src/assets.h - @echo "#endif" >> src/assets.h +all: embed-win cjit.exe cjit.exe: ${SOURCES} $(cc) $(cflags) -o $@ $(SOURCES) ${ldflags} ${ldadd} # libtcc is built by CI -.c.o: - $(cc) \ - $(cflags) \ - -c $< -o $@ \ - -DVERSION=\"${VERSION}\" \ - -DCURRENT_YEAR=\"${CURRENT_YEAR}\" +include build/deps.mk diff --git a/build/win-wsl.mk b/build/win-wsl.mk index 9a5c7a7..83bf6b3 100644 --- a/build/win-wsl.mk +++ b/build/win-wsl.mk @@ -26,42 +26,17 @@ SOURCES += src/win-compat.o \ src/embed_misc.o \ src/embed_stb.o -all: deps embed cjit.exe - -embed: lib/tinycc/libtcc1.a - $(info Generating assets) - bash build/init-assets.sh - bash build/embed-asset-path.sh lib/tinycc/libtcc1.a - bash build/embed-asset-path.sh lib/tinycc/include - bash build/embed-asset-path.sh lib/tinycc/win32/include tinycc_win32 - bash build/embed-asset-path.sh assets/win32ports - bash build/embed-asset-path.sh assets/misc - bash build/embed-asset-path.sh assets/stb - @echo >> src/assets.c - @echo "return(true);" >> src/assets.c - @echo "}" >> src/assets.c - @echo >> src/assets.h - @echo "#endif" >> src/assets.h +all: cross-win embed-win cjit.exe cjit.exe: ${SOURCES} - ./build/stamp-exe.sh + bash build/stamp-exe.sh $(cc) $(cflags) -o $@ $(SOURCES) cjit.res ${ldflags} ${ldadd} -deps: +cross-win: @cd lib/tinycc && ./configure ${tinycc_config} @$(MAKE) -C lib/tinycc cross-x86_64-win32 @${MAKE} -C lib/tinycc libtcc.a @${MAKE} -C lib/tinycc libtcc1.a @mv lib/tinycc/x86_64-win32-libtcc1.a lib/tinycc/libtcc1.a -# @bash build/embed-headers.sh win -# @sed -i 's/unsigned char/const char/' src/embed-headers.c -# @sed -i 's/unsigned int/const unsigned int/' src/embed-headers.c - include build/deps.mk -# .c.o: -# $(cc) \ -# $(cflags) \ -# -c $< -o $@ \ -# -DVERSION=\"${VERSION}\" \ -# -DCURRENT_YEAR=\"${CURRENT_YEAR}\"