1
0
원본 프로젝트 : xt-sys/xtchain

64 커밋

작성자 SHA1 메시지 날짜
6808e3b1d7 Update PE file subsystem together with signature 2024-01-18 14:34:25 +01:00
c152b99327 Disable dependency tracking 2023-12-14 21:51:41 +01:00
a458cb0219 Build CRT 2023-12-14 21:49:01 +01:00
9219ebca83 Build mingw headers 2023-12-14 19:58:04 +01:00
11cc5e47bc Use crosscompiler to build LLVM 2023-12-14 16:40:10 +01:00
fc8f97b84d Add missing extension 2023-12-14 16:33:28 +01:00
63a9e40408 Fix path 2023-12-14 16:32:25 +01:00
6664e9be64 Add missing extensions 2023-12-14 16:30:58 +01:00
12ed36ca0e Initial windows crosscompilation script 2023-12-14 16:29:07 +01:00
79cca854bc Get rid of windres wrapper and temporarily disable pipeline for this branch 2023-12-14 16:15:35 +01:00
460d5820da Minimize exetool's output 2023-11-28 15:21:17 +01:00
83e84c3ebf Update LLVM to 17.0.6 2023-11-28 14:51:07 +01:00
eeb1953d87 Improve performance with Git shallow clone and add .gitignore
Reviewed-on: xt-sys/xtchain#5
Reviewed-by: Rafal Kupiec <belliash@noreply.codingworkshop.git>
Co-authored-by: Pedro Valadés <perikiyoxd@gmail.com>
Co-committed-by: Pedro Valadés <perikiyoxd@gmail.com>
2023-11-23 23:13:06 +01:00
e9707563d7 Update LLVM to 17.0.5 2023-11-14 12:24:00 +01:00
11d0593c9e Add 'help' and 'xbuild' commands; fix 'version' command overriding build settings 2023-11-08 19:41:22 +01:00
22a5abd279 Update release badge color 2023-11-07 15:09:38 +01:00
8c047d6083 Add releases link to readme 2023-11-07 15:07:04 +01:00
1832a39ed3 Update LLVM to 17.0.4 2023-10-31 19:08:00 +01:00
2a00526666 Update LLVM to 17.0.3 2023-10-17 23:36:43 +02:00
1f72016fc2 Print original/new subsystem names and turn new subsystem name case insensitive 2023-10-17 22:12:46 +02:00
a522cdc583 Massive toolchain update 2023-10-04 16:05:03 +02:00
37230435aa Add bin2c utility 2023-09-28 22:47:04 +02:00
737dda2960 Update LLVM to 17.0.1 2023-09-21 15:09:24 +02:00
0d468bf245 Cleanup after NASM removal 2023-07-28 23:07:02 +02:00
b0baae79ba Update badge and URL for CI/CD 2023-07-18 14:55:02 +02:00
ecd243ed0d Better way to check if building from tag 2023-07-15 09:00:33 +02:00
b9d0458a65 Migrate to Gitea Actions 2023-07-13 23:16:29 +02:00
7fb2227034 Update LLVM to 16.0.6 2023-06-21 21:33:02 +02:00
0e49773bf4 Upgrade LLVM to 16.0.5 2023-06-03 09:47:03 +02:00
5684623164 Upgrade LLVM and rewrite exetool in C 2023-05-17 15:17:58 +02:00
14f2f7cf1f Update used software list 2023-03-29 22:43:20 +02:00
37e38daf36 Update versioning strategy 2023-03-29 22:42:25 +02:00
b65a92d147 Add accidentally removed ninja_build() function 2023-03-28 21:57:18 +02:00
173b6d6dd0 Enable control flow guard and fix LLVM compilation 2023-03-28 07:09:15 +02:00
2da20a4eba Use ninja as build system; reconfigure LLVM and enable LLDB 2023-03-26 17:45:22 +02:00
c9ef8a6484 Get rid of NASM 2023-03-26 13:19:09 +02:00
be63d61cf4 Unify README look'n'feel 2023-03-26 12:42:28 +02:00
9fd40e9617 Import missing binutils patches 2023-03-26 09:40:15 +02:00
116d309962 Update LLVM and add GAS from binutils 2023-03-25 22:59:27 +01:00
6845594e6a Update LLVM to 15.0.7 2023-02-19 16:26:26 +01:00
69ae9afb88 Correct URL 2023-01-07 10:19:56 +01:00
3ae3ceaabb Add shields 2023-01-07 10:19:00 +01:00
361c0a1cdb Add exetool for modifying PE/COFF image subsystem 2023-01-06 16:23:54 +01:00
d6531be5ee Update LLVM 2022-12-17 12:10:08 +01:00
771d3783fa Update LLVM 2022-11-08 23:32:18 +01:00
2e7c7ec1d7 Update LLVM to 15.0.2 2022-10-05 08:25:06 +02:00
99f0b83ac7 Add missing cmake patch 2022-10-02 14:29:45 +02:00
9cc7d052dd Update cmake, llvm and mingw 2022-09-28 18:09:27 +02:00
abefcf8fe2 Remove old LLVM patch 2022-09-28 15:51:43 +02:00
015bc8a666 Install llvm-lib, a lib.exe compatible tool 2022-08-09 18:43:15 +02:00
546d8718d2 Reimplement new pipeline and allow limiting number of cores used fo build
Co-authored-by: belliash <belliash@codingworkshop.eu.org>
Reviewed-on: xt-sys/xtchain#3
Reviewed-by: Piotr Likoski <likoski@noreply.codingworkshop.git>
2022-07-25 15:21:17 +02:00
a65685de5c Rewrite pipeline 2022-07-22 22:50:10 +02:00
f9af39e058 Allow xtchain to be launched by root 2022-07-22 22:48:22 +02:00
9b7d73e0e9 Update LLVM 2022-06-29 09:46:44 +02:00
8eb76f6b90 Update LLVM to 14.0.5 2022-06-17 13:40:22 +02:00
00c659911d Make XTchain great again 2022-05-29 15:05:09 +02:00
b1de0a02b6 Update Mingw64 to v10.0.0 2022-05-28 14:24:41 +02:00
36df8e42e6 Update LLVM to 14.0.4 2022-05-28 12:37:01 +02:00
7d802e0835 Merge branch 'llvm_toolchain' into master 2022-05-28 12:35:49 +02:00
1904f94583 Update cmake, ninja & wine packages 2022-05-28 12:09:43 +02:00
3096bf9255 Return 0 when printing help or version in the windres tool. 2021-02-02 18:20:19 +01:00
fdd5e32ea0 Update readme. 2021-02-02 18:17:12 +01:00
3a35c39c8e Update readme. 2021-02-02 18:14:50 +01:00
51284f1845 Import readme and license. 2020-08-17 07:59:45 +02:00
16개의 변경된 파일1196개의 추가작업 그리고 3872개의 파일을 삭제

파일 보기

@@ -1,8 +0,0 @@
kind: pipeline
type: exec
name: XT Toolchain Pipeline
steps:
- name: Compile XT Toolchain
commands:
- sh build-linux.sh

20
.github/workflows/build.yml.DISABLE 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
파일 보기

@@ -0,0 +1,3 @@
binaries/*
sources/*
xtchain-*.zst

파일 보기

@@ -1,7 +1,30 @@
<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&amp;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/3zgjQDVmAe">
<img alt="Discord" src="https://img.shields.io/discord/723186294540206100?label=Chat">
</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
official build environment for compiling XT software, including the FerretOS. Currently, it is
official build environment for compiling XT software, including the XT OS. Currently, it is
targeted at Linux host only, however it should be possible to build it in MSYS2 as well.
Benefits of a LLVM based MinGW toolchain are:
@@ -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

파일 보기

@@ -16,41 +16,41 @@ WRKDIR="$(pwd)"
ARCHS="aarch64 armv7 i686 x86_64"
GENERIC="generic-w64-mingw32"
# Binutils Settings
BINUTILSDIR="${SRCDIR}/binutils"
BINUTILSTAG="binutils-2_41"
BINUTILSVCS="git://sourceware.org/git/binutils-gdb.git"
# CMake Settings
CMAKEDIR="${SRCDIR}/cmake"
CMAKETAG="v3.19.2"
CMAKETAG="v3.27.6"
CMAKEVCS="https://gitlab.kitware.com/cmake/cmake.git"
# LLVM Settings
LLVMDIR="${SRCDIR}/llvm"
LLVMTAG="llvmorg-11.0.0"
LLVMTAG="llvmorg-17.0.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
MINGWDIR="${SRCDIR}/mingw-w64"
MINGWLIB="ucrt"
MINGWTAG="v8.0.0"
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.10.0"
NINJATAG="v1.11.1"
NINJAVCS="https://github.com/ninja-build/ninja.git"
# Wine Settings
WINEDIR="${SRCDIR}/wine"
WINETAG="wine-5.15"
WINETAG="wine-8.17"
WINEVCS="git://source.winehq.org/git/wine.git"
@@ -79,6 +79,50 @@ apply_patches()
fi
}
# This function compiles and installs GNU BINUTILS
binutils_build()
{
echo ">>> Building BINUTILS ..."
for ARCH in ${ARCHS}; do
[ -z ${CLEAN} ] || rm -rf ${BINUTILSDIR}/build-${ARCH}
mkdir -p ${BINUTILSDIR}/build-${ARCH}
cd ${BINUTILSDIR}/build-${ARCH}
case ${ARCH} in
"armv7")
TARGET="arm"
;;
*)
TARGET="${ARCH}"
;;
esac
../configure \
--target=${TARGET}-w64-mingw32 \
--disable-binutils \
--disable-gdb \
--disable-gprof \
--disable-ld \
--disable-multilib \
--disable-nls \
--disable-werror \
--with-zlib=yes
make -j${CORES}
cp ${BINUTILSDIR}/build-${ARCH}/gas/as-new ${BINDIR}/bin/${ARCH}-w64-mingw32-gas
done
cd ${WRKDIR}
}
# This function downloads GNU BINUTILS from VCS
binutils_fetch()
{
if [ ! -d ${BINUTILSDIR} ]; then
echo ">>> Downloading BINUTILS ..."
git clone --depth 1 --branch ${BINUTILSTAG} ${BINUTILSVCS} ${BINUTILSDIR}
cd ${BINUTILSDIR}
apply_patches ${BINUTILSDIR##*/} ${BINUTILSTAG##*-}
cd ${WRKDIR}
fi
}
# This function compiles and installs CMAKE
cmake_build()
{
@@ -100,9 +144,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
@@ -129,156 +172,71 @@ llvm_build()
done
LLVM_ARCHS=( $(for ARCH in ${LLVM_ARCHS[@]}; do echo ${ARCH}; done | sort -u) )
cd ${LLVMDIR}/llvm/tools
for UTIL in clang lld lldb; do
for UTIL in clang lld; do
if [ ! -e ${UTIL} ]; then
ln -sf ../../${UTIL} .
fi
done
mkdir -p ${LLVMDIR}/llvm/build
cd ${LLVMDIR}/llvm/build
cmake \
cmake -G Ninja \
-DCMAKE_BUILD_TYPE="Release" \
-DCMAKE_INSTALL_PREFIX=${BINDIR} \
-DLLDB_ENABLE_CURSES=FALSE \
-DLLDB_ENABLE_LIBEDIT=FALSE \
-DLLDB_ENABLE_LUA=FALSE \
-DLLDB_ENABLE_PYTHON=FALSE \
-DLLDB_INCLUDE_TESTS=FALSE \
-DLLVM_ENABLE_ASSERTIONS=FALSE \
-DLLVM_INSTALL_TOOLCHAIN_ONLY=TRUE \
-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="clang;llvm-addr2line;llvm-ar;llvm-as;llvm-cov;llvm-cvtres;llvm-dlltool;llvm-nm;llvm-objdump;llvm-objcopy;llvm-pdbutil;llvm-profdata;llvm-ranlib;llvm-rc;llvm-readobj;llvm-strings;llvm-strip;llvm-symbolizer" \
-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}
}
# This function compiles and install LIBCXX
llvm_build_libcxx()
# This function compiles and install LIBCXX & LIBUNWIND
llvm_build_libs()
{
echo ">>> Building LLVM libraries (libcxx) ..."
for ARCH in ${ARCHS}; do
[ -z ${CLEAN} ] || rm -rf ${LLVMDIR}/libcxx/build-${ARCH}
mkdir -p ${LLVMDIR}/libcxx/build-${ARCH}
cd ${LLVMDIR}/libcxx/build-${ARCH}
cmake \
[ -z ${CLEAN} ] || rm -rf ${LLVMDIR}/runtimes/build-${ARCH}
mkdir -p ${LLVMDIR}/runtimes/build-${ARCH}
cd ${LLVMDIR}/runtimes/build-${ARCH}
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_SHARED_LINKER_FLAGS="-lunwind" \
-DCMAKE_SYSTEM_NAME="Windows" \
-DLLVM_PATH="${LLVMDIR}/llvm" \
-DLIBCXX_CXX_ABI="libcxxabi" \
-DLIBCXX_CXX_ABI_INCLUDE_PATHS="../../libcxxabi/include" \
-DLIBCXX_CXX_ABI_LIBRARY_PATH="../../libcxxabi/build-${ARCH}/lib" \
-DLIBCXX_ENABLE_ABI_LINKER_SCRIPT=FALSE \
-DLIBCXX_ENABLE_EXCEPTIONS=TRUE \
-DLIBCXX_ENABLE_EXPERIMENTAL_LIBRARY=FALSE \
-DLIBCXX_ENABLE_FILESYSTEM=FALSE \
-DLIBCXX_ENABLE_MONOTONIC_CLOCK=TRUE \
-DLIBCXX_ENABLE_SHARED=TRUE \
-DLIBCXX_ENABLE_STATIC=TRUE \
-DLIBCXX_ENABLE_STATIC_ABI_LIBRARY=TRUE \
-DLIBCXX_ENABLE_THREADS=TRUE \
-DLIBCXX_HAS_WIN32_THREAD_API=TRUE \
-DLIBCXX_HAVE_CXX_ATOMICS_WITHOUT_LIB=TRUE \
-DLIBCXX_INCLUDE_TESTS=FALSE \
-DLIBCXX_INSTALL_HEADERS=TRUE \
-DLIBCXX_LIBDIR_SUFFIX="" \
-DLIBCXX_USE_COMPILER_RT=TRUE \
..
make -j${CORES}
make install
${BINDIR}/bin/llvm-ar qcsL \
${BINDIR}/${ARCH}-w64-mingw32/lib/libc++.dll.a \
${BINDIR}/${ARCH}-w64-mingw32/lib/libunwind.dll.a
${BINDIR}/bin/llvm-ar qcsL \
${BINDIR}/${ARCH}-w64-mingw32/lib/libc++.a \
${BINDIR}/${ARCH}-w64-mingw32/lib/libunwind.a
if [ ! -e ${BINDIR}/${ARCH}-w64-mingw32/bin ]; then
mkdir -p ${BINDIR}/${ARCH}-w64-mingw32/bin
fi
cp lib/libc++.dll ${BINDIR}/${ARCH}-w64-mingw32/bin/
done
cd ${WRKDIR}
}
# This function compiles LIBCXXABI
llvm_build_libcxxabi()
{
echo ">>> Building LLVM libraries (libcxxabi) ..."
for ARCH in ${ARCHS}; do
[ -z ${CLEAN} ] || rm -rf ${LLVMDIR}/libcxxabi/build-${ARCH}
mkdir -p ${LLVMDIR}/libcxxabi/build-${ARCH}
cd ${LLVMDIR}/libcxxabi/build-${ARCH}
cmake \
-DCMAKE_BUILD_TYPE="Release" \
-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_CROSSCOMPILING=TRUE \
-DCMAKE_CXX_COMPILER="${BINDIR}/bin/${ARCH}-w64-mingw32-clang++" \
-DCMAKE_CXX_COMPILER_WORKS=1 \
-DCMAKE_CXX_FLAGS="-D_LIBCPP_HAS_THREAD_API_WIN32 -D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS" \
-DCMAKE_RANLIB="${BINDIR}/bin/llvm-ranlib" \
-DCMAKE_SYSTEM_NAME="Windows" \
-DLLVM_PATH="${LLVMDIR}/llvm" \
-DLIBCXXABI_ENABLE_EXCEPTIONS=TRUE \
-DLIBCXXABI_ENABLE_NEW_DELETE_DEFINITIONS=FALSE \
-DLIBCXXABI_ENABLE_SHARED=FALSE \
-DLIBCXXABI_ENABLE_THREADS=TRUE \
-DLIBCXXABI_LIBCXX_INCLUDES="../../libcxx/include" \
-DLIBCXXABI_LIBDIR_SUFFIX="" \
-DLIBCXXABI_TARGET_TRIPLE="${ARCH}-w64-mingw32" \
-DLIBCXXABI_USE_COMPILER_RT=TRUE \
..
make -j${CORES}
done
cd ${WRKDIR}
}
# This function compiles and installs LIBUNWIND
llvm_build_libunwind()
{
echo ">>> Building LLVM libraries (libunwind) ..."
for ARCH in ${ARCHS}; do
[ -z ${CLEAN} ] || rm -rf ${LLVMDIR}/libunwind/build-${ARCH}
mkdir -p ${LLVMDIR}/libunwind/build-${ARCH}
cd ${LLVMDIR}/libunwind/build-${ARCH}
cmake \
-DCMAKE_BUILD_TYPE="Release" \
-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="-Wno-dll-attribute-on-redeclaration" \
-DCMAKE_CROSSCOMPILING=TRUE \
-DCMAKE_CXX_COMPILER="${BINDIR}/bin/${ARCH}-w64-mingw32-clang++" \
-DCMAKE_CXX_COMPILER_WORKS=1 \
-DCMAKE_CXX_FLAGS="-Wno-dll-attribute-on-redeclaration" \
-DCMAKE_SYSTEM_NAME="Windows" \
-DCMAKE_RANLIB="${BINDIR}/bin/llvm-ranlib" \
-DLLVM_COMPILER_CHECKED=TRUE \
-DLLVM_PATH="${LLVMDIR}/llvm" \
-DLIBUNWIND_ENABLE_CROSS_UNWINDING=FALSE \
-DLLVM_ENABLE_RUNTIMES="libunwind;libcxxabi;libcxx" \
-DLIBUNWIND_USE_COMPILER_RT=TRUE \
-DLIBUNWIND_ENABLE_SHARED=TRUE \
-DLIBUNWIND_ENABLE_STATIC=TRUE \
-DLIBUNWIND_ENABLE_THREADS=TRUE \
-DLIBUNWIND_USE_COMPILER_RT=TRUE \
-DLIBCXX_USE_COMPILER_RT=ON \
-DLIBCXX_ENABLE_SHARED=TRUE \
-DLIBCXX_ENABLE_STATIC=TRUE \
-DLIBCXX_ENABLE_EXPERIMENTAL_LIBRARY=OFF \
-DLIBCXX_ENABLE_STATIC_ABI_LIBRARY=TRUE \
-DLIBCXX_CXX_ABI="libcxxabi" \
-DLIBCXX_LIBDIR_SUFFIX="" \
-DLIBCXX_INCLUDE_TESTS=FALSE \
-DLIBCXX_ENABLE_ABI_LINKER_SCRIPT=FALSE \
-DLIBCXXABI_USE_COMPILER_RT=ON \
-DLIBCXXABI_ENABLE_SHARED=OFF \
-DLIBCXXABI_LIBDIR_SUFFIX="" \
-DLIBCXXABI_USE_LLVM_UNWINDER=ON \
..
make -j${CORES}
make install
if [ ! -e ${BINDIR}/${ARCH}-w64-mingw32/bin ]; then
mkdir -p ${BINDIR}/${ARCH}-w64-mingw32/bin
fi
cp lib/libunwind.dll ${BINDIR}/${ARCH}-w64-mingw32/bin/
ninja
ninja install
done
cd ${WRKDIR}
}
@@ -291,43 +249,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}
case ${ARCH} in
"armv7")
BARCH="armv7"
LARCH="arm"
;;
"i686")
if [ ! -e ${BINDIR}/i386-w64-mingw32 ]; then
ln -sf i686-w64-mingw32 ${BINDIR}/i386-w64-mingw32
fi
BARCH="i386"
LARCH="i386"
;;
*)
BARCH="${ARCH}"
LARCH="${ARCH}"
;;
esac
cmake \
cmake -G Ninja \
-DCMAKE_BUILD_TYPE="Release" \
-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_TARGET="${BARCH}-windows-gnu" \
-DCMAKE_C_COMPILER_WORKS=1 \
-DCMAKE_C_COMPILER_TARGET="${ARCH}-windows-gnu" \
-DCMAKE_C_FLAGS_INIT="-mguard=cf" \
-DCMAKE_CXX_COMPILER="${BINDIR}/bin/${ARCH}-w64-mingw32-clang++" \
-DCMAKE_CXX_COMPILER_WORKS=1 \
-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}
mkdir -p ${BINDIR}/lib/clang/${LLVMTAG#*-}/lib/windows
for LIB in lib/windows/libclang_rt.*.a; do
cp ${LIB} ${BINDIR}/lib/clang/${LLVMTAG#*-}/lib/windows/$(basename ${LIB} | sed s/${BARCH}/${LARCH}/)
done
ninja
ninja install
done
cd ${WRKDIR}
}
@@ -337,9 +280,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
@@ -374,9 +316,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
@@ -411,6 +352,7 @@ mingw_build_crt()
--prefix=${BINDIR}/${ARCH}-w64-mingw32 \
--with-sysroot=${BINDIR} \
--with-default-msvcrt=${MINGWLIB} \
--enable-cfguard \
${FLAGS}
make -j${CORES}
make install
@@ -456,7 +398,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}"
@@ -492,38 +436,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}
git checkout tags/${MINGWTAG}
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()
{
@@ -541,9 +460,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
@@ -557,9 +475,10 @@ wine_build()
cd ${WINEDIR}/build
../configure \
-enable-win64 \
--without-freetype \
--without-x
for TOOL in winedump wmc wrc; do
make -j${CORES} tools/${TOOL}
make -j${CORES} tools/${TOOL}/all
cp tools/${TOOL}/${TOOL} ${BINDIR}/bin/
for ARCH in ${ARCHS}; do
if [ ! -e ${BINDIR}/bin/${ARCH}-w64-mingw32-${TOOL} ]; then
@@ -575,9 +494,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
@@ -601,7 +519,7 @@ 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 xtcspecc; do
if [ ! -e ${BINDIR}/bin/${EXEC} ]; then
gcc ${WRKDIR}/tools/${EXEC}.c -o ${BINDIR}/bin/${EXEC}
fi
@@ -616,16 +534,12 @@ xtchain_build()
# Exit immediately on any failure
set -e
# Check if script launched as root
if [ "$(whoami)" = "root" ]; then
echo "This script cannot be run as root!"
exit 1
fi
# Check number of CPU cores available
: ${CORES:=$(sysctl -n hw.ncpu 2>/dev/null)}
: ${CORES:=$(nproc 2>/dev/null)}
: ${CORES:=1}
if [[ ! -n ${CORES} ]]; then
: ${CORES:=$(sysctl -n hw.ncpu 2>/dev/null)}
: ${CORES:=$(nproc 2>/dev/null)}
: ${CORES:=1}
fi
# Create working directories
mkdir -p ${BINDIR}
@@ -640,12 +554,6 @@ llvm_fetch
# Build and install LLVM
llvm_build
# Download NASM
nasm_fetch
# Build and install NASM
nasm_build
# Download Mingw-W64
mingw_fetch
@@ -658,16 +566,20 @@ mingw_build_crt
# Build and install LLVM compiler runtime
llvm_build_runtime
# Build and install LLVM compiler libraries
llvm_build_libs
# Build and install Mingw-W64 libraries
mingw_build_libs
# Build and install Mingw-W64 tools
mingw_build_tools
# Build LLVM libraries
llvm_build_libunwind
llvm_build_libcxxabi
llvm_build_libcxx
# Download Binutils
binutils_fetch
# Build and install Binutils
binutils_build
# Download Wine
wine_fetch
@@ -696,12 +608,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

699
build-windows.sh Executable file
파일 보기

@@ -0,0 +1,699 @@
#!/bin/bash
# PROJECT: XTchain
# LICENSE: See the COPYING.md in the top level directory
# FILE: build-linux.sh
# DESCRIPTION: Toolchain building and assembly script
# DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
# Working Directories
BINDIR="$(pwd)/binaries"
PCHDIR="$(pwd)/patches"
SRCDIR="$(pwd)/sources"
WRKDIR="$(pwd)"
# Architecture Settings
ARCHS="aarch64 armv7 i686 x86_64"
GENERIC="generic-w64-mingw32"
# Binutils Settings
BINUTILSDIR="${SRCDIR}/binutils"
BINUTILSTAG="binutils-2_41"
BINUTILSVCS="git://sourceware.org/git/binutils-gdb.git"
# CMake Settings
CMAKEDIR="${SRCDIR}/cmake"
CMAKETAG="v3.27.6"
CMAKEVCS="https://gitlab.kitware.com/cmake/cmake.git"
# LLVM Settings
LLVMDIR="${SRCDIR}/llvm"
LLVMTAG="llvmorg-17.0.6"
LLVMVCS="https://github.com/llvm/llvm-project.git"
# Make Settings
MAKEDIR="${SRCDIR}/make"
MAKETAG="4.4.1"
MAKEVCS="git://git.savannah.gnu.org/make"
# Mingw-w64 Settings
MINGWDIR="${SRCDIR}/mingw-w64"
MINGWLIB="ucrt"
MINGWTAG="master"
MINGWNTV="0x601"
MINGWVCS="https://github.com/mirror/mingw-w64.git"
# Ninja Settings
NINJADIR="${SRCDIR}/ninja"
NINJATAG="v1.11.1"
NINJAVCS="https://github.com/ninja-build/ninja.git"
# Wine Settings
WINEDIR="${SRCDIR}/wine"
WINETAG="wine-8.17"
WINEVCS="git://source.winehq.org/git/wine.git"
# This function applies a patches to the 3rd party project
apply_patches()
{
local PACKAGE="${1}"
local VERSION="${2}"
if [ -d "${PCHDIR}/${PACKAGE}/${VERSION}" ]; then
PATCHES="$(find ${PCHDIR}/${PACKAGE}/${VERSION} -name '*.diff' -o -name '*.patch' | sort -n)"
echo ">>> Applying custom patches ..."
for PATCH in ${PATCHES}; do
if [ -f "${PATCH}" ] && [ -r "${PATCH}" ]; then
for PREFIX in {0..5}; do
if patch -i${PATCH} -p${PREFIX} --silent --dry-run >/dev/null; then
patch -i${PATCH} -p${PREFIX} --silent
echo ">>> Patch ${PATCH} applied ..."
break;
elif [ ${PREFIX} -ge 5 ]; then
echo "Patch ${PATCH} does not fit. Failed applying patch ..."
return 1
fi
done
fi
done
fi
}
# This function compiles and installs GNU BINUTILS
binutils_build_OLD()
{
echo ">>> Building BINUTILS ..."
for ARCH in ${ARCHS}; do
[ -z ${CLEAN} ] || rm -rf ${BINUTILSDIR}/build-${ARCH}
mkdir -p ${BINUTILSDIR}/build-${ARCH}
cd ${BINUTILSDIR}/build-${ARCH}
case ${ARCH} in
"armv7")
TARGET="arm"
;;
*)
TARGET="${ARCH}"
;;
esac
../configure \
--target=${TARGET}-w64-mingw32 \
--disable-binutils \
--disable-gdb \
--disable-gprof \
--disable-ld \
--disable-multilib \
--disable-nls \
--disable-werror \
--with-zlib=yes
make -j${CORES}
cp ${BINUTILSDIR}/build-${ARCH}/gas/as-new ${BINDIR}/bin/${ARCH}-w64-mingw32-gas
done
cd ${WRKDIR}
}
# This function downloads GNU BINUTILS from VCS
binutils_fetch()
{
if [ ! -d ${BINUTILSDIR} ]; then
echo ">>> Downloading BINUTILS ..."
git clone --depth 1 --branch ${BINUTILSTAG} ${BINUTILSVCS} ${BINUTILSDIR}
cd ${BINUTILSDIR}
apply_patches ${BINUTILSDIR##*/} ${BINUTILSTAG##*-}
cd ${WRKDIR}
fi
}
# This function compiles and installs CMAKE
cmake_build_OLD()
{
echo ">>> Building CMAKE ..."
[ -z ${CLEAN} ] || rm -rf ${CMAKEDIR}/build-${GENERIC}
mkdir -p ${CMAKEDIR}/build-${GENERIC}
cd ${CMAKEDIR}/build-${GENERIC}
../bootstrap \
--prefix=${BINDIR} \
--parallel=${CORES} \
-- -DCMAKE_USE_OPENSSL=OFF
make -j${CORES}
make install
cd ${WRKDIR}
}
# This function downloads CMAKE from VCS
cmake_fetch()
{
if [ ! -d ${CMAKEDIR} ]; then
echo ">>> Downloading CMAKE ..."
git clone --depth 1 --branch ${CMAKETAG} ${CMAKEVCS} ${CMAKEDIR}
cd ${CMAKEDIR}
apply_patches ${CMAKEDIR##*/} ${CMAKETAG}
cd ${WRKDIR}
fi
}
# This function compiles and install LLVM
llvm_build_OLD()
{
echo ">>> Building LLVM ..."
[ -z ${CLEAN} ] || rm -rf ${LLVMDIR}/llvm/build
LLVM_ARCHS=()
for ARCH in ${ARCHS}; do
case ${ARCH} in
"aarch64")
LLVM_ARCHS+=( "AArch64" )
;;
"armv7")
LLVM_ARCHS+=( "ARM" )
;;
"i686"|"x86_64")
LLVM_ARCHS+=( "X86" )
;;
esac
done
LLVM_ARCHS=( $(for ARCH in ${LLVM_ARCHS[@]}; do echo ${ARCH}; done | sort -u) )
cd ${LLVMDIR}/llvm/tools
for UTIL in clang lld; do
if [ ! -e ${UTIL} ]; then
ln -sf ../../${UTIL} .
fi
done
mkdir -p ${LLVMDIR}/llvm/build
cd ${LLVMDIR}/llvm/build
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;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" \
..
ninja install/strip
cd ${WRKDIR}
}
# This function compiles and install LIBCXX & LIBUNWIND
llvm_build_libs_OLD()
{
echo ">>> Building LLVM libraries (libcxx) ..."
for ARCH in ${ARCHS}; do
[ -z ${CLEAN} ] || rm -rf ${LLVMDIR}/runtimes/build-${ARCH}
mkdir -p ${LLVMDIR}/runtimes/build-${ARCH}
cd ${LLVMDIR}/runtimes/build-${ARCH}
cmake -G Ninja \
-DCMAKE_BUILD_TYPE="Release" \
-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" \
-DLLVM_PATH="${LLVMDIR}/llvm" \
-DLLVM_ENABLE_RUNTIMES="libunwind;libcxxabi;libcxx" \
-DLIBUNWIND_USE_COMPILER_RT=TRUE \
-DLIBUNWIND_ENABLE_SHARED=TRUE \
-DLIBUNWIND_ENABLE_STATIC=TRUE \
-DLIBCXX_USE_COMPILER_RT=ON \
-DLIBCXX_ENABLE_SHARED=TRUE \
-DLIBCXX_ENABLE_STATIC=TRUE \
-DLIBCXX_ENABLE_EXPERIMENTAL_LIBRARY=OFF \
-DLIBCXX_ENABLE_STATIC_ABI_LIBRARY=TRUE \
-DLIBCXX_CXX_ABI="libcxxabi" \
-DLIBCXX_LIBDIR_SUFFIX="" \
-DLIBCXX_INCLUDE_TESTS=FALSE \
-DLIBCXX_ENABLE_ABI_LINKER_SCRIPT=FALSE \
-DLIBCXXABI_USE_COMPILER_RT=ON \
-DLIBCXXABI_ENABLE_SHARED=OFF \
-DLIBCXXABI_LIBDIR_SUFFIX="" \
-DLIBCXXABI_USE_LLVM_UNWINDER=ON \
..
ninja
ninja install
done
cd ${WRKDIR}
}
# This function compiles and install LLVM runtime
llvm_build_runtime_OLD()
{
echo ">>> Building LLVM compiler runtime ..."
for ARCH in ${ARCHS}; do
[ -z ${CLEAN} ] || rm -rf ${LLVMDIR}/compiler-rt/build-${ARCH}
mkdir -p ${LLVMDIR}/compiler-rt/build-${ARCH}
cd ${LLVMDIR}/compiler-rt/build-${ARCH}
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_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 \
-DLLVM_CONFIG_PATH="" \
-DSANITIZER_CXX_ABI="libc++" \
../lib/builtins
ninja
ninja install
done
cd ${WRKDIR}
}
# This function downloads LLVM from VCS
llvm_fetch()
{
if [ ! -d ${LLVMDIR} ]; then
echo ">>> Downloading LLVM ..."
git clone --depth 1 --branch ${LLVMTAG} ${LLVMVCS} ${LLVMDIR}
cd ${LLVMDIR}
apply_patches ${LLVMDIR##*/} ${LLVMTAG##*-}
cd ${WRKDIR}
fi
}
# This function compiles and install MAKE
make_build_OLD()
{
echo ">>> Building Make ..."
[ -z ${CLEAN} ] || rm -rf ${MAKEDIR}/build
cd ${MAKEDIR}
./bootstrap
sed -i "s/-Werror//" maintMakefile
mkdir -p ${MAKEDIR}/build
cd ${MAKEDIR}/build
../configure \
--prefix=${BINDIR} \
--disable-dependency-tracking \
--disable-silent-rules \
--program-prefix=g \
--without-guile
make -j${CORES}
make install
if [ ! -e ${BINDIR}/bin/make ]; then
ln -sf gmake ${BINDIR}/bin/make
fi
cd ${WRKDIR}
}
# This function downloads MAKE from VCS
make_fetch()
{
if [ ! -d ${MAKEDIR} ]; then
echo ">>> Downloading Make ..."
git clone --depth 1 --branch ${MAKETAG} ${MAKEVCS} ${MAKEDIR}
cd ${MAKEDIR}
apply_patches ${MAKEDIR##*/} ${MAKETAG}
cd ${WRKDIR}
fi
}
# This function compiles and install MINGW libraries
mingw_build_libs_OLD()
{
for LIB in libmangle winpthreads winstorecompat; do
echo ">>> Building Mingw-w64 (libs) for ${ARCH} ..."
for ARCH in ${ARCHS}; do
[ -z ${CLEAN} ] || rm -rf ${MINGWDIR}/mingw-w64-libraries/${LIB}/build-${ARCH}
mkdir -p ${MINGWDIR}/mingw-w64-libraries/${LIB}/build-${ARCH}
cd ${MINGWDIR}/mingw-w64-libraries/${LIB}/build-${ARCH}
ORIGPATH="${PATH}"
PATH="${BINDIR}/bin:${PATH}"
../configure \
--host=${ARCH}-w64-mingw32 \
--prefix=${BINDIR}/${ARCH}-w64-mingw32 \
--libdir=${BINDIR}/${ARCH}-w64-mingw32/lib \
CFLAGS="-O2 -mguard=cf" \
CXXFLAGS="-O2 -mguard=cf"
make -j${CORES}
make install
PATH="${ORIGPATH}"
done
done
cd ${WRKDIR}
}
# This function compiles and installs MINGW tools
mingw_build_tools_OLD()
{
for TOOL in gendef genidl genlib 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}
mkdir -p ${MINGWDIR}/mingw-w64-tools/${TOOL}/build-${ARCH}
cd ${MINGWDIR}/mingw-w64-tools/${TOOL}/build-${ARCH}
../configure \
--target=${ARCH}-w64-mingw32 \
--prefix=${BINDIR}
make -j${CORES}
make install
if [ -e ${BINDIR}/bin/${TOOL} ]; then
mv ${BINDIR}/bin/${TOOL} ${BINDIR}/bin/${ARCH}-w64-mingw32-${TOOL}
fi
done
done
cd ${WRKDIR}
}
# This function downloads MINGW from VCS
mingw_fetch()
{
if [ ! -d ${MINGWDIR} ]; then
echo ">>> Downloading MinGW-w64 ..."
git clone --depth 1 --branch ${MINGWTAG} ${MINGWVCS} ${MINGWDIR}
cd ${MINGWDIR}
apply_patches ${MINGWDIR##*/} ${MINGWTAG}
cd ${WRKDIR}
fi
}
# This function compiles and installs NINJA
ninja_build_OLD()
{
echo ">>> Building NINJA ..."
[ -z ${CLEAN} ] || rm -rf ${NINJADIR}/build-${GENERIC}
mkdir -p ${NINJADIR}/build-${GENERIC}
cd ${NINJADIR}/build-${GENERIC}
../configure.py --bootstrap
install ninja ${BINDIR}/bin/
cd ${WRKDIR}
}
# This function downloads NINJA from VCS
ninja_fetch()
{
if [ ! -d ${NINJADIR} ]; then
echo ">>> Downloading NINJA ..."
git clone --depth 1 --branch ${NINJATAG} ${NINJAVCS} ${NINJADIR}
cd ${NINJADIR}
apply_patches ${NINJADIR##*/} ${NINJATAG}
cd ${WRKDIR}
fi
}
# This function compiles and install WINE tools
wine_build_OLD()
{
echo ">>> Building Wine ..."
mkdir -p ${WINEDIR}/build
cd ${WINEDIR}/build
../configure \
-enable-win64 \
--without-freetype \
--without-x
for TOOL in winedump wmc wrc; do
make -j${CORES} tools/${TOOL}/all
cp tools/${TOOL}/${TOOL} ${BINDIR}/bin/
for ARCH in ${ARCHS}; do
if [ ! -e ${BINDIR}/bin/${ARCH}-w64-mingw32-${TOOL} ]; then
ln -sf ${TOOL} ${BINDIR}/bin/${ARCH}-w64-mingw32-${TOOL}
fi
done
done
cd ${WRKDIR}
}
# This function downloads WINE from VCS
wine_fetch()
{
if [ ! -d ${WINEDIR} ]; then
echo ">>> Downloading WINE ..."
git clone --depth 1 --branch ${WINETAG} ${WINEVCS} ${WINEDIR}
cd ${WINEDIR}
apply_patches ${WINEDIR##*/} ${WINETAG##*-}
cd ${WRKDIR}
fi
}
# This function installs XTCHAIN scripts, wrappers and symlinks
xtchain_build_OLD()
{
echo ">>> Building XTchain ..."
mkdir -p ${BINDIR}/bin
mkdir -p ${BINDIR}/lib/xtchain
mkdir -p ${BINDIR}/${GENERIC}/bin
cp ${WRKDIR}/scripts/*-wrapper ${BINDIR}/${GENERIC}/bin
for ARCH in ${ARCHS}; do
for EXEC in c++ c11 c99 cc clang clang++ g++ gcc; do
ln -sf ../${GENERIC}/bin/clang-target-wrapper ${BINDIR}/bin/${ARCH}-w64-mingw32-${EXEC}
done
for EXEC in addr2line ar as nm objcopy pdbutil ranlib rc strings strip; do
ln -sf llvm-${EXEC} ${BINDIR}/bin/${ARCH}-w64-mingw32-${EXEC}
done
for EXEC in dlltool ld objdump; do
ln -sf ../${GENERIC}/bin/${EXEC}-wrapper ${BINDIR}/bin/${ARCH}-w64-mingw32-${EXEC}
done
for EXEC in bin2c exetool 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/xtclib ${BINDIR}/lib/xtchain/
cp ${WRKDIR}/scripts/xtchain ${BINDIR}/
}
# This function compiles and install LLVM
llvm_build()
{
echo ">>> Building LLVM ..."
[ -z ${CLEAN} ] || rm -rf ${LLVMDIR}/llvm/build
LLVM_ARCHS=()
for ARCH in ${ARCHS}; do
case ${ARCH} in
"aarch64")
LLVM_ARCHS+=( "AArch64" )
;;
"armv7")
LLVM_ARCHS+=( "ARM" )
;;
"i686"|"x86_64")
LLVM_ARCHS+=( "X86" )
;;
esac
done
LLVM_ARCHS=( $(for ARCH in ${LLVM_ARCHS[@]}; do echo ${ARCH}; done | sort -u) )
cd ${LLVMDIR}/llvm/tools
for UTIL in clang lld; do
if [ ! -e ${UTIL} ]; then
ln -sf ../../${UTIL} .
fi
done
mkdir -p ${LLVMDIR}/llvm/build
cd ${LLVMDIR}/llvm/build
cmake -G Ninja \
-DLLVM_HOST_TRIPLE="x86_64-w64-mingw32" \
-DCMAKE_C_COMPILER=x86_64-w64-mingw32-gcc \
-DCMAKE_CXX_COMPILER=x86_64-w64-mingw32-g++ \
-DCMAKE_RC_COMPILER=x86_64-w64-mingw32-windres \
-DCMAKE_SYSTEM_NAME=Windows \
-DCMAKE_BUILD_TYPE="Release" \
-DCMAKE_INSTALL_PREFIX=${BINDIR} \
-DLLDB_INCLUDE_TESTS=FALSE \
-DLLVM_ENABLE_ASSERTIONS=FALSE \
-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" \
..
ninja install/strip
cd ${WRKDIR}
}
# This function compiles and installs MINGW CRT
mingw_build_crt()
{
for ARCH in ${ARCHS}; do
echo ">>> Building Mingw-W64 (CRT) for ${ARCH} ..."
[ -z ${CLEAN} ] || rm -rf ${MINGWDIR}/mingw-w64-crt/build-${ARCH}
mkdir -p ${MINGWDIR}/mingw-w64-crt/build-${ARCH}
cd ${MINGWDIR}/mingw-w64-crt/build-${ARCH}
case ${ARCH} in
"aarch64")
FLAGS="--disable-lib32 --disable-lib64 --enable-libarm64"
;;
"armv7")
FLAGS="--disable-lib32 --disable-lib64 --enable-libarm32"
;;
"i686")
FLAGS="--enable-lib32 --disable-lib64"
;;
"x86_64")
FLAGS="--disable-lib32 --enable-lib64"
;;
esac
ORIGPATH="${PATH}"
PATH="${BINDIR}/bin:${PATH}"
../configure \
--disable-dependency-tracking \
--host=${ARCH}-w64-mingw32 \
--prefix=${BINDIR}/${ARCH}-w64-mingw32 \
--with-sysroot=${BINDIR} \
--with-default-msvcrt=${MINGWLIB} \
--enable-cfguard \
${FLAGS}
make -j${CORES}
make install
PATH="${ORIGPATH}"
done
cd ${WRKDIR}
}
# This function compiles and installs MINGW headers
mingw_build_headers()
{
echo ">>> Building Mingw-W64 (headers) ..."
[ -z ${CLEAN} ] || rm -rf ${MINGWDIR}/mingw-w64-headers/build-${GENERIC}
mkdir -p ${MINGWDIR}/mingw-w64-headers/build-${GENERIC}
cd ${MINGWDIR}/mingw-w64-headers/build-${GENERIC}
../configure \
--prefix=${BINDIR}/${GENERIC} \
--enable-idl \
--with-default-msvcrt=${MINGWLIB} \
--with-default-win32-winnt=${MINGWNTV}
make -j${CORES}
make install
for ARCH in ${ARCHS}; do
mkdir -p ${BINDIR}/${ARCH}-w64-mingw32
if [ ! -e ${BINDIR}/${ARCH}-w64-mingw32/include ]; then
ln -sfn ../${GENERIC}/include ${BINDIR}/${ARCH}-w64-mingw32/include
fi
done
cd ${WRKDIR}
}
# This function compiles and installs XTCHAIN tools
xtchain_build()
{
echo ">>> Building XTchain ..."
mkdir -p ${BINDIR}/bin
mkdir -p ${BINDIR}/lib/xtchain
mkdir -p ${BINDIR}/${GENERIC}/bin
cp ${WRKDIR}/scripts/*-wrapper ${BINDIR}/${GENERIC}/bin
for ARCH in ${ARCHS}; do
for EXEC in bin2c exetool xtcspecc; do
if [ ! -e ${BINDIR}/bin/${EXEC}.exe ]; then
x86_64-w64-mingw32-gcc ${WRKDIR}/tools/${EXEC}.c -o ${BINDIR}/bin/${EXEC}.exe
fi
cp ${BINDIR}/bin/${EXEC}.exe ${BINDIR}/bin/${ARCH}-w64-mingw32-${EXEC}.exe
done
done
}
# Exit immediately on any failure
set -e
# Check number of CPU cores available
if [[ ! -n ${CORES} ]]; then
: ${CORES:=$(sysctl -n hw.ncpu 2>/dev/null)}
: ${CORES:=$(nproc 2>/dev/null)}
: ${CORES:=1}
fi
# Create working directories
mkdir -p ${BINDIR}
mkdir -p ${SRCDIR}
# XTchain
#xtchain_build
# Download LLVM
#llvm_fetch
# Build and install LLVM
#llvm_build
# Download Mingw-W64
#mingw_fetch
# Build and install Mingw-W64 headers
#mingw_build_headers
# Build and install Mingw-W64 CRT
mingw_build_crt
exit 1
# Build and install LLVM compiler runtime
llvm_build_runtime
# Build and install LLVM compiler libraries
llvm_build_libs
# Build and install Mingw-W64 libraries
mingw_build_libs
# Build and install Mingw-W64 tools
mingw_build_tools
# Download Binutils
binutils_fetch
# Build and install Binutils
binutils_build
# Download Wine
wine_fetch
# Build and install Wine tools
wine_build
# Download Make
make_fetch
# Build and install Make
make_build
# Download CMake
cmake_fetch
# Build and install CMake
cmake_build
# Download Ninja
ninja_fetch
# Build and install Ninja
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/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:=DEVEL}
echo "${XTCVER}" > ${BINDIR}/Version
# Prepare archive
echo ">>> Creating toolchain archive ..."
tar -I 'zstd -19' -cpf xtchain-${XTCVER}-linux.tar.zst -C ${BINDIR} .

파일 보기

@@ -0,0 +1,30 @@
diff --git a/bfd/config.bfd b/bfd/config.bfd
index bdee53957c0..04fff6e7df4 100644
--- a/bfd/config.bfd
+++ b/bfd/config.bfd
@@ -407,6 +407,12 @@ case "${targ}" in
targ_selvecs="arm_pe_le_vec arm_pe_be_vec arm_pei_le_vec arm_pei_be_vec"
targ_underscore=yes
;;
+ arm-*-mingw*)
+ targ_defvec=arm_pe_le_vec
+ targ_selvecs="arm_pe_le_vec arm_pe_be_vec arm_pei_le_vec arm_pei_be_vec"
+ targ_underscore=no
+ targ_cflags="-DARM_COFF_BUGFIX"
+ ;;
arm-*-phoenix*)
targ_defvec=arm_elf32_le_vec
targ_selvecs=arm_elf32_be_vec
diff --git a/gas/configure.tgt b/gas/configure.tgt
index 3429f850d05..fa735da7ce6 100644
--- a/gas/configure.tgt
+++ b/gas/configure.tgt
@@ -164,7 +164,7 @@ case ${generic_target} in
arm-*-nto*) fmt=elf ;;
arm-wince-pe | arm-*-wince | arm*-*-mingw32ce* | arm*-*-cegcc*)
fmt=coff em=wince-pe ;;
- arm-*-pe) fmt=coff em=pe ;;
+ arm-*-pe | arm-*-mingw*) fmt=coff em=pe ;;
arm-*-fuchsia*) fmt=elf ;;
arm-*-haiku*) fmt=elf em=haiku ;;

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다. Load Diff

파일 보기

@@ -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)

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다. Load Diff

파일 보기

@@ -6,12 +6,6 @@
# DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
# Check if script launched as root
if [ "$(whoami)" = "root" ]; then
echo "This script cannot be run as root!"
exit 1
fi
# Get the absolute path to the XTchain
export XTCDIR="$(realpath $(dirname ${0}))"

파일 보기

@@ -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
파일 보기

@@ -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
파일 보기

@@ -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;
}

파일 보기

@@ -1,558 +0,0 @@
/**
* PROJECT: XTchain
* LICENSE: See COPYING.md in the top level directory
* FILE: tools/windres.c
* DESCRIPTION: WINDRES compatible interface to LLVM
* DEVELOPERS: Josh de Kock <josh@itanimul.li>
* Martin Storsjo <martin@martin.st>
* Rafal Kupiec <belliash@codingworkshop.eu.org>
*/
#include "xtchain.h"
#define WINDRES_VERSION "1.0"
#ifndef DEFAULT_TARGET
#define DEFAULT_TARGET "x86_64-w64-mingw32"
#endif
#include <stdarg.h>
#define _tspawnvp_escape _spawnvp
#include <sys/wait.h>
#include <errno.h>
#define _P_WAIT 0
static
int
_spawnvp(int mode,
const char *filename,
const char * const *argv)
{
pid_t pid;
if(!(pid = fork()))
{
execvp(filename, (char **) argv);
perror(filename);
exit(1);
}
int stat = 0;
if(waitpid(pid, &stat, 0) == -1)
{
return -1;
}
if(WIFEXITED(stat))
{
return WEXITSTATUS(stat);
}
errno = EIO;
return -1;
}
static
const
char *unescape_cpp(const char *str)
{
char *out = strdup(str);
int len = strlen(str);
int i, outpos = 0;
for(i = 0; i < len - 1; i++)
{
if(str[i] == '\\' && str[i + 1] == '"')
{
continue;
}
out[outpos++] = str[i];
}
while(i < len)
{
out[outpos++] = str[i++];
}
out[outpos++] = '\0';
return out;
}
static
void print_version(void)
{
printf("XTchain windres (GNU windres compatible) %s\n", WINDRES_VERSION);
exit(-1);
}
static
void print_help(void)
{
printf(
"usage: llvm-windres <OPTION> [INPUT-FILE] [OUTPUT-FILE]\n"
"\n"
"LLVM Tool to manipulate Windows resources with a GNU windres interface.\n"
"\n"
"Options:\n"
" -i, --input <arg> Name of the input file.\n"
" -o, --output <arg> Name of the output file.\n"
" -J, --input-format <arg> Input format to read.\n"
" -O, --output-format <arg> Output format to generate.\n"
" --preprocessor <arg> Custom preprocessor command.\n"
" --preprocessor-arg <arg> Preprocessor command arguments.\n"
" -F, --target <arg> Target for COFF objects to be compiled for.\n"
" -I, --include-dir <arg> Include directory to pass to preprocessor and resource compiler.\n"
" -D, --define <arg[=val]> Define to pass to preprocessor.\n"
" -U, --undefine <arg[=val]> Undefine to pass to preprocessor.\n"
" -c, --codepage <arg> Default codepage to use when reading an rc file (0x0-0xffff).\n"
" -l, --language <arg> Specify default language (0x0-0xffff).\n"
" --use-temp-file Use a temporary file for the preprocessing output.\n"
" -v, --verbose Enable verbose output.\n"
" -V, --version Display version.\n"
" -h, --help Display this message and exit.\n"
"Input Formats:\n"
" rc Text Windows Resource\n"
" res Binary Windows Resource\n"
"Output Formats:\n"
" res Binary Windows Resource\n"
" coff COFF object\n"
"Targets:\n"
" pe-x86-64\n"
" pei-x86-64\n"
" pe-i386\n"
" pei-i386\n");
exit(1);
}
static
void error(const char *basename,
const char *fmt,
...)
{
fprintf(stderr, _T(TS": error: "), basename);
va_list ap;
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
fprintf(stderr, _T("\n"));
va_end(ap);
exit(1);
}
static
void print_argv(const char **exec_argv)
{
while(*exec_argv)
{
fprintf(stderr, _T(TS" "), *exec_argv);
exec_argv++;
}
fprintf(stderr, _T("\n"));
}
static
void check_num_args(int arg,
int max_arg)
{
if(arg > max_arg)
{
fprintf(stderr, "Too many options added\n");
abort();
}
}
int main(int argc,
char* argv[])
{
const char *dir;
const char *basename;
const char *target;
split_argv(argv[0], &dir, &basename, &target, NULL);
if (!target)
target = _T(DEFAULT_TARGET);
const char *bfd_target = NULL;
const char *input = _T("-");
const char *output = _T("/dev/stdout");
const char *input_format = _T("rc");
const char *output_format = _T("coff");
const char **includes = malloc(argc * sizeof(*includes));
int nb_includes = 0;
const char *codepage = _T("1252");
const char *language = NULL;
const char **cpp_options = malloc(argc * sizeof(*cpp_options));
int nb_cpp_options = 0;
int verbose = 0;
#define _tcslen_const(a) (sizeof(a)/sizeof(char) - 1)
#define _tcsstart(a, b) !strncmp(a, b, _tcslen_const(b))
#define IF_MATCH_EITHER(short, long) \
if(!strcmp(argv[i], _T(short)) || !strcmp(argv[i], _T(long)))
#define IF_MATCH_THREE(first, second, third) \
if(!strcmp(argv[i], _T(first)) || !strcmp(argv[i], _T(second)) || !strcmp(argv[i], _T(third)))
#define OPTION(short, long, var) \
if(_tcsstart(argv[i], _T(short)) && argv[i][_tcslen_const(_T(short))]) { \
var = argv[i] + _tcslen_const(_T(short)); \
} else if(_tcsstart(argv[i], _T(long "="))) { \
var = strchr(argv[i], '=') + 1; \
} else IF_MATCH_EITHER(short, long) { \
if(i + 1 < argc) \
var = argv[++i]; \
else \
error(basename, _T(TS" missing argument"), argv[i]); \
}
#define SEPARATE_ARG(var) do { \
if(i + 1 < argc) \
var = argv[++i]; \
else \
error(basename, _T(TS" missing argument"), argv[i]); \
} while (0)
#define SEPARATE_ARG_PREFIX(var, prefix) do { \
if(i + 1 < argc) \
var = concat(_T(prefix), argv[++i]); \
else \
error(basename, _T(TS" missing argument"), argv[i]); \
} while (0)
for(int i = 1; i < argc; i++)
{
OPTION("-i", "--input", input)
else OPTION("-o", "--output", output)
else OPTION("-J", "--input-format", input_format)
else OPTION("-O", "--output-format", output_format)
else OPTION("-F", "--target", bfd_target)
else IF_MATCH_THREE("-I", "--include-dir", "--include") {
SEPARATE_ARG(includes[nb_includes++]);
}
else if(_tcsstart(argv[i], _T("--include-dir=")) ||
_tcsstart(argv[i], _T("--include=")))
{
includes[nb_includes++] = strchr(argv[i], '=') + 1;
}
else if(_tcsstart(argv[i], _T("-I")))
{
includes[nb_includes++] = argv[i] + 2;
}
else OPTION("-c", "--codepage", codepage)
else OPTION("-l", "--language", language)
else if(!strcmp(argv[i], _T("--preprocessor")))
{
error(basename, _T("ENOSYS"));
}
else if(_tcsstart(argv[i], _T("--preprocessor-arg=")))
{
cpp_options[nb_cpp_options++] = strchr(argv[i], '=') + 1;
}
else if(!strcmp(argv[i], _T("--preprocessor-arg")))
{
SEPARATE_ARG(cpp_options[nb_cpp_options++]);
}
else IF_MATCH_EITHER("-D", "--define")
{
SEPARATE_ARG_PREFIX(cpp_options[nb_cpp_options++], "-D");
}
else if(_tcsstart(argv[i], _T("-D")))
{
cpp_options[nb_cpp_options++] = argv[i];
}
else IF_MATCH_EITHER("-U", "--undefine")
{
SEPARATE_ARG_PREFIX(cpp_options[nb_cpp_options++], "-U");
}
else if(_tcsstart(argv[i], _T("-U")))
{
cpp_options[nb_cpp_options++] = argv[i];
}
else IF_MATCH_EITHER("-v", "--verbose")
{
verbose = 1;
}
else IF_MATCH_EITHER("-V", "--version")
{
print_version();
}
else IF_MATCH_EITHER("-h", "--help")
{
print_help();
}
else if(!strcmp(argv[i], _T("--use-temp-file")))
{
// No-op, we use a temp file by default.
}
else if(_tcsstart(argv[i], _T("-")))
{
error(basename, _T("unrecognized option: `"TS"'"), argv[i]);
}
else
{
if(!strcmp(input, _T("-")))
{
input = argv[i];
}
else if(!strcmp(output, _T("/dev/stdout")))
{
output = argv[i];
}
else
{
error(basename, _T("rip: `"TS"'"), argv[i]);
}
}
}
if(bfd_target)
{
if(!strcmp(bfd_target, _T("pe-x86-64")) ||
!strcmp(bfd_target, _T("pei-x86-64")))
{
target = _T("x86_64-w64-mingw32");
}
else if(!strcmp(bfd_target, _T("pe-i386")) ||
!strcmp(bfd_target, _T("pei-i386")))
{
target = _T("i686-w64-mingw32");
}
else
{
error(basename, _T("unsupported target: `"TS"'"), bfd_target);
}
}
char *arch = strdup(target);
char *dash = strchr(arch, '-');
if(dash)
{
*dash = '\0';
}
const char *machine = _T("unknown");
if(!strcmp(arch, _T("i686")))
{
machine = _T("X86");
}
else if(!strcmp(arch, _T("x86_64")))
{
machine = _T("X64");
}
else if(!strcmp(arch, _T("armv7")))
{
machine = _T("ARM");
}
else if(!strcmp(arch, _T("aarch64")))
{
machine = _T("ARM64");
}
const char *CC = concat(target, _T("-clang"));
const char **rc_options = malloc(2 * argc * sizeof(*cpp_options));
int nb_rc_options = 0;
for(int i = 0; i < nb_includes; i++)
{
cpp_options[nb_cpp_options++] = concat(_T("-I"), includes[i]);
rc_options[nb_rc_options++] = _T("-I");
rc_options[nb_rc_options++] = includes[i];
}
for(int i = 0; i < nb_cpp_options; i++)
{
cpp_options[i] = unescape_cpp(cpp_options[i]);
}
const char *preproc_rc = concat(output, _T(".preproc.rc"));
const char *res = concat(output, _T(".out.res"));
char *inputdir = strdup(input);
{
char *sep = _tcsrchrs(inputdir, '/', '\\');
if(sep)
{
*sep = '\0';
}
else
{
inputdir = strdup(_T("."));
}
}
int max_arg = 2 * argc + 20;
const char **exec_argv = malloc((max_arg + 1) * sizeof(*exec_argv));
int arg = 0;
if(!_tcsicmp(input_format, _T("rc")))
{
exec_argv[arg++] = concat(dir, CC);
exec_argv[arg++] = _T("-E");
for(int i = 0; i < nb_cpp_options; i++)
{
exec_argv[arg++] = cpp_options[i];
}
exec_argv[arg++] = _T("-xc");
exec_argv[arg++] = _T("-DRC_INVOKED=1");
exec_argv[arg++] = input;
exec_argv[arg++] = _T("-o");
exec_argv[arg++] = preproc_rc;
exec_argv[arg] = NULL;
check_num_args(arg, max_arg);
if(verbose)
{
print_argv(exec_argv);
}
int ret = _tspawnvp_escape(_P_WAIT, exec_argv[0], exec_argv);
if(ret == -1)
{
perror(exec_argv[0]);
return 1;
}
if(ret != 0)
{
error(basename, _T("preprocessor failed"));
return ret;
}
arg = 0;
exec_argv[arg++] = concat(dir, _T("llvm-rc"));
for(int i = 0; i < nb_rc_options; i++)
{
exec_argv[arg++] = rc_options[i];
}
exec_argv[arg++] = _T("-I");
exec_argv[arg++] = inputdir;
exec_argv[arg++] = preproc_rc;
exec_argv[arg++] = _T("-c");
exec_argv[arg++] = codepage;
if(language)
{
exec_argv[arg++] = _T("-l");
exec_argv[arg++] = language;
}
exec_argv[arg++] = _T("-fo");
if(!_tcsicmp(output_format, _T("res")))
{
exec_argv[arg++] = output;
}
else
{
exec_argv[arg++] = res;
}
exec_argv[arg] = NULL;
check_num_args(arg, max_arg);
if(verbose)
{
print_argv(exec_argv);
}
ret = _tspawnvp_escape(_P_WAIT, exec_argv[0], exec_argv);
if(ret == -1)
{
perror(exec_argv[0]);
return 1;
}
if(ret != 0)
{
error(basename, _T("llvm-rc failed"));
if(!verbose)
{
unlink(preproc_rc);
}
return ret;
}
if(!_tcsicmp(output_format, _T("res")))
{
// All done
}
else if(!_tcsicmp(output_format, _T("coff")))
{
arg = 0;
exec_argv[arg++] = concat(dir, _T("llvm-cvtres"));
exec_argv[arg++] = res;
exec_argv[arg++] = concat(_T("-machine:"), machine);
exec_argv[arg++] = concat(_T("-out:"), output);
exec_argv[arg] = NULL;
check_num_args(arg, max_arg);
if(verbose)
{
print_argv(exec_argv);
}
int ret = _tspawnvp_escape(_P_WAIT, exec_argv[0], exec_argv);
if(ret == -1)
{
perror(exec_argv[0]);
return 1;
}
if(!verbose)
{
unlink(preproc_rc);
unlink(res);
}
return ret;
} else {
error(basename, _T("invalid output format: `"TS"'"), output_format);
}
}
else if(!_tcsicmp(input_format, _T("res")))
{
exec_argv[arg++] = concat(dir, _T("llvm-cvtres"));
exec_argv[arg++] = input;
exec_argv[arg++] = concat(_T("-machine:"), machine);
exec_argv[arg++] = concat(_T("-out:"), output);
exec_argv[arg] = NULL;
check_num_args(arg, max_arg);
if(verbose)
{
print_argv(exec_argv);
}
int ret = _tspawnvp_escape(_P_WAIT, exec_argv[0], exec_argv);
if(ret == -1)
{
perror(exec_argv[0]);
return 1;
}
return ret;
}
else
{
error(basename, _T("invalid input format: `"TS"'"), input_format);
}
return 0;
}