Compare commits
	
		
			46 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| ef1065278b | |||
| 391a58dffc | |||
| bd4b7763d4 | |||
| 33ce9e38d2 | |||
| 409aa4ffb4 | |||
| b951abd511 | |||
| 2171eaeed6 | |||
| 7075a9ad58 | |||
| 9025a85bcc | |||
| 3342b87fd0 | |||
| cd4b20b701 | |||
| fc120f4f33 | |||
| b8d5a76ee7 | |||
| 009d4a3421 | |||
| 460d5820da | |||
| 83e84c3ebf | |||
| eeb1953d87 | |||
| e9707563d7 | |||
| 11d0593c9e | |||
| 22a5abd279 | |||
| 8c047d6083 | |||
| 1832a39ed3 | |||
| 2a00526666 | |||
| 1f72016fc2 | |||
| a522cdc583 | |||
| 37230435aa | |||
| 737dda2960 | |||
| 0d468bf245 | |||
| b0baae79ba | |||
| ecd243ed0d | |||
| b9d0458a65 | |||
| 7fb2227034 | |||
| 0e49773bf4 | |||
| 5684623164 | |||
| 14f2f7cf1f | |||
| 37e38daf36 | |||
| b65a92d147 | |||
| 173b6d6dd0 | |||
| 2da20a4eba | |||
| c9ef8a6484 | |||
| be63d61cf4 | |||
| 9fd40e9617 | |||
| 116d309962 | |||
| 6845594e6a | |||
| 69ae9afb88 | |||
| 3ae3ceaabb | 
							
								
								
									
										14
									
								
								.build.yml
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								.build.yml
									
									
									
									
									
								
							| @@ -1,14 +0,0 @@ | ||||
| pipeline: | ||||
|   build: | ||||
|     image: codingworkshop/oscw-runner:latest | ||||
|     commands: | ||||
|       - CORES=10 ./build-linux.sh | ||||
|   publish: | ||||
|     image: codingworkshop/oscw-runner:latest | ||||
|     secrets: | ||||
|       - OSCW_GITHUB_USERNAME | ||||
|       - OSCW_GITHUB_PASSWORD | ||||
|     when: | ||||
|       event: tag | ||||
|     commands: | ||||
|       - github_publish $OSCW_GITHUB_USERNAME $OSCW_GITHUB_PASSWORD $(ls xtchain-*-linux.tar.zst) | ||||
							
								
								
									
										20
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | ||||
| name: Builds | ||||
| run-name: ${{ github.actor }} runs Gitea Actions | ||||
| on: [push] | ||||
|  | ||||
| jobs: | ||||
|   XTChain: | ||||
|     runs-on: oscw | ||||
|     container: | ||||
|       image: codingworkshop/oscw-runner:latest | ||||
|     steps: | ||||
|       - name: Clone repository | ||||
|         uses: actions/checkout@v3 | ||||
|       - name: Build XTChain | ||||
|         run: CORES=10 ./build-linux.sh | ||||
|       - name: Publish binaries | ||||
|         if: startsWith(github.ref, 'refs/tags/') | ||||
|         env: | ||||
|           OSCW_GITHUB_USERNAME: ${{ secrets.OSCW_GITHUB_USERNAME }} | ||||
|           OSCW_GITHUB_PASSWORD: ${{ secrets.OSCW_GITHUB_PASSWORD }} | ||||
|         run: github_publish $OSCW_GITHUB_USERNAME $OSCW_GITHUB_PASSWORD $(ls xtchain-*-linux.tar.zst) | ||||
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| binaries/* | ||||
| sources/* | ||||
| xtchain-*.zst | ||||
							
								
								
									
										25
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								README.md
									
									
									
									
									
								
							| @@ -1,3 +1,26 @@ | ||||
| <p align=center> | ||||
|   <a href="https://git.codingworkshop.eu.org/xt-sys/xtchain"> | ||||
|     <img alt="GIT Repository" src="https://img.shields.io/badge/Source-GIT-purple"> | ||||
|   </a> | ||||
|   <a href="https://git.codingworkshop.eu.org/xt-sys/xtchain/actions"> | ||||
|     <img alt="Build Status" src="https://codingworkshop.eu.org/actions.php?project=xt-sys/xtchain"> | ||||
|   </a> | ||||
|   <a href="https://github.com/xt-sys/xtchain/releases"> | ||||
|     <img alt="Releases" src="https://img.shields.io/github/v/release/xt-sys/xtchain?label=Release&color=blueviolet"> | ||||
|   </a> | ||||
|   <a href="https://git.codingworkshop.eu.org/xt-sys/xtchain/src/branch/master/COPYING.md"> | ||||
|     <img alt="License" src="https://img.shields.io/badge/License-GPLv3-blue.svg"> | ||||
|   </a> | ||||
|   <a href="https://github.com/sponsors/xt-sys/"> | ||||
|     <img alt="Sponsors" src="https://img.shields.io/badge/Sponsor-%E2%9D%A4-red?logo=GitHub"> | ||||
|   </a> | ||||
|   <a href="https://discord.com/invite/zBzJ5qMGX7"> | ||||
|     <img alt="Discord" src="https://img.shields.io/badge/Chat-Join%20Discord-success"> | ||||
|   </a> | ||||
| </p> | ||||
|  | ||||
| --- | ||||
|  | ||||
| ## XT Toolchain | ||||
| This is a LLVM/Clang/LLD based mingw-w64 toolchain. It currently supports C and C++, and provides | ||||
| a variety of tools including IDL, message and resource compilers. The XT Toolchain is also the | ||||
| @@ -11,10 +34,10 @@ Benefits of a LLVM based MinGW toolchain are: | ||||
|  | ||||
| This software includes: | ||||
|  * CMake | ||||
|  * GNU Assembler | ||||
|  * LLVM | ||||
|  * Make | ||||
|  * Mingw-w64 | ||||
|  * NASM | ||||
|  * Ninja | ||||
|  * Wine | ||||
|  | ||||
|   | ||||
							
								
								
									
										120
									
								
								build-linux.sh
									
									
									
									
									
								
							
							
						
						
									
										120
									
								
								build-linux.sh
									
									
									
									
									
								
							| @@ -18,17 +18,17 @@ GENERIC="generic-w64-mingw32" | ||||
|  | ||||
| # CMake Settings | ||||
| CMAKEDIR="${SRCDIR}/cmake" | ||||
| CMAKETAG="v3.24.2" | ||||
| CMAKETAG="v3.31.3" | ||||
| CMAKEVCS="https://gitlab.kitware.com/cmake/cmake.git" | ||||
|  | ||||
| # LLVM Settings | ||||
| LLVMDIR="${SRCDIR}/llvm" | ||||
| LLVMTAG="llvmorg-15.0.6" | ||||
| LLVMTAG="llvmorg-19.1.6" | ||||
| LLVMVCS="https://github.com/llvm/llvm-project.git" | ||||
|  | ||||
| # Make Settings | ||||
| MAKEDIR="${SRCDIR}/make" | ||||
| MAKETAG="4.3" | ||||
| MAKETAG="4.4.1" | ||||
| MAKEVCS="git://git.savannah.gnu.org/make" | ||||
|  | ||||
| # Mingw-w64 Settings | ||||
| @@ -38,20 +38,15 @@ MINGWTAG="master" | ||||
| MINGWNTV="0x601" | ||||
| MINGWVCS="https://github.com/mirror/mingw-w64.git" | ||||
|  | ||||
| # NASM Settings | ||||
| NASMDIR="${SRCDIR}/nasm" | ||||
| NASMTAG="nasm-2.15.05" | ||||
| NASMVCS="https://github.com/netwide-assembler/nasm.git" | ||||
|  | ||||
| # Ninja Settings | ||||
| NINJADIR="${SRCDIR}/ninja" | ||||
| NINJATAG="v1.11.0" | ||||
| NINJATAG="v1.12.1" | ||||
| NINJAVCS="https://github.com/ninja-build/ninja.git" | ||||
|  | ||||
| # Wine Settings | ||||
| WINEDIR="${SRCDIR}/wine" | ||||
| WINETAG="wine-7.9" | ||||
| WINEVCS="git://source.winehq.org/git/wine.git" | ||||
| WINETAG="wine-9.8" | ||||
| WINEVCS="https://github.com/wine-mirror/wine.git" | ||||
|  | ||||
|  | ||||
| # This function applies a patches to the 3rd party project | ||||
| @@ -100,9 +95,8 @@ cmake_fetch() | ||||
| { | ||||
|     if [ ! -d ${CMAKEDIR} ]; then | ||||
|         echo ">>> Downloading CMAKE ..." | ||||
|         git clone ${CMAKEVCS} ${CMAKEDIR} | ||||
|         git clone --depth 1 --branch ${CMAKETAG} ${CMAKEVCS} ${CMAKEDIR} | ||||
|         cd ${CMAKEDIR} | ||||
|         git checkout tags/${CMAKETAG} | ||||
|         apply_patches ${CMAKEDIR##*/} ${CMAKETAG} | ||||
|         cd ${WRKDIR} | ||||
|     fi | ||||
| @@ -136,18 +130,18 @@ llvm_build() | ||||
|     done | ||||
|     mkdir -p ${LLVMDIR}/llvm/build | ||||
|     cd ${LLVMDIR}/llvm/build | ||||
|     cmake \ | ||||
|     cmake -G Ninja \ | ||||
|         -DCMAKE_BUILD_TYPE="Release" \ | ||||
|         -DCMAKE_INSTALL_PREFIX=${BINDIR} \ | ||||
|         -DLLDB_INCLUDE_TESTS=FALSE \ | ||||
|         -DLLVM_ENABLE_ASSERTIONS=FALSE \ | ||||
|         -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;lld" \ | ||||
|         -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;lld;lldb" \ | ||||
|         -DLLVM_INSTALL_TOOLCHAIN_ONLY=ON \ | ||||
|         -DLLVM_LINK_LLVM_DYLIB=ON \ | ||||
|         -DLLVM_TARGETS_TO_BUILD="$(echo ${LLVM_ARCHS[@]} | tr ' ' ';')" \ | ||||
|         -DLLVM_TOOLCHAIN_TOOLS="llvm-addr2line;llvm-ar;llvm-as;llvm-cov;llvm-cvtres;llvm-dlltool;llvm-lib;llvm-ml;llvm-nm;llvm-objdump;llvm-objcopy;llvm-pdbutil;llvm-profdata;llvm-ranlib;llvm-rc;llvm-readelf;llvm-readobj;llvm-strings;llvm-strip;llvm-symbolizer;llvm-windres" \ | ||||
|         .. | ||||
|         make -j${CORES} install/strip | ||||
|         ninja install/strip | ||||
|         cd ${WRKDIR} | ||||
| } | ||||
|  | ||||
| @@ -159,15 +153,17 @@ llvm_build_libs() | ||||
|         [ -z ${CLEAN} ] || rm -rf ${LLVMDIR}/runtimes/build-${ARCH} | ||||
|         mkdir -p ${LLVMDIR}/runtimes/build-${ARCH} | ||||
|         cd ${LLVMDIR}/runtimes/build-${ARCH} | ||||
|         cmake \ | ||||
|         cmake -G Ninja \ | ||||
|             -DCMAKE_BUILD_TYPE="Release" \ | ||||
|             -DCMAKE_INSTALL_PREFIX=${BINDIR}/${ARCH}-w64-mingw32 \ | ||||
|             -DCMAKE_INSTALL_PREFIX="${BINDIR}/${ARCH}-w64-mingw32" \ | ||||
|             -DCMAKE_AR="${BINDIR}/bin/llvm-ar" \ | ||||
|             -DCMAKE_C_COMPILER="${BINDIR}/bin/${ARCH}-w64-mingw32-clang" \ | ||||
|             -DCMAKE_C_COMPILER_WORKS=1 \ | ||||
|             -DCMAKE_C_FLAGS_INIT=-mguard=cf \ | ||||
|             -DCMAKE_CXX_COMPILER="${BINDIR}/bin/${ARCH}-w64-mingw32-clang++" \ | ||||
|             -DCMAKE_CXX_COMPILER_TARGET=${ARCH}-w64-windows-gnu \ | ||||
|             -DCMAKE_CXX_COMPILER_WORKS=1 \ | ||||
|             -DCMAKE_CXX_FLAGS_INIT=-mguard=cf \ | ||||
|             -DCMAKE_CROSSCOMPILING=TRUE \ | ||||
|             -DCMAKE_RANLIB="${BINDIR}/bin/llvm-ranlib" \ | ||||
|             -DCMAKE_SYSTEM_NAME="Windows" \ | ||||
| @@ -175,13 +171,13 @@ llvm_build_libs() | ||||
|             -DLLVM_ENABLE_RUNTIMES="libunwind;libcxxabi;libcxx" \ | ||||
|             -DLIBUNWIND_USE_COMPILER_RT=TRUE \ | ||||
|             -DLIBUNWIND_ENABLE_SHARED=TRUE \ | ||||
|             -DLIBUNWIND_ENABLE_STATIC=FALSE \ | ||||
|             -DLIBUNWIND_ENABLE_STATIC=TRUE \ | ||||
|             -DLIBCXX_USE_COMPILER_RT=ON \ | ||||
|             -DLIBCXX_ENABLE_SHARED=TRUE \ | ||||
|             -DLIBCXX_ENABLE_STATIC=FALSE \ | ||||
|             -DLIBCXX_ENABLE_STATIC=TRUE \ | ||||
|             -DLIBCXX_ENABLE_EXPERIMENTAL_LIBRARY=OFF \ | ||||
|             -DLIBCXX_ENABLE_STATIC_ABI_LIBRARY=TRUE \ | ||||
|             -DLIBCXX_CXX_ABI=libcxxabi \ | ||||
|             -DLIBCXX_CXX_ABI="libcxxabi" \ | ||||
|             -DLIBCXX_LIBDIR_SUFFIX="" \ | ||||
|             -DLIBCXX_INCLUDE_TESTS=FALSE \ | ||||
|             -DLIBCXX_ENABLE_ABI_LINKER_SCRIPT=FALSE \ | ||||
| @@ -190,8 +186,8 @@ llvm_build_libs() | ||||
|             -DLIBCXXABI_LIBDIR_SUFFIX="" \ | ||||
|             -DLIBCXXABI_USE_LLVM_UNWINDER=ON \ | ||||
|             .. | ||||
|         make -j${CORES} | ||||
|         make install | ||||
|         ninja | ||||
|         ninja install | ||||
|     done | ||||
|     cd ${WRKDIR} | ||||
| } | ||||
| @@ -204,21 +200,28 @@ llvm_build_runtime() | ||||
|         [ -z ${CLEAN} ] || rm -rf ${LLVMDIR}/compiler-rt/build-${ARCH} | ||||
|         mkdir -p ${LLVMDIR}/compiler-rt/build-${ARCH} | ||||
|         cd ${LLVMDIR}/compiler-rt/build-${ARCH} | ||||
|         cmake \ | ||||
|         cmake -G Ninja \ | ||||
|             -DCMAKE_BUILD_TYPE="Release" \ | ||||
|             -DCMAKE_AR="${BINDIR}/bin/llvm-ar" \ | ||||
|             -DCMAKE_C_COMPILER="${BINDIR}/bin/${ARCH}-w64-mingw32-clang" \ | ||||
|             -DCMAKE_C_COMPILER_TARGET="${ARCH}-windows-gnu" \ | ||||
|             -DCMAKE_C_FLAGS_INIT="-mguard=cf" \ | ||||
|             -DCMAKE_CXX_COMPILER="${BINDIR}/bin/${ARCH}-w64-mingw32-clang++" \ | ||||
|             -DCMAKE_INSTALL_PREFIX=${BINDIR}/lib/clang/${LLVMTAG##*-} \ | ||||
|             -DCMAKE_CXX_FLAGS_INIT="-mguard=cf" \ | ||||
|             -DCMAKE_FIND_ROOT_PATH="${BINDIR}/${ARCH}-w64-mingw32" \ | ||||
|             -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY \ | ||||
|             -DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ONLY \ | ||||
|             -DCMAKE_INSTALL_PREFIX=$(${BINDIR}/bin/${ARCH}-w64-mingw32-clang --print-resource-dir) \ | ||||
|             -DCMAKE_RANLIB="${BINDIR}/bin/llvm-ranlib" \ | ||||
|             -DCMAKE_SYSTEM_NAME="Windows" \ | ||||
|             -DCOMPILER_RT_BUILD_BUILTINS=TRUE \ | ||||
|             -DCOMPILER_RT_DEFAULT_TARGET_ONLY=TRUE \ | ||||
|             -DCOMPILER_RT_USE_BUILTINS_LIBRARY=TRUE \ | ||||
|             -DSANITIZER_CXX_ABI=libc++ \ | ||||
|             -DLLVM_CONFIG_PATH="" \ | ||||
|             -DSANITIZER_CXX_ABI="libc++" \ | ||||
|             ../lib/builtins | ||||
|             make -j${CORES} | ||||
|             make install | ||||
|             ninja | ||||
|             ninja install | ||||
|     done | ||||
|     cd ${WRKDIR} | ||||
| } | ||||
| @@ -228,9 +231,8 @@ llvm_fetch() | ||||
| { | ||||
|     if [ ! -d ${LLVMDIR} ]; then | ||||
|         echo ">>> Downloading LLVM ..." | ||||
|         git clone ${LLVMVCS} ${LLVMDIR} | ||||
|         git clone --depth 1 --branch ${LLVMTAG} ${LLVMVCS} ${LLVMDIR} | ||||
|         cd ${LLVMDIR} | ||||
|         git checkout tags/${LLVMTAG} | ||||
|         apply_patches ${LLVMDIR##*/} ${LLVMTAG##*-} | ||||
|         cd ${WRKDIR} | ||||
|     fi | ||||
| @@ -265,9 +267,8 @@ make_fetch() | ||||
| { | ||||
|     if [ ! -d ${MAKEDIR} ]; then | ||||
|         echo ">>> Downloading Make ..." | ||||
|         git clone ${MAKEVCS} ${MAKEDIR} | ||||
|         git clone --depth 1 --branch ${MAKETAG} ${MAKEVCS} ${MAKEDIR} | ||||
|         cd ${MAKEDIR} | ||||
|         git checkout tags/${MAKETAG} | ||||
|         apply_patches ${MAKEDIR##*/} ${MAKETAG} | ||||
|         cd ${WRKDIR} | ||||
|     fi | ||||
| @@ -302,6 +303,7 @@ mingw_build_crt() | ||||
|             --prefix=${BINDIR}/${ARCH}-w64-mingw32 \ | ||||
|             --with-sysroot=${BINDIR} \ | ||||
|             --with-default-msvcrt=${MINGWLIB} \ | ||||
|             --enable-cfguard \ | ||||
|             ${FLAGS} | ||||
|         make -j${CORES} | ||||
|         make install | ||||
| @@ -347,7 +349,9 @@ mingw_build_libs() | ||||
|             ../configure \ | ||||
|                 --host=${ARCH}-w64-mingw32 \ | ||||
|                 --prefix=${BINDIR}/${ARCH}-w64-mingw32 \ | ||||
|                 --libdir=${BINDIR}/${ARCH}-w64-mingw32/lib | ||||
|                 --libdir=${BINDIR}/${ARCH}-w64-mingw32/lib \ | ||||
|                 CFLAGS="-O2 -mguard=cf" \ | ||||
|                 CXXFLAGS="-O2 -mguard=cf" | ||||
|             make -j${CORES} | ||||
|             make install | ||||
|             PATH="${ORIGPATH}" | ||||
| @@ -359,7 +363,7 @@ mingw_build_libs() | ||||
| # This function compiles and installs MINGW tools | ||||
| mingw_build_tools() | ||||
| { | ||||
|     for TOOL in gendef genidl genlib genpeimg widl; do | ||||
|     for TOOL in gendef genidl genpeimg widl; do | ||||
|         for ARCH in ${ARCHS}; do | ||||
|             echo ">>> Building Mingw-w64 (tools) for ${ARCH} ..." | ||||
|             [ -z ${CLEAN} ] || rm -rf ${MINGWDIR}/mingw-w64-tools/${TOOL}/build-${ARCH} | ||||
| @@ -383,40 +387,13 @@ mingw_fetch() | ||||
| { | ||||
|     if [ ! -d ${MINGWDIR} ]; then | ||||
|         echo ">>> Downloading MinGW-w64 ..." | ||||
|         git clone ${MINGWVCS} ${MINGWDIR} | ||||
|         git clone --depth 1 --branch ${MINGWTAG} ${MINGWVCS} ${MINGWDIR} | ||||
|         cd ${MINGWDIR} | ||||
|         if [ x"${MINGWTAG}" != x"master" ]; then | ||||
|             git checkout tags/${MINGWTAG} | ||||
|         fi | ||||
|         apply_patches ${MINGWDIR##*/} ${MINGWTAG} | ||||
|         cd ${WRKDIR} | ||||
|     fi | ||||
| } | ||||
|  | ||||
| # This function compiles and installs NASM | ||||
| nasm_build() | ||||
| { | ||||
|     cd ${NASMDIR} | ||||
|     ./autogen.sh | ||||
|     ./configure | ||||
|     make -j${CORES} | ||||
|     install nasm ndisasm ${BINDIR}/bin/ | ||||
|     cd ${WRKDIR} | ||||
| } | ||||
|  | ||||
| # This function downloads NASM from VCS | ||||
| nasm_fetch() | ||||
| { | ||||
|     if [ ! -d ${NASMDIR} ]; then | ||||
|         echo ">>> Downloading NASM ..." | ||||
|         git clone ${NASMVCS} ${NASMDIR} | ||||
|         cd ${NASMDIR} | ||||
|         git checkout tags/${NASMTAG} | ||||
|         apply_patches ${NASMDIR##*/} ${NASMTAG##*-} | ||||
|         cd ${WRKDIR} | ||||
|     fi | ||||
| } | ||||
|  | ||||
| # This function compiles and installs NINJA | ||||
| ninja_build() | ||||
| { | ||||
| @@ -434,9 +411,8 @@ ninja_fetch() | ||||
| { | ||||
|     if [ ! -d ${NINJADIR} ]; then | ||||
|         echo ">>> Downloading NINJA ..." | ||||
|         git clone ${NINJAVCS} ${NINJADIR} | ||||
|         git clone --depth 1 --branch ${NINJATAG} ${NINJAVCS} ${NINJADIR} | ||||
|         cd ${NINJADIR} | ||||
|         git checkout tags/${NINJATAG} | ||||
|         apply_patches ${NINJADIR##*/} ${NINJATAG} | ||||
|         cd ${WRKDIR} | ||||
|     fi | ||||
| @@ -469,9 +445,8 @@ wine_fetch() | ||||
| { | ||||
|     if [ ! -d ${WINEDIR} ]; then | ||||
|         echo ">>> Downloading WINE ..." | ||||
|         git clone ${WINEVCS} ${WINEDIR} | ||||
|         git clone --depth 1 --branch ${WINETAG} ${WINEVCS} ${WINEDIR} | ||||
|         cd ${WINEDIR} | ||||
|         git checkout tags/${WINETAG} | ||||
|         apply_patches ${WINEDIR##*/} ${WINETAG##*-} | ||||
|         cd ${WRKDIR} | ||||
|     fi | ||||
| @@ -495,14 +470,13 @@ xtchain_build() | ||||
|         for EXEC in dlltool ld objdump; do | ||||
|             ln -sf ../${GENERIC}/bin/${EXEC}-wrapper ${BINDIR}/bin/${ARCH}-w64-mingw32-${EXEC} | ||||
|         done | ||||
|         for EXEC in windres xtcspecc; do | ||||
|         for EXEC in bin2c exetool windres xtcspecc; do | ||||
|             if [ ! -e ${BINDIR}/bin/${EXEC} ]; then | ||||
|                 gcc ${WRKDIR}/tools/${EXEC}.c -o ${BINDIR}/bin/${EXEC} | ||||
|             fi | ||||
|             ln -sf ${EXEC} ${BINDIR}/bin/${ARCH}-w64-mingw32-${EXEC} | ||||
|         done | ||||
|     done | ||||
|     cp ${WRKDIR}/scripts/exetool ${BINDIR}/bin/ | ||||
|     cp ${WRKDIR}/scripts/xtclib ${BINDIR}/lib/xtchain/ | ||||
|     cp ${WRKDIR}/scripts/xtchain ${BINDIR}/ | ||||
| } | ||||
| @@ -531,12 +505,6 @@ llvm_fetch | ||||
| # Build and install LLVM | ||||
| llvm_build | ||||
|  | ||||
| # Download NASM | ||||
| nasm_fetch | ||||
|  | ||||
| # Build and install NASM | ||||
| nasm_build | ||||
|  | ||||
| # Download Mingw-W64 | ||||
| mingw_fetch | ||||
|  | ||||
| @@ -585,12 +553,12 @@ ninja_build | ||||
| # Remove unneeded files to save disk space | ||||
| echo ">>> Removing unneeded files to save disk space ..." | ||||
| rm -rf ${BINDIR}/{doc,include,share/{bash-completion,emacs,info,locale,man,vim}} | ||||
| rm -rf ${BINDIR}/bin/{clang-{check,exdef-mapping,import-test,offload-*,rename,scan-deps},hmaptool,ld64.lld,wasm-ld} | ||||
| rm -rf ${BINDIR}/bin/amdgpu-arch,{clang-{check,exdef-mapping,import-test,offload-*,rename,scan-deps},diagtool,hmaptool,ld64.lld,modularize,nxptx-arch,wasm-ld} | ||||
|  | ||||
| # Save XT Toolchain version | ||||
| cd ${WRKDIR} | ||||
| : ${XTCVER:=$(git describe --exact-match --tags 2>/dev/null)} | ||||
| : ${XTCVER:=DEV} | ||||
| : ${XTCVER:=DEVEL} | ||||
| echo "${XTCVER}" > ${BINDIR}/Version | ||||
|  | ||||
| # Prepare archive | ||||
|   | ||||
| @@ -1,13 +0,0 @@ | ||||
| diff --git a/src/job.c b/src/job.c | ||||
| index d6e28d3..f8f6950 100644 | ||||
| --- a/src/job.c | ||||
| +++ b/src/job.c | ||||
| @@ -2391,7 +2391,7 @@ child_execute_job (struct childbase *child, int good_stdin, char **argv) | ||||
|            } | ||||
|        } | ||||
|   | ||||
| -    cmd = (char *)find_in_given_path (argv[0], p, 0); | ||||
| +    cmd = (char *)find_in_given_path (argv[0], p, 0, false); | ||||
|    } | ||||
|   | ||||
|    if (!cmd) | ||||
| @@ -1,79 +0,0 @@ | ||||
| #!/usr/bin/env python3 | ||||
|  | ||||
| import sys | ||||
| import struct | ||||
|  | ||||
| if len(sys.argv) < 3: | ||||
|     print("XTChain ExeTool for modifying PE/COFF image subsystem\nNot sufficient parametrs. '[PE/COFF Image File]' '[SubSystem]'") | ||||
|     sys.exit(1) | ||||
|  | ||||
| ImageFile = sys.argv[1] | ||||
| Subsystem = sys.argv[2].upper() | ||||
|  | ||||
| # Set proper subsystem | ||||
| if Subsystem == "UNKNOWN": | ||||
|     ImageSubsystem = 0x00 | ||||
| elif Subsystem == "NT_NATIVE": | ||||
|     ImageSubsystem = 0x01 | ||||
| elif Subsystem == "WINDOWS_GUI": | ||||
|     ImageSubsystem = 0x02 | ||||
| elif Subsystem == "WINDOWS_CLI": | ||||
|     ImageSubsystem = 0x03 | ||||
| elif Subsystem == "WINDOWS_CE_OLD": | ||||
|     ImageSubsystem = 0x04 | ||||
| elif Subsystem == "OS2_CUI": | ||||
|     ImageSubsystem = 0x05 | ||||
| elif Subsystem == "POSIX_CUI": | ||||
|     ImageSubsystem = 0x07 | ||||
| elif Subsystem == "NATIVE_WINDOWS": | ||||
|     ImageSubsystem = 0x08 | ||||
| elif Subsystem == "WINDOWS_CE_GUI": | ||||
|     ImageSubsystem = 0x09 | ||||
| elif Subsystem == "EFI_APPLICATION": | ||||
|     ImageSubsystem = 0x0A | ||||
| elif Subsystem == "EFI_BOOT_SERVICE_DRIVER": | ||||
|     ImageSubsystem = 0x0B | ||||
| elif Subsystem == "EFI_RUNTIME_DRIVER": | ||||
|     ImageSubsystem = 0x0C | ||||
| elif Subsystem == "EFI_ROM": | ||||
|     ImageSubsystem = 0x0D | ||||
| elif Subsystem == "XBOX": | ||||
|     ImageSubsystem = 0x0E | ||||
| elif Subsystem == "WINDOWS_BOOT_APPLICATION": | ||||
|     ImageSubsystem = 0x10 | ||||
| elif Subsystem == "XT_NATIVE_KERNEL": | ||||
|     ImageSubsystem = 0x14 | ||||
| elif Subsystem == "XT_NATIVE_APPLICATION": | ||||
|     ImageSubsystem = 0x15 | ||||
| elif Subsystem == "XT_NATIVE_DRIVER": | ||||
|     ImageSubsystem = 0x16 | ||||
| elif Subsystem == "XT_DYNAMIC_LIBRARY": | ||||
|     ImageSubsystem = 0x17 | ||||
| elif Subsystem == "XT_APPLICATION_CLI": | ||||
|     ImageSubsystem = 0x18 | ||||
| elif Subsystem == "XT_APPLICATION_GDI": | ||||
|     ImageSubsystem = 0x19 | ||||
| else: | ||||
|     print("Invalid subsystem privided") | ||||
|     exit(2) | ||||
|  | ||||
| # Open PE/COFF image file | ||||
| PeImage = open(sys.argv[1], "r+b") | ||||
|  | ||||
| # Get PE header | ||||
| PeImage.seek(0x3C) | ||||
| (PeHeader,)=struct.unpack("H", PeImage.read(2)) | ||||
|  | ||||
| # Get PE signature | ||||
| PeImage.seek(PeHeader) | ||||
| (PeSignature,)=struct.unpack("I", PeImage.read(4)) | ||||
| if PeSignature != 0x4550: | ||||
|     print("Invalid or corrupted PE header") | ||||
|  | ||||
| # Set new image subsystem | ||||
| PeImage.seek(PeHeader + 0x5C) | ||||
| print("Setting subsystem to " + str(ImageSubsystem)) | ||||
| PeImage.write(struct.pack("H", ImageSubsystem)) | ||||
|  | ||||
| # Close PE/COFF image file | ||||
| PeImage.close() | ||||
| @@ -51,11 +51,24 @@ chbuild() | ||||
| } | ||||
| export -f chbuild | ||||
|  | ||||
| # Prints help | ||||
| help() | ||||
| { | ||||
| 	version | ||||
| 	echo "XTChain defines an internal list of commands:" | ||||
| 	echo " * charch [arch]   - sets the target CPU architecture [aarch64/armv7/i686/amd64]" | ||||
| 	echo " * chbuild [type]  - sets build type [debug/release]" | ||||
| 	echo " * help            - prints this message" | ||||
| 	echo " * version         - prints XTChain and its components version" | ||||
| 	echo " * xbuild          - builds an application with a Ninja build system" | ||||
| } | ||||
| export -f help | ||||
|  | ||||
| # Displays version banner | ||||
| version() | ||||
| { | ||||
|     echo "###############################################################################" | ||||
|     echo "#                        XT Toolchain v${XTCVER} for Linux                          #" | ||||
|     echo "#                        XT Toolchain v${XTCVER} for Linux                        #" | ||||
|     echo "#               by Rafal Kupiec <belliash@codingworkshop.eu.org>              #" | ||||
|     echo "###############################################################################" | ||||
|     echo | ||||
| @@ -66,9 +79,26 @@ version() | ||||
|     echo "Wine Message Compiler Version: $(${XTCDIR}/bin/wmc -V | grep 'version' | cut -d' ' -f5)" | ||||
|     echo "Wine Resource Compiler Version: $(${XTCDIR}/bin/wrc --version | grep 'version' | cut -d' ' -f5)" | ||||
|     echo | ||||
|     charch ${TARGET} | ||||
|     chbuild DEBUG | ||||
|     charch ${TARGET:-amd64} | ||||
|     chbuild ${BUILD_TYPE:-DEBUG} | ||||
|     echo | ||||
|     echo | ||||
| } | ||||
| export -f version | ||||
|  | ||||
| # Builds application (wrapper to Ninja) | ||||
| xbuild() | ||||
| { | ||||
| 	if [ ! -f build.arch ]; then | ||||
| 		ninja "$@" | ||||
| 	else | ||||
| 		ARCH=$(cat build.arch) | ||||
| 		if [ x"${ARCH}" != x"${TARGET}" ]; then | ||||
| 			echo "Build is configured for '${ARCH}' while current target set to '${TARGET}'!" | ||||
| 			echo "Cannot continue until conflict is resolved ..." | ||||
| 			return 1 | ||||
| 		fi | ||||
| 		ninja "$@" | ||||
| 	fi | ||||
| } | ||||
| export -f xbuild | ||||
|   | ||||
							
								
								
									
										74
									
								
								tools/bin2c.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								tools/bin2c.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,74 @@ | ||||
| /** | ||||
|  * PROJECT:     XTchain | ||||
|  * LICENSE:     See COPYING.md in the top level directory | ||||
|  * FILE:        tools/bin2c.c | ||||
|  * DESCRIPTION: Binary to C converter | ||||
|  * DEVELOPERS:  Rafal Kupiec <belliash@codingworkshop.eu.org> | ||||
|  */ | ||||
|  | ||||
| #include "xtchain.h" | ||||
|  | ||||
| int main(int argc, char *argv[]) | ||||
| { | ||||
|     /* Check for proper number of arguments */ | ||||
|     if(argc != 4) | ||||
|     { | ||||
|         printf("Usage: %s <input binary> <output file> <structure name>\n", argv[0]); | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     /* Open the input binary file in binary mode */ | ||||
|     FILE *inputFile = fopen(argv[1], "rb"); | ||||
|     if(inputFile == NULL) | ||||
|     { | ||||
|         printf("Error: unable to open file %s\n", argv[1]); | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     /* Open the destination source code file in text mode */ | ||||
|     FILE *outputFile = fopen(argv[2], "w"); | ||||
|     if(outputFile == NULL) | ||||
|     { | ||||
|         printf("Error: unable to open file %s\n", argv[2]); | ||||
|         fclose(inputFile); | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     /* Get the size of the binary file */ | ||||
|     fseek(inputFile, 0, SEEK_END); | ||||
|     long binSize = ftell(inputFile); | ||||
|     rewind(inputFile); | ||||
|  | ||||
|     /* Allocate memory for the binary data */ | ||||
|     unsigned char *binData = (unsigned char *)malloc(binSize); | ||||
|     if(binData == NULL) | ||||
|     { | ||||
|         printf("Error: unable to allocate memory for binary data\n"); | ||||
|         fclose(inputFile); | ||||
|         fclose(outputFile); | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     /* Read the binary data into memory */ | ||||
|     fread(binData, sizeof(unsigned char), binSize, inputFile); | ||||
|  | ||||
|     /* Write the C structure to the header file */ | ||||
|     fprintf(outputFile, "unsigned char %s[] = {", argv[3]); | ||||
|     for(int i = 0; i < binSize; i++) | ||||
|     { | ||||
|         fprintf(outputFile, "0x%02X", binData[i]); | ||||
|         if(i < binSize - 1) | ||||
|         { | ||||
|             fprintf(outputFile, ","); | ||||
|         } | ||||
|     } | ||||
|     fprintf(outputFile, "};\nunsigned int %s_size = %ld;\n", argv[3], binSize); | ||||
|     free(binData); | ||||
|  | ||||
|     /* Close all open files */ | ||||
|     fclose(inputFile); | ||||
|     fclose(outputFile); | ||||
|  | ||||
|     printf("Binary data converted to C structure successfully.\n"); | ||||
|     return 0; | ||||
| } | ||||
							
								
								
									
										182
									
								
								tools/exetool.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										182
									
								
								tools/exetool.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,182 @@ | ||||
| /** | ||||
|  * PROJECT:     XTchain | ||||
|  * LICENSE:     See COPYING.md in the top level directory | ||||
|  * FILE:        tools/exetool.c | ||||
|  * DESCRIPTION: Portable Executable (PE) utility for changing its signature and subsystem | ||||
|  * DEVELOPERS:  Rafal Kupiec <belliash@codingworkshop.eu.org> | ||||
|  */ | ||||
|  | ||||
| #include "xtchain.h" | ||||
|  | ||||
| typedef struct _PE_SUBSYSTEM | ||||
| { | ||||
|     int Identifier; | ||||
|     char *Name; | ||||
| } PE_SUBSYSTEM, *PPE_SUBSYSTEM; | ||||
|  | ||||
| static PE_SUBSYSTEM SubSystems[] = { | ||||
|     {0x00, "INVALID_SUBSYSTEM"}, | ||||
|     {0x01, "NT_NATIVE"}, | ||||
|     {0x02, "WINDOWS_GUI"}, | ||||
|     {0x03, "WINDOWS_CLI"}, | ||||
|     {0x04, "WINDOWS_CE_OLD"}, | ||||
|     {0x05, "OS2_CUI"}, | ||||
|     {0x07, "POSIX_CUI"}, | ||||
|     {0x08, "NATIVE_WINDOWS"}, | ||||
|     {0x09, "WINDOWS_CE_GUI"}, | ||||
|     {0x0A, "EFI_APPLICATION"}, | ||||
|     {0x0B, "EFI_BOOT_SERVICE_DRIVER"}, | ||||
|     {0x0C, "EFI_RUNTIME_DRIVER"}, | ||||
|     {0x0D, "EFI_ROM"}, | ||||
|     {0x0E, "XBOX"}, | ||||
|     {0x10, "WINDOWS_BOOT_APPLICATION"}, | ||||
|     {0x14, "XT_NATIVE_KERNEL"}, | ||||
|     {0x15, "XT_NATIVE_APPLICATION"}, | ||||
|     {0x16, "XT_NATIVE_DRIVER"}, | ||||
|     {0x17, "XT_DYNAMIC_LIBRARY"}, | ||||
|     {0x18, "XT_APPLICATION_CLI"}, | ||||
|     {0x19, "XT_APPLICATION_GDI"} | ||||
| }; | ||||
|  | ||||
| PPE_SUBSYSTEM getSubSystem(char *Name) | ||||
| { | ||||
|     int Index; | ||||
|     int SubSystemsCount; | ||||
|     PPE_SUBSYSTEM SubSystem; | ||||
|  | ||||
|     /* Count number of subsystems avaialble */ | ||||
|     SubSystemsCount = sizeof(SubSystems) / sizeof(PE_SUBSYSTEM); | ||||
|  | ||||
|     /* Find subsystem */ | ||||
|     for(Index = 0; Index < SubSystemsCount; Index++) | ||||
|     { | ||||
|         SubSystem = &SubSystems[Index]; | ||||
|         if(strcasecmp(SubSystem->Name, Name) == 0) | ||||
|         { | ||||
|             /* Subsystem found, return its ID */ | ||||
|             return SubSystem; | ||||
|         } | ||||
|     } | ||||
|  | ||||
| 	/* No valid subsystem found */ | ||||
|     return &SubSystems[0]; | ||||
| } | ||||
|  | ||||
| char *getSubSystemName(int Identifier) | ||||
| { | ||||
|     int Index; | ||||
|     int SubSystemsCount; | ||||
|     PPE_SUBSYSTEM SubSystem; | ||||
|  | ||||
|     /* Count number of subsystems avaialble */ | ||||
|     SubSystemsCount = sizeof(SubSystems) / sizeof(PE_SUBSYSTEM); | ||||
|  | ||||
|     /* Find subsystem */ | ||||
|     for(Index = 0; Index < SubSystemsCount; Index++) | ||||
|     { | ||||
|         SubSystem = &SubSystems[Index]; | ||||
|         if(SubSystem->Identifier == Identifier) | ||||
|         { | ||||
|             /* Subsystem found, return its ID */ | ||||
|             return SubSystem->Name; | ||||
|         } | ||||
|     } | ||||
|  | ||||
| 	/* No valid subsystem found */ | ||||
|     return SubSystems[0].Name; | ||||
| } | ||||
|  | ||||
| int main(int argc, char *argv[]) | ||||
| { | ||||
|     FILE *ExeFile; | ||||
|     unsigned char Signature[4]; | ||||
|     unsigned int HeaderOffset; | ||||
|     unsigned int ImageSignature; | ||||
|     unsigned short SubSystem; | ||||
|     PPE_SUBSYSTEM NewSubSystem; | ||||
|  | ||||
|     /* Check for proper number of arguments */ | ||||
|     if(argc != 3) | ||||
|     { | ||||
|         printf("Usage: %s <filename> <new SubSystem>\n", argv[0]); | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     /* Parse the new SubSystem value from the command line argument */ | ||||
|     NewSubSystem = getSubSystem(argv[2]); | ||||
|     if(NewSubSystem->Identifier == 0) | ||||
|     { | ||||
|         /* Invalid SubSystem provided */ | ||||
|         printf("Error: %s is not a valid PE SubSystem\n", argv[2]); | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     /* Open the EXE file in binary mode */ | ||||
|     ExeFile = fopen(argv[1], "r+b"); | ||||
|     if(ExeFile == NULL) | ||||
|     { | ||||
|         /* Failed to open PE file */ | ||||
|         printf("ERROR: Unable to open file %s\n", argv[1]); | ||||
|         return 2; | ||||
|     } | ||||
|      | ||||
|     /* Verify that the input file has a valid DOS header */ | ||||
|     fread(Signature, sizeof(unsigned char), 4, ExeFile); | ||||
|     if(Signature[0] != 'M' || Signature[1] != 'Z') | ||||
|     { | ||||
|         /* Invalid DOS header */ | ||||
|         printf("ERROR: %s is not a valid EXE file\n", argv[1]); | ||||
|         fclose(ExeFile); | ||||
|         return 3; | ||||
|     } | ||||
|  | ||||
|     /* Verify that the input file has a valid PE header */ | ||||
|     fseek(ExeFile, 0x3C, SEEK_SET); | ||||
|     fread(&HeaderOffset, sizeof(unsigned int), 1, ExeFile); | ||||
|     fseek(ExeFile, HeaderOffset, SEEK_SET); | ||||
|     fread(Signature, sizeof(unsigned char), 4, ExeFile); | ||||
|     if((Signature[0] != 'P' || Signature[1] != 'E' || Signature[2] != 0 || Signature[3] != 0) && | ||||
|        (Signature[0] != 'P' || Signature[1] != 'E' || Signature[2] != 'X' || Signature[3] != 'T')) | ||||
|     { | ||||
|         /* Invalid PE header */ | ||||
|         printf("Error: %s is not a valid PE file\n", argv[1]); | ||||
|         fclose(ExeFile); | ||||
|         return 3; | ||||
|     } | ||||
|  | ||||
|     /* Check if setting XT subsystem */ | ||||
|     if(NewSubSystem->Identifier >= 0x14 && NewSubSystem->Identifier <= 0x19) | ||||
|     { | ||||
|         /* Write PEXT signature */ | ||||
|         ImageSignature = 0x54584550; | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         /* Write PE00 signature */ | ||||
|         ImageSignature = 0x00004550; | ||||
|     } | ||||
|  | ||||
|     /* Seek back to header offset and write new signature */ | ||||
|     fseek(ExeFile, HeaderOffset, SEEK_SET); | ||||
|     fwrite(&ImageSignature, sizeof(ImageSignature), 1, ExeFile); | ||||
|  | ||||
|     /* Seek to the offset of the SubSystem field in the optional header */ | ||||
|     fseek(ExeFile, HeaderOffset + 0x5C, SEEK_SET); | ||||
|  | ||||
|     /* Read the current SubSystem value */ | ||||
|     fread(&SubSystem, sizeof(unsigned short), 1, ExeFile); | ||||
|  | ||||
|     /* Seek back to the SubSystem field in the optional header */ | ||||
|     fseek(ExeFile, -sizeof(unsigned short), SEEK_CUR); | ||||
|  | ||||
|     /* Write the new SubSystem value */ | ||||
|     fwrite(&NewSubSystem->Identifier, sizeof(unsigned short), 1, ExeFile); | ||||
|  | ||||
|     /* Close the file */ | ||||
|     fclose(ExeFile); | ||||
|  | ||||
|     /* Finished successfully */ | ||||
|     printf("PE SubSystem modified: 0x%02X <%s> to 0x%02X <%s>\n", | ||||
|            SubSystem, getSubSystemName(SubSystem), NewSubSystem->Identifier, NewSubSystem->Name); | ||||
|     return 0; | ||||
| } | ||||
| @@ -169,9 +169,9 @@ void check_num_args(int arg, | ||||
| int main(int argc, | ||||
|          char* argv[]) | ||||
| { | ||||
|     const char *dir; | ||||
|     const char *basename; | ||||
|     const char *target; | ||||
|     char *dir; | ||||
|     char *basename; | ||||
|     char *target; | ||||
|  | ||||
|     split_argv(argv[0], &dir, &basename, &target, NULL); | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user