Compare commits

..
Author SHA1 Message Date
perikiyoxd 2ecef29aa4 Use PowerShell module and improved xtchain ps1 2025-09-26 13:56:40 +02:00
belliash 2d4dffe38f Fix WaitForSingleObject() argument type on MinGW
Builds / XTchain (full, linux) (push) Successful in 2h18m45s
Builds / XTchain (full, windows) (push) Successful in 2h19m58s
Builds / XTchain (minimal, linux) (push) Successful in 1m41s
Builds / XTchain (minimal, windows) (push) Successful in 1m22s
2025-09-14 19:24:05 +02:00
belliash 124ef802b3 Update tools
Builds / XTchain (full, windows) (push) Failing after 1h18m35s
Builds / XTchain (minimal, linux) (push) Successful in 1m51s
Builds / XTchain (minimal, windows) (push) Successful in 1m47s
Builds / XTchain (full, linux) (push) Successful in 1h54m25s
2025-09-14 10:49:11 +02:00
harraiken ad326019fd Update Ninja to v1.13.1
Builds / XTchain (full, linux) (push) Successful in 1h33m55s
Builds / XTchain (full, windows) (push) Successful in 1h34m44s
Builds / XTchain (minimal, linux) (push) Successful in 3m7s
Builds / XTchain (minimal, windows) (push) Successful in 2m15s
2025-07-16 22:56:46 +02:00
harraiken 079af46983 Always copy all scripts regardless of target platform
Builds / XTchain (full, linux) (push) Has started running
Builds / XTchain (full, windows) (push) Has started running
Builds / XTchain (minimal, linux) (push) Has been cancelled
Builds / XTchain (minimal, windows) (push) Has been cancelled
2025-07-16 22:45:08 +02:00
harraiken 17fb344798 Add PowerShell wrapper
Builds / XTchain (full, linux) (push) Has started running
Builds / XTchain (full, windows) (push) Has started running
Builds / XTchain (minimal, linux) (push) Has been cancelled
Builds / XTchain (minimal, windows) (push) Has been cancelled
2025-07-16 22:32:48 +02:00
harraiken d5595e2a7f Improve MSYS2 compatibility and unify output with Windows version
Builds / XTchain (full, linux) (push) Has been cancelled
Builds / XTchain (full, windows) (push) Has been cancelled
Builds / XTchain (minimal, linux) (push) Has been cancelled
Builds / XTchain (minimal, windows) (push) Has been cancelled
2025-07-16 22:27:49 +02:00
harraiken 317fedec34 Fix script compatibility with MSYS2 environment
Builds / XTchain (full, linux) (push) Has started running
Builds / XTchain (full, windows) (push) Has started running
Builds / XTchain (minimal, linux) (push) Has been cancelled
Builds / XTchain (minimal, windows) (push) Has been cancelled
2025-07-16 22:25:08 +02:00
harraiken 703df71191 Upgrade LLVM and Wine to the latest available versions
Builds / XTchain (full, linux) (push) Successful in 1h31m19s
Builds / XTchain (full, windows) (push) Successful in 1h31m41s
Builds / XTchain (minimal, windows) (push) Successful in 2m21s
Builds / XTchain (minimal, linux) (push) Successful in 2m53s
2025-07-12 21:52:09 +02:00
harraiken 4f66ebfd88 Skip windres version check
Builds / XTchain (full, linux) (push) Successful in 1h31m32s
Builds / XTchain (full, windows) (push) Successful in 1h31m57s
Builds / XTchain (minimal, linux) (push) Successful in 1m49s
Builds / XTchain (minimal, windows) (push) Successful in 2m19s
2025-07-12 21:47:34 +02:00
harraiken ba0a50682f Skip windres version check
Builds / XTchain (full, linux) (push) Has started running
Builds / XTchain (full, windows) (push) Has started running
Builds / XTchain (minimal, linux) (push) Has been cancelled
Builds / XTchain (minimal, windows) (push) Has been cancelled
2025-07-12 21:41:41 +02:00
harraiken 3b394fc175 Fix argument forwarding in xbuild function
Builds / XTchain (full, linux) (push) Has started running
Builds / XTchain (full, windows) (push) Has started running
Builds / XTchain (minimal, linux) (push) Has been cancelled
Builds / XTchain (minimal, windows) (push) Has been cancelled
2025-07-12 21:31:35 +02:00
harraiken 97491fb72a Add Windows support and clean up toolchain (#10)
Builds / XTchain (full, linux) (push) Successful in 1h33m3s
Builds / XTchain (minimal, linux) (push) Successful in 9m16s
Builds / XTchain (minimal, windows) (push) Successful in 1m22s
Builds / XTchain (full, windows) (push) Successful in 52m18s
Reviewed-on: #10
Co-authored-by: Aiken Harris <harraiken@noreply.codingworkshop.git>
Co-committed-by: Aiken Harris <harraiken@noreply.codingworkshop.git>
2025-07-10 12:37:41 +02:00
harraiken ef1065278b Add missing cmake patch
Builds / XTChain (push) Has been cancelled
2024-12-29 12:09:19 +01:00
harraiken 391a58dffc Update tools
Builds / XTChain (push) Successful in 57m25s
2024-12-28 20:49:19 +01:00
harraiken bd4b7763d4 Update LLVM
Builds / XTChain (push) Failing after 48m48s
2024-12-27 17:11:24 +01:00
harraiken 33ce9e38d2 Change Wine URI
Builds / XTChain (push) Failing after 3m11s
Reviewed-on: #6
Reviewed-by: Rafal Kupiec <belliash@noreply.codingworkshop.git>
Co-authored-by: Aiken Harris <harraiken@noreply.codingworkshop.git>
Co-committed-by: Aiken Harris <harraiken@noreply.codingworkshop.git>
2024-08-13 14:51:21 +02:00
belliash 409aa4ffb4 Update LLVM to 18.1.8
Builds / XTChain (push) Successful in 55m26s
2024-07-09 23:18:03 +02:00
belliash b951abd511 Update Discord invitation link
Builds / XTChain (push) Successful in 54m0s
2024-06-15 22:35:59 +02:00
belliash 2171eaeed6 Fix incompatible pointer type error
Builds / XTChain (push) Successful in 54m44s
2024-06-07 08:28:40 +02:00
belliash 7075a9ad58 Update LLVM to 18.1.7
Builds / XTChain (push) Failing after 12s
2024-06-07 08:10:31 +02:00
belliash 9025a85bcc Update software and get rid of binutils
Builds / XTChain (push) Successful in 52m51s
2024-05-15 21:14:53 +02:00
belliash 3342b87fd0 Update LLVM to 18.1.4
Builds / XTChain (push) Successful in 53m41s
2024-04-21 09:38:29 +02:00
belliash cd4b20b701 Update LLVM to 18.1.2
Builds / XTChain (push) Successful in 52m51s
2024-03-23 12:16:49 +01:00
belliash fc120f4f33 Update LLVM to 18.1.1
Builds / XTChain (push) Successful in 54m3s
2024-03-17 12:20:12 +01:00
belliash b8d5a76ee7 Update LLVM to 18.1.0
Builds / XTChain (push) Successful in 55m24s
2024-03-06 19:42:22 +01:00
belliash 009d4a3421 Update PE file subsystem together with signature
Builds / XTChain (push) Successful in 1h17m23s
2024-01-18 14:35:55 +01:00
belliash 460d5820da Minimize exetool's output
Builds / XTChain (push) Failing after 1h9m36s
2023-11-28 15:21:17 +01:00
belliash 83e84c3ebf Update LLVM to 17.0.6
Builds / XTChain (push) Successful in 1h16m49s
2023-11-28 14:51:07 +01:00
perikiyoxd eeb1953d87 Improve performance with Git shallow clone and add .gitignore
Builds / XTChain (push) Successful in 1h15m53s
Reviewed-on: #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
belliash e9707563d7 Update LLVM to 17.0.5
Builds / XTChain (push) Successful in 1h23m53s
2023-11-14 12:24:00 +01:00
belliash 11d0593c9e Add 'help' and 'xbuild' commands; fix 'version' command overriding build settings
Builds / XTChain (push) Successful in 1h23m6s
2023-11-08 19:41:22 +01:00
belliash 22a5abd279 Update release badge color
Builds / XTChain (push) Successful in 1h26m41s
2023-11-07 15:09:38 +01:00
belliash 8c047d6083 Add releases link to readme
Builds / XTChain (push) Successful in 1h24m53s
2023-11-07 15:07:04 +01:00
belliash 1832a39ed3 Update LLVM to 17.0.4
Builds / XTChain (push) Successful in 1h23m46s
2023-10-31 19:08:00 +01:00
belliash 2a00526666 Update LLVM to 17.0.3
Builds / XTChain (push) Successful in 1h22m13s
2023-10-17 23:36:43 +02:00
belliash 1f72016fc2 Print original/new subsystem names and turn new subsystem name case insensitive
Builds / XTChain (push) Successful in 1h23m4s
2023-10-17 22:12:46 +02:00
belliash a522cdc583 Massive toolchain update
Builds / XTChain (push) Failing after 1h13m34s
2023-10-04 16:05:03 +02:00
belliash 37230435aa Add bin2c utility
Builds / XTChain (push) Successful in 1h24m30s
2023-09-28 22:47:04 +02:00
belliash 737dda2960 Update LLVM to 17.0.1
Builds / XTChain (push) Successful in 1h21m12s
2023-09-21 15:09:24 +02:00
belliash 0d468bf245 Cleanup after NASM removal
Builds / XTChain (push) Successful in 1h20m48s
2023-07-28 23:07:02 +02:00
belliash b0baae79ba Update badge and URL for CI/CD
Builds / XTChain (push) Successful in 1h21m42s
2023-07-18 14:55:02 +02:00
belliash ecd243ed0d Better way to check if building from tag
Builds / XTChain (push) Has started running
2023-07-15 09:00:33 +02:00
belliash b9d0458a65 Migrate to Gitea Actions
Builds / XTChain (push) Successful in 1h22m2s
2023-07-13 23:16:29 +02:00
belliash 7fb2227034 Update LLVM to 16.0.6
ci/woodpecker/push/build Pipeline was successful
2023-06-21 21:33:02 +02:00
belliash 0e49773bf4 Upgrade LLVM to 16.0.5
ci/woodpecker/push/build Pipeline was successful
2023-06-03 09:47:03 +02:00
belliash 5684623164 Upgrade LLVM and rewrite exetool in C
ci/woodpecker/push/build Pipeline was successful
2023-05-17 15:17:58 +02:00
belliash 14f2f7cf1f Update used software list
ci/woodpecker/push/build Pipeline was successful
ci/woodpecker/tag/build Pipeline was successful
2023-03-29 22:43:20 +02:00
belliash 37e38daf36 Update versioning strategy 2023-03-29 22:42:25 +02:00
belliash b65a92d147 Add accidentally removed ninja_build() function
ci/woodpecker/push/build Pipeline was successful
2023-03-28 21:57:18 +02:00
belliash 173b6d6dd0 Enable control flow guard and fix LLVM compilation
ci/woodpecker/push/build Pipeline failed
2023-03-28 07:09:15 +02:00
belliash 2da20a4eba Use ninja as build system; reconfigure LLVM and enable LLDB
ci/woodpecker/push/build Pipeline failed
2023-03-26 17:45:22 +02:00
belliash c9ef8a6484 Get rid of NASM
ci/woodpecker/push/build Pipeline failed
2023-03-26 13:19:09 +02:00
belliash be63d61cf4 Unify README look'n'feel
ci/woodpecker/push/build Pipeline failed
2023-03-26 12:42:28 +02:00
belliash 9fd40e9617 Import missing binutils patches
ci/woodpecker/push/build Pipeline failed
2023-03-26 09:40:15 +02:00
belliash 116d309962 Update LLVM and add GAS from binutils
ci/woodpecker/push/build Pipeline failed
2023-03-25 22:59:27 +01:00
belliash 6845594e6a Update LLVM to 15.0.7
ci/woodpecker/push/build Pipeline was successful
2023-02-19 16:26:26 +01:00
belliash 69ae9afb88 Correct URL
ci/woodpecker/push/build Pipeline was successful
2023-01-07 10:19:56 +01:00
belliash 3ae3ceaabb Add shields
ci/woodpecker/push/build Pipeline was successful
2023-01-07 10:19:00 +01:00
belliash 361c0a1cdb Add exetool for modifying PE/COFF image subsystem
ci/woodpecker/push/build Pipeline was successful
ci/woodpecker/tag/build Pipeline was successful
2023-01-06 16:23:54 +01:00
belliash d6531be5ee Update LLVM
ci/woodpecker/push/build Pipeline was successful
2022-12-17 12:10:08 +01:00
belliash 771d3783fa Update LLVM
ci/woodpecker/push/build Pipeline was successful
2022-11-08 23:32:18 +01:00
belliash 2e7c7ec1d7 Update LLVM to 15.0.2
ci/woodpecker/push/build Pipeline was successful
ci/woodpecker/tag/build Pipeline was successful
2022-10-05 08:25:06 +02:00
belliash 99f0b83ac7 Add missing cmake patch
ci/woodpecker/push/build Pipeline was successful
2022-10-02 14:29:45 +02:00
belliash 9cc7d052dd Update cmake, llvm and mingw
ci/woodpecker/push/build Pipeline was successful
ci/woodpecker/tag/build Pipeline was successful
2022-09-28 18:09:27 +02:00
belliash abefcf8fe2 Remove old LLVM patch
ci/woodpecker/push/build Pipeline was successful
2022-09-28 15:51:43 +02:00
belliash 015bc8a666 Install llvm-lib, a lib.exe compatible tool
ci/woodpecker/push/build Pipeline was successful
ci/woodpecker/tag/build Pipeline was successful
2022-08-09 18:43:15 +02:00
belliash 546d8718d2 Reimplement new pipeline and allow limiting number of cores used fo build
ci/woodpecker/push/build Pipeline was successful
ci/woodpecker/tag/build Pipeline was successful
Co-authored-by: belliash <belliash@codingworkshop.eu.org>
Reviewed-on: #3
Reviewed-by: Piotr Likoski <likoski@noreply.codingworkshop.git>
2022-07-25 15:21:17 +02:00
belliash a65685de5c Rewrite pipeline
ci/woodpecker/push/build Pipeline failed
2022-07-22 22:50:10 +02:00
belliash f9af39e058 Allow xtchain to be launched by root 2022-07-22 22:48:22 +02:00
belliash 9b7d73e0e9 Update LLVM
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2022-06-29 09:46:44 +02:00
belliash 8eb76f6b90 Update LLVM to 14.0.5
continuous-integration/drone/push Build is passing
2022-06-17 13:40:22 +02:00
belliash 00c659911d Make XTchain great again
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2022-05-29 15:05:09 +02:00
belliash b1de0a02b6 Update Mingw64 to v10.0.0
continuous-integration/drone/push Build is failing
2022-05-28 14:24:41 +02:00
belliash 36df8e42e6 Update LLVM to 14.0.4
continuous-integration/drone/push Build is failing
2022-05-28 12:37:01 +02:00
belliash 7d802e0835 Merge branch 'llvm_toolchain' into master
continuous-integration/drone/push Build is failing
2022-05-28 12:35:49 +02:00
belliash 1904f94583 Update cmake, ninja & wine packages 2022-05-28 12:09:43 +02:00
belliash 3096bf9255 Return 0 when printing help or version in the windres tool.
continuous-integration/drone/push Build is failing
2021-02-02 18:20:19 +01:00
belliash fdd5e32ea0 Update readme.
continuous-integration/drone/push Build is passing
2021-02-02 18:17:12 +01:00
belliash 3a35c39c8e Update readme. 2021-02-02 18:14:50 +01:00
belliash 9e200f0139 Implement chbuild command for setting target build type
continuous-integration/drone/push Build is failing
continuous-integration/drone/tag Build is passing
2020-12-21 09:14:07 +01:00
belliash 80bbcab65d Set 80x86 architecture to i686
continuous-integration/drone/push Build is passing
2020-12-21 08:19:48 +01:00
belliash 952db3582a Fix make compile error.
continuous-integration/drone/push Build is passing
2020-12-18 09:45:30 +01:00
belliash 04edfa61dd Update CMake to v3.19.2 and add version suffix string.
continuous-integration/drone/push Build is failing
2020-12-17 23:23:34 +01:00
belliash d7d7ac54b6 Update hardware exceptions patch
continuous-integration/drone/push Build is passing
2020-11-19 21:51:59 +01:00
belliash 757c207121 Add pipeline
continuous-integration/drone/push Build is passing
2020-11-12 22:03:40 +01:00
belliash 7be4e21ea1 Let sanitizers use libc++ for the cxxabi 2020-11-12 21:53:12 +01:00
belliash 1d621de2be Add Hardware Exception tests 2020-11-08 23:11:04 +01:00
belliash ca2ba1345c Add Hardware Exception for Structured Exception Handling (SEH) 2020-11-08 22:58:23 +01:00
belliash dbf05e76f3 Bump Mingw32-W64 to 8.0.0. 2020-10-13 16:42:25 +02:00
belliash 323e7d0ce1 Bump LLVM to 11.0.0. 2020-10-12 22:12:50 +02:00
belliash 69ab76846e Add NASM to the list of used software. 2020-10-05 23:09:12 +02:00
belliash 5c901f2d31 Incorporate NASM into this toolchain. 2020-10-05 23:04:12 +02:00
belliash 7529ec4918 Update LLVM to 10.0.1. 2020-10-02 23:47:47 +02:00
belliash c9e595cbb0 This toolchain is based on LLVM and we do not need GCC support in SPEC compiler. 2020-09-10 21:28:37 +02:00
belliash 91b34c1656 Set target to i386. 2020-08-26 17:01:25 +02:00
belliash 4cc4e3fa3c Fix version banner. 2020-08-26 16:51:19 +02:00
belliash a5c591db22 Update Wine to v5.15. 2020-08-17 17:41:17 +02:00
belliash f34719b83a Update license. 2020-08-17 17:38:43 +02:00
belliash 50cc5fb1a0 Disable X support in Wine. 2020-08-17 17:36:44 +02:00
belliash 51284f1845 Import readme and license. 2020-08-17 07:59:45 +02:00
belliash 17fb057dce Optimize the building process a bit and facilitate adding new tools. 2020-08-14 23:41:23 +02:00
belliash 1fe8fdaca9 Build the SPEC compiler. 2020-08-14 23:05:46 +02:00
belliash 84f02ccf72 Import SPEC compiler. This software originally comes from ReactOS. 2020-08-14 22:32:46 +02:00
belliash 31d2bc7e7e Import main script for building and assembling the toolchain. 2020-08-14 17:34:08 +02:00
belliash 1dd591ba93 Import windres-compatible wrapper for LLVM. 2020-08-14 14:05:31 +02:00
belliash cfd2192e63 Add MinGW-W64 patch for SLTG support in WIDL. 2020-08-14 01:16:07 +02:00
belliash cf334d86dd Import scripts and wrappers. 2020-08-14 01:08:16 +02:00
belliash ff2c349be3 Correct typo in README. 2020-08-13 14:03:40 +02:00
belliash 9f712e2ebc Import readme and license. 2020-08-13 13:58:37 +02:00
19 changed files with 1357 additions and 3024 deletions
+29
View File
@@ -0,0 +1,29 @@
name: Builds
run-name: ${{ github.actor }} runs Gitea Actions
on: [push]
jobs:
XTchain:
strategy:
matrix:
target: [linux, windows]
build: [full, minimal]
runs-on: oscw
container:
image: codingworkshop/oscw-runner:latest
steps:
- name: Clone repository
uses: actions/checkout@v3
- name: Build XTchain
run: |
if [ "${{ matrix.build }}" == "minimal" ]; then
./build.sh --jobs=10 --target=${{ matrix.target }} --minimal
else
./build.sh --jobs=10 --target=${{ matrix.target }}
fi
- 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-*-${{ matrix.target }}.*)
+3
View File
@@ -0,0 +1,3 @@
binaries/*
sources/*
xtchain-*.zst
+43 -16
View File
@@ -1,22 +1,49 @@
## XT Toolchain
This is a GNU-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 targeted at Linux
host only, however it should be possible to build it in MSYS2 as well.
<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/zBzJ5qMGX7">
<img alt="Discord" src="https://img.shields.io/badge/Chat-Join%20Discord-success">
</a>
</p>
This software includes:
* Binutils
---
## XT Toolchain
The XT Toolchain is a build environment based on LLVM/Clang/LLD. It currently supports C and C++, and includes
a variety of auxiliary tools such as IDL, message, and resource compilers. The XT Toolchain is the official
build system for compiling XT software, including the XT OS. It is currently available for Linux and Windows
host systems.
Key Benefits of using an LLVM-based Toolchain:
* Unified toolchain for multiple target architectures: i686, x86_64, armv7, and aarch64
* Support for generating debug information in PDB format
* Ability to target ARM/AArch64 architectures and produce ARM binaries
This toolchain includes the following software:
* CMake
* GCC
* Make
* Mingw-w64
* LLVM
* Ninja
* Wine
**Note:** This toolchain is based on the [LLVM MinGW Toolchain](https://github.com/mstorsjo/llvm-mingw).
## Licensing
The XTchain project includes the scripts for building and assembling a toolchain as well as
environmental shell. These are licensed under the GPLv3 license. It covers only mentioned
components that are provided by XTchain directly. For more information on that, refer to the
COPYING.md file. The final pre-built toolchain is covered by the licenses of the individual,
external projects. The full list of software incorporated into this toolchain is available in the
README.md file.
The XTchain project includes scripts for building and assembling the toolchain, as well as the environment
shell. These components are licensed under the GNU GPLv3 license. This license applies only to the parts
provided directly by XTchain. For detailed information, please refer to the COPYING.md file.
The final pre-built toolchain is subject to the licenses of the individual third-party projects it includes.
A complete list of the external software used in this toolchain can be found in the README.md file.
-535
View File
@@ -1,535 +0,0 @@
#!/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="i686 x86_64"
GENERIC="generic-w64-mingw32"
# Compiler Flags
CFLAGS="-march=x86-64 -mtune=generic -O2 -s -pipe"
CXXFLAGS="${CFLAGS}"
# Binutils Settings
BINUTILSDIR="${SRCDIR}/binutils"
BINUTILSTAG="binutils-2_35"
BINUTILSVCS="git://sourceware.org/git/binutils-gdb.git"
# CMake Settings
CMAKEDIR="${SRCDIR}/cmake"
CMAKETAG="v3.18.1"
CMAKEVCS="https://gitlab.kitware.com/cmake/cmake.git"
# GCC Settings
GCCDIR="${SRCDIR}/gcc"
GCCTAG="releases/gcc-10.2.0"
GCCVCS="git://gcc.gnu.org/git/gcc.git"
# Make Settings
MAKEDIR="${SRCDIR}/make"
MAKETAG="4.3"
MAKEVCS="git://git.savannah.gnu.org/make"
# Mingw-w64 Settings
MINGWDIR="${SRCDIR}/mingw-w64"
MINGWLIB="ucrt"
MINGWTAG="v7.0.0"
MINGWNTV="0x601"
MINGWVCS="https://github.com/mirror/mingw-w64.git"
# Ninja Settings
NINJADIR="${SRCDIR}/ninja"
NINJATAG="v1.10.0"
NINJAVCS="https://github.com/ninja-build/ninja.git"
# Wine Settings
WINEDIR="${SRCDIR}/wine"
WINETAG="wine-5.15"
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 BINUTILS
binutils_build()
{
for ARCH in ${ARCHS}; do
echo ">>> Building BINUTILS for ${ARCH} ..."
[ -z ${CLEAN} ] || rm -rf ${BINUTILSDIR}/build-${ARCH}
mkdir -p ${BINUTILSDIR}/build-${ARCH}
cd ${BINUTILSDIR}/build-${ARCH}
../configure \
--target=${ARCH}-w64-mingw32 \
--prefix=${BINDIR} \
--with-sysroot=${BINDIR} \
--with-zlib=yes \
--disable-multilib \
--disable-nls \
--disable-werror \
--enable-gold \
--enable-lto \
--enable-plugins
make -j${CORES}
make install
done
cd ${WRKDIR}
}
# This function downloads BINUTILS from VCS
binutils_fetch()
{
if [ ! -d ${BINUTILSDIR} ]; then
echo ">>> Downloading BINUTILS ..."
git clone ${BINUTILSVCS} ${BINUTILSDIR}
cd ${BINUTILSDIR}
git checkout tags/${BINUTILSTAG}
apply_patches ${BINUTILSDIR##*/} ${BINUTILSTAG##*-}
cd ${WRKDIR}
fi
}
# This function compiles and installs CMAKE
cmake_build()
{
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 ${CMAKEVCS} ${CMAKEDIR}
cd ${CMAKEDIR}
git checkout tags/${CMAKETAG}
apply_patches ${CMAKEDIR##*/} ${CMAKETAG}
cd ${WRKDIR}
fi
}
# This function compiles and install GCC (phase 1)
gcc_build_phase1()
{
for ARCH in ${ARCHS}; do
echo ">>> Building GCC (phase1) for ${ARCH} ..."
[ -z ${CLEAN} ] || rm -rf ${GCCDIR}/build-${ARCH}
mkdir -p ${GCCDIR}/build-${ARCH}
cd ${GCCDIR}/build-${ARCH}
../configure \
--target=${ARCH}-w64-mingw32 \
--prefix=${BINDIR} \
--with-sysroot=${BINDIR} \
--with-pkgversion="FerretOS Build Environment" \
--without-zstd \
--disable-libstdcxx-verbose \
--disable-multilib \
--disable-nls \
--disable-shared \
--disable-werror \
--disable-win32-registry \
--enable-fully-dynamic-string \
--enable-languages=c,c++ \
--enable-lto \
--enable-sjlj-exceptions \
--enable-version-specific-runtime-libs
make -j${CORES} all-gcc
make install-gcc
make install-lto-plugin
done
cd ${WRKDIR}
}
# This function compiles and install GCC (phase 2)
gcc_build_phase2()
{
for ARCH in ${ARCHS}; do
echo ">>> Building GCC (phase2) for ${ARCH} ..."
cd ${GCCDIR}/build-${ARCH}
make -j${CORES}
make install
done
cd ${WRKDIR}
}
# This function downloads GCC from VCS
gcc_fetch()
{
if [ ! -d ${GCCDIR} ]; then
echo ">>> Downloading GCC ..."
git clone ${GCCVCS} ${GCCDIR}
cd ${GCCDIR}
git checkout tags/${GCCTAG}
apply_patches ${GCCDIR##*/} ${GCCTAG##*-}
./contrib/download_prerequisites
cd ${WRKDIR}
fi
}
# This function compiles and install MAKE
make_build()
{
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 ${MAKEVCS} ${MAKEDIR}
cd ${MAKEDIR}
git checkout tags/${MAKETAG}
apply_patches ${MAKEDIR##*/} ${MAKETAG}
cd ${WRKDIR}
fi
}
# 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
i686)
FLAGS="--enable-lib32 --disable-lib64"
;;
x86_64)
FLAGS="--disable-lib32 --enable-lib64"
;;
esac
ORIGPATH="${PATH}"
PATH="${BINDIR}/bin:${PATH}"
../configure \
--host=${ARCH}-w64-mingw32 \
--prefix=${BINDIR}/${ARCH}-w64-mingw32 \
--with-sysroot=${BINDIR} \
--with-default-msvcrt=${MINGWLIB} \
${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
mkdir -p ${BINDIR}/mingw
if [ ! -e ${BINDIR}/mingw/include ]; then
ln -sfn ../${GENERIC}/include ${BINDIR}/mingw/include
fi
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 install MINGW libraries
mingw_build_libs()
{
for LIB in libmangle 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
make -j${CORES}
make install
PATH="${ORIGPATH}"
done
done
cd ${WRKDIR}
}
# This function compiles and installs MINGW tools
mingw_build_tools()
{
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 ${MINGWVCS} ${MINGWDIR}
cd ${MINGWDIR}
git checkout tags/${MINGWTAG}
apply_patches ${MINGWDIR##*/} ${MINGWTAG}
cd ${WRKDIR}
fi
}
# This function compiles and installs NINJA
ninja_build()
{
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 ${NINJAVCS} ${NINJADIR}
cd ${NINJADIR}
git checkout tags/${NINJATAG}
apply_patches ${NINJADIR##*/} ${NINJATAG}
cd ${WRKDIR}
fi
}
# This function compiles and install WINE tools
wine_build()
{
echo ">>> Building Wine ..."
mkdir -p ${WINEDIR}/build
cd ${WINEDIR}/build
../configure \
-enable-win64 \
--without-x
for TOOL in winedump wmc wrc; do
make -j${CORES} tools/${TOOL}
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 ${WINEVCS} ${WINEDIR}
cd ${WINEDIR}
git checkout tags/${WINETAG}
apply_patches ${WINEDIR##*/} ${WINETAG##*-}
cd ${WRKDIR}
fi
}
# This function installs XTCHAIN scripts, wrappers and symlinks
xtchain_build()
{
echo ">>> Building XTchain ..."
mkdir -p ${BINDIR}/bin
mkdir -p ${BINDIR}/lib/xtchain
mkdir -p ${BINDIR}/${GENERIC}/bin
for ARCH in ${ARCHS}; do
for EXEC in 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}/
cd ${WRKDIR}
}
# 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}
# Create working directories
mkdir -p ${BINDIR}
mkdir -p ${SRCDIR}
# Export compiler flags
export CFLAGS
export CXXFLAGS
# XTchain
xtchain_build
# Download Mingw-W64
mingw_fetch
# Build and install Mingw-W64 headers
mingw_build_headers
# Download Binutils
binutils_fetch
# Build and install Binutils
binutils_build
# Download GCC
gcc_fetch
# Build and install minimal GCC
gcc_build_phase1
# Build and install MSVCRT
mingw_build_crt
# Build and install GCC
gcc_build_phase2
# Build and install Mingw-W64 libraries
mingw_build_libs
# Build and install Mingw-W64 tools
mingw_build_tools
# 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,mingw,share/{bash-completion,emacs,gcc*,info,man,vim}}
# Save XT Toolchain version
cd ${WRKDIR}
: ${XTCVER:=$(git describe --exact-match --tags 2>/dev/null)}
: ${XTCVER:=DEV}
echo "${XTCVER}" > ${BINDIR}/Version
# Prepare archive
echo ">>> Creating toolchain archive ..."
tar -I 'zstd -19' -cpf xtchain-${XTCVER}-linux.tar.zst -C ${BINDIR} .
Executable
+497
View File
@@ -0,0 +1,497 @@
#!/bin/bash
# PROJECT: XTchain
# LICENSE: See the COPYING.md in the top level directory
# FILE: build.sh
# DESCRIPTION: Toolchain crosscompilation and assembly script
# DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
# Aiken Harris <harraiken91@gmail.com>
# Working Directories
BINDIR="$(pwd)/binaries"
PCHDIR="$(pwd)/patches"
SRCDIR="$(pwd)/sources"
WRKDIR="$(pwd)"
# Architecture Settings
ARCHS="aarch64 armv7 i686 x86_64"
# Default Configuration
BUILD_JOBS=0
BUILD_MINIMAL=0
CLEAN_BUILD=0
ENABLE_LLVM_ASSEMBLY=0
LLVM_DYNAMIC_LINK=ON
SYSTEM_NAME=Linux
TARGET_SYSTEM=linux
# CMake Settings
CMAKEDIR="${SRCDIR}/cmake"
CMAKETAG="v4.1.1"
CMAKEVCS="https://gitlab.kitware.com/cmake/cmake.git"
# LLVM Settings
LLVMDIR="${SRCDIR}/llvm"
LLVMTAG="llvmorg-21.1.1"
LLVMVCS="https://github.com/llvm/llvm-project.git"
# Ninja Settings
NINJADIR="${SRCDIR}/ninja"
NINJATAG="v1.13.1"
NINJAVCS="https://github.com/ninja-build/ninja.git"
# Wine Settings
WINEDIR="${SRCDIR}/wine"
WINETAG="wine-10.15"
WINEVCS="https://github.com/wine-mirror/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 CMAKE
cmake_build()
{
local CMAKE_PARAMETERS=""
# Clean old build if necessary
[ "${CLEAN_BUILD}" -eq 1 ] && rm -rf ${WINEDIR}/build-${SYSTEM_NAME}
# Additional, target-specific configuration options
case "${SYSTEM_NAME}" in
Windows)
CMAKE_PARAMETERS="${CMAKE_PARAMETERS} -DCMAKE_C_COMPILER=${SYSTEM_HOST}-gcc -DCMAKE_CXX_COMPILER=${SYSTEM_HOST}-g++"
CMAKE_PARAMETERS="${CMAKE_PARAMETERS} -DCMAKE_RC_COMPILER=${SYSTEM_HOST}-windres"
;;
esac
# Build CMake
echo ">>> Building CMAKE ..."
mkdir -p ${CMAKEDIR}/build-${SYSTEM_NAME}
cd ${CMAKEDIR}/build-${SYSTEM_NAME}
cmake \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY \
-DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=ONLY \
-DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER \
-DCMAKE_INSTALL_PREFIX=${BINDIR} \
-DCMAKE_SYSTEM_NAME=${SYSTEM_NAME} \
-DCMAKE_USE_OPENSSL=OFF \
${CMAKE_PARAMETERS} \
..
cmake --build . --parallel ${BUILD_JOBS}
cmake --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()
{
local CMAKE_PARAMETERS=""
local LLVM_ARCHS=()
# Clean old build if necessary
[ "${CLEAN_BUILD}" -eq 1 ] && rm -rf ${LLVMDIR}/llvm/build-${SYSTEM_NAME}
# Set supported architectures
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) )
# Disable LLVM assembly files (like BLAKE3 support) if not specified otherwise
if [ "${ENABLE_LLVM_ASSEMBLY}" -ne 1 ]; then
CMAKE_PARAMETERS="${CMAKE_PARAMETERS} -DLLVM_DISABLE_ASSEMBLY_FILES=ON"
fi
# Additional, target-specific configuration options
case "${SYSTEM_NAME}" in
Windows)
CMAKE_PARAMETERS="${CMAKE_PARAMETERS} -DCMAKE_EXE_LINKER_FLAGS=-lpthread -DCMAKE_SHARED_LINKER_FLAGS=-lpthread"
CMAKE_PARAMETERS="${CMAKE_PARAMETERS} -DCMAKE_C_COMPILER_TARGET=${SYSTEM_HOST} -DCMAKE_CXX_COMPILER_TARGET=${SYSTEM_HOST}"
CMAKE_PARAMETERS="${CMAKE_PARAMETERS} -DCMAKE_RC_COMPILER=${SYSTEM_HOST}-windres -DLLVM_HOST_TRIPLE=${SYSTEM_HOST}"
CMAKE_PARAMETERS="${CMAKE_PARAMETERS} -DCMAKE_FIND_ROOT=$(dirname $(readlink -f $(command -v ${SYSTEM_HOST}-windres)))/../${SYSTEM_HOST}"
CMAKE_PARAMETERS="${CMAKE_PARAMETERS} -DCMAKE_CXX_FLAGS=-femulated-tls"
;;
esac
# Build LLVM
echo ">>> Building LLVM ..."
cd ${LLVMDIR}/llvm/tools
for UTIL in clang lld; do
if [ ! -e ${UTIL} ]; then
ln -sf ../../${UTIL} .
fi
done
mkdir -p ${LLVMDIR}/llvm/build-${SYSTEM_NAME}
cd ${LLVMDIR}/llvm/build-${SYSTEM_NAME}
cmake -G Ninja \
-DCMAKE_BUILD_TYPE="Release" \
-DCMAKE_C_COMPILER=clang \
-DCMAKE_CXX_COMPILER=clang++ \
-DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY \
-DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=ONLY \
-DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ONLY \
-DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER \
-DCMAKE_INSTALL_PREFIX=${BINDIR} \
-DCMAKE_SYSTEM_NAME="${SYSTEM_NAME}" \
-DLLDB_INCLUDE_TESTS=OFF \
-DLLVM_ENABLE_ASSERTIONS=OFF \
-DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;lld;lldb" \
-DLLVM_INSTALL_TOOLCHAIN_ONLY=ON \
-DLLVM_BUILD_INSTRUMENTED=OFF \
-DLLVM_LINK_LLVM_DYLIB=${LLVM_DYNAMIC_LINK} \
-DLLVM_TARGETS_TO_BUILD="$(echo ${LLVM_ARCHS[@]} | tr ' ' ';')" \
-DLLVM_TOOLCHAIN_TOOLS="llvm-addr2line;llvm-ar;llvm-as;llvm-cov;llvm-cvtres;llvm-cxxfilt;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-size;llvm-strings;llvm-strip;llvm-symbolizer;llvm-windres" \
-DLLVM_USE_LINKER=lld \
-DLLDB_ENABLE_PYTHON=OFF \
${CMAKE_PARAMETERS} \
..
ninja -j ${BUILD_JOBS} install/strip
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 installs NINJA
ninja_build()
{
local EXTENSION=""
local NINJA_CXX_COMPILER=""
local NINJA_PLATFORM=""
# Clean old build if necessary
[ "${CLEAN_BUILD}" -eq 1 ] && rm -rf ${NINJADIR}/build-${SYSTEM_NAME}
# Additional, target-specific configuration options
case "${SYSTEM_NAME}" in
Windows)
EXTENSION=".exe"
NINJA_CXX_COMPILER="${SYSTEM_HOST}-g++"
NINJA_PLATFORM="mingw"
;;
*)
NINJA_CXX_COMPILER="clang++"
NINJA_PLATFORM="linux"
;;
esac
# Build Ninja
echo ">>> Building NINJA ..."
mkdir -p ${NINJADIR}/build-${SYSTEM_NAME}
cd ${NINJADIR}/build-${SYSTEM_NAME}
CXX=${NINJA_CXX_COMPILER} ../configure.py --platform=${NINJA_PLATFORM}
ninja -j ${BUILD_JOBS}
install ninja${EXTENSION} ${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
}
# Performs requirements check and prepares environment
prepare_environment()
{
# Verify that the number of build jobs is a positive integer
if [ -z "${BUILD_JOBS##*[!0-9]*}" ]; then
echo "ERROR: Invalid number of jobs provided. Please enter a positive integer."
exit 1
fi
# Verify that all required tools are installed
for APP in {clang,clang++,cmake,lld,ninja,x86_64-w64-mingw32-windres}; do
which ${APP} &> /dev/null
if [ $? -ne 0 ]; then
echo "ERROR: ${APP} not found. Please install the required tool."
exit 2
fi
done
# Set target-specific options
case "${TARGET_SYSTEM}" in
windows|*-mingw32)
SYSTEM_NAME="Windows"
SYSTEM_HOST="x86_64-w64-mingw32"
;;
linux|*-linux-*)
SYSTEM_NAME="Linux"
;;
*)
echo "ERROR: Invalid target system specified. Please choose a valid target system."
exit 3
;;
esac
}
# Prints usage help
print_usage()
{
echo "USAGE: ${0} [--clean] [--enable-llvm-assembly] [--jobs=N] [--minimal] [--static-llvm] [--target={linux,windows}]"
exit 1
}
# This function compiles and install WINE tools
wine_build()
{
local CONFIGURE_PARAMETERS=""
local EXTENSION=""
# Clean old build if necessary
[ "${CLEAN_BUILD}" -eq 1 ] && rm -rf ${WINEDIR}/{build-${SYSTEM_NAME},build-tools}
# Additional, target-specific configuration options
case "${SYSTEM_NAME}" in
Windows)
CONFIGURE_PARAMETERS="${CONFIGURE_PARAMETERS} --host=${SYSTEM_HOST}"
EXTENSION=".exe"
;;
esac
# Build Wine (first configuration builds makedep)
echo ">>> Building Wine ..."
mkdir -p ${WINEDIR}/{build-${SYSTEM_NAME},build-tools}
cd ${WINEDIR}/build-tools
../configure \
--enable-win64 \
--without-freetype \
--without-x
cd ${WINEDIR}/build-${SYSTEM_NAME}
../configure \
--enable-tools \
--enable-win64 \
--with-wine-tools=${WINEDIR}/build-tools \
--without-freetype \
--without-x \
${CONFIGURE_PARAMETERS}
for TOOL in widl wmc wrc; do
make -j ${BUILD_JOBS} tools/${TOOL}/all
cp tools/${TOOL}/${TOOL}${EXTENSION} ${BINDIR}/bin/
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 tools and scripts
xtchain_build()
{
# Target-specific configuration options
case "${SYSTEM_NAME}" in
Windows)
CCOMPILER="${SYSTEM_HOST}-gcc"
;;
*)
CCOMPILER="clang"
esac
# Build XTchain tools
echo ">>> Building XTchain tools ..."
mkdir -p ${BINDIR}/bin
mkdir -p ${BINDIR}/lib/xtchain
for EXEC in bin2c exetool xtcspecc; do
if [ ! -e ${BINDIR}/bin/${EXEC} ]; then
${CCOMPILER} ${WRKDIR}/tools/${EXEC}.c -o ${BINDIR}/bin/${EXEC}
fi
done
cp ${WRKDIR}/scripts/xtclib* ${BINDIR}/lib/xtchain/
cp ${WRKDIR}/scripts/xtchain* ${BINDIR}/
}
# This function generates XTCHAIN version file and produces tarball archive
xtchain_tarball()
{
local EXTENSION=""
local LIBDIR=""
# Additional, target-specific configuration options
case "${SYSTEM_NAME}" in
Windows)
EXTENSION=".exe"
;;
esac
# 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}}
for EXEC in amdgpu-arch clang-check clang-exdef-mapping clang-import-test clang-offload-* clang-rename clang-scan-deps diagtool hmaptool ld64.lld modularize nxptx-arch wasm-ld; do
rm -f ${BINDIR}/bin/${EXEC}${EXTENSION}
done
# Generate version file
cd ${WRKDIR}
: ${XTCVER:=$(git describe --exact-match --tags 2>/dev/null)}
: ${XTCVER:=DEVEL}
[ ${BUILD_MINIMAL} -eq 1 ] && XTCVER="${XTCVER}-lite"
echo "${XTCVER}" > ${BINDIR}/Version
# Windows target specific actions
if [ "${SYSTEM_NAME}" == "Windows" ]; then
# Replace symlinks with original files
for LINK in $(find ${BINDIR}/bin -maxdepth 1 -type l); do
cp -f --remove-destination $(readlink -e ${LINK}) ${LINK}
done
# Copy dynamic libraries
if [ ${BUILD_MINIMAL} -eq 0 ]; then
LIBDIR="$(dirname $(readlink -f $(command -v ${SYSTEM_HOST}-windres)))/../${SYSTEM_HOST}"
for DLL in $(${SYSTEM_HOST}-objdump --private-headers ${BINDIR}/bin/cmake.exe | grep "DLL Name:" | cut -d' ' -f3 | grep "lib.*.dll"); do
find ${LIBDIR} -type f -name ${DLL} -exec cp {} ${BINDIR}/bin \;
done
fi
fi
# Build tarball
echo ">>> Creating toolchain archive ..."
tar -I 'zstd -19' -cpf xtchain-${XTCVER}-${TARGET_SYSTEM}.tar.zst -C ${BINDIR} .
}
# Parse all arguments provided to the script
while [ $# -gt 0 ]; do
case "$1" in
--clean)
# Performs clean build
CLEAN_BUILD=1
;;
--enable-llvm-assembly)
# Enables LLVM asembly files compilation (like BLAKE3)
ENABLE_LLVM_ASSEMBLY=1
;;
--jobs=*)
# Sets number of CPU cores used for compilation
BUILD_JOBS="${1#*=}"
;;
--minimal)
BUILD_MINIMAL=1
;;
--static-llvm)
# Compiles LLVM statically
LLVM_DYNAMIC_LINK=OFF
;;
--target=*)
# Sets the target system for built toolchain (Linux or Windows)
TARGET_SYSTEM="${1#*=}"
;;
*)
# Prints help if any other parameter given
print_usage
;;
esac
shift
done
# Prepare environment
prepare_environment
# Exit immediately on any failure
set -e
# Check number of CPU cores available
if [ ${BUILD_JOBS} -eq 0 ]; then
unset BUILD_JOBS
: ${BUILD_JOBS:=$(sysctl -n hw.ncpu 2>/dev/null)}
: ${BUILD_JOBS:=$(nproc 2>/dev/null)}
: ${BUILD_JOBS:=1}
fi
# Create working directories
mkdir -p ${BINDIR}
mkdir -p ${SRCDIR}
# Build XTchain tools
xtchain_build
# Download and build Wine tools
wine_fetch
wine_build
if [ ${BUILD_MINIMAL} -eq 0 ]; then
# Download and build LLVM
llvm_fetch
llvm_build
# Download and build CMake
cmake_fetch
cmake_build
# Download and build Ninja
ninja_fetch
ninja_build
fi
# Generate tarball archive
xtchain_tarball
@@ -1,126 +0,0 @@
diff --git a/bfd/peXXigen.c b/bfd/peXXigen.c
index 5149ef582b..f09e4b7382 100644
--- a/bfd/peXXigen.c
+++ b/bfd/peXXigen.c
@@ -2952,6 +2952,25 @@ _bfd_XX_print_private_bfd_data_common (bfd * abfd, void * vfile)
case IMAGE_SUBSYSTEM_XBOX:
subsystem_name = "XBOX";
break;
+ /* These are the XT specific subsystems */
+ case IMAGE_SUBSYSTEM_XT_DRIVER:
+ subsystem_name = "XT driver";
+ break;
+ case IMAGE_SUBSYSTEM_XT_NATIVE:
+ subsystem_name = "XT native";
+ break;
+ case IMAGE_SUBSYSTEM_XT_GDIAPP:
+ subsystem_name = "XT GDI application";
+ break;
+ case IMAGE_SUBSYSTEM_XT_CLIAPP:
+ subsystem_name = "XT CLI application";
+ break;
+ case IMAGE_SUBSYSTEM_XT_PSXAPP:
+ subsystem_name = "XT PSX application";
+ break;
+ case IMAGE_SUBSYSTEM_XT_DYNLIB:
+ subsystem_name = "XT dynamic library";
+ break;
/* Added default case for clarity - subsystem_name is NULL anyway. */
default:
subsystem_name = NULL;
diff --git a/binutils/objcopy.c b/binutils/objcopy.c
index 3866c7f458..55e069831b 100644
--- a/binutils/objcopy.c
+++ b/binutils/objcopy.c
@@ -4860,7 +4860,13 @@ set_pe_subsystem (const char *s)
{ "efi-bsd", 1, IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER },
{ "efi-rtd", 1, IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER },
{ "sal-rtd", 1, IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER },
- { "xbox", 0, IMAGE_SUBSYSTEM_XBOX }
+ { "xbox", 0, IMAGE_SUBSYSTEM_XBOX },
+ { "xt-driver", 0, IMAGE_SUBSYSTEM_XT_DRIVER },
+ { "xt-native", 0, IMAGE_SUBSYSTEM_XT_NATIVE },
+ { "xt-gdiapp", 0, IMAGE_SUBSYSTEM_XT_GDIAPP },
+ { "xt-cliapp", 0, IMAGE_SUBSYSTEM_XT_CLIAPP },
+ { "xt-psxapp", 0, IMAGE_SUBSYSTEM_XT_PSXAPP },
+ { "xt-dynlib", 0, IMAGE_SUBSYSTEM_XT_DYNLIB }
};
short value;
char *copy;
diff --git a/include/coff/pe.h b/include/coff/pe.h
index c83a958eee..deeea6b49a 100644
--- a/include/coff/pe.h
+++ b/include/coff/pe.h
@@ -169,6 +169,12 @@
#define IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER 12
#define IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER 13
#define IMAGE_SUBSYSTEM_XBOX 14
+#define IMAGE_SUBSYSTEM_XT_DRIVER 21
+#define IMAGE_SUBSYSTEM_XT_NATIVE 22
+#define IMAGE_SUBSYSTEM_XT_GDIAPP 23
+#define IMAGE_SUBSYSTEM_XT_CLIAPP 24
+#define IMAGE_SUBSYSTEM_XT_PSXAPP 25
+#define IMAGE_SUBSYSTEM_XT_DYNLIB 26
/* NT allows long filenames, we want to accommodate this.
This may break some of the bfd functions. */
diff --git a/ld/emultempl/pe.em b/ld/emultempl/pe.em
index 3899c9d92c..c9277ded20 100644
--- a/ld/emultempl/pe.em
+++ b/ld/emultempl/pe.em
@@ -539,6 +539,12 @@ set_entry_point (void)
{ 7, "__PosixProcessStartup"},
{ 9, "WinMainCRTStartup" },
{14, "mainCRTStartup" },
+ {21, "XtDriverStartup" },
+ {22, "XtProcessStartup" },
+ {23, "XtgMainProcessStartup" },
+ {24, "XtcMainProcessStartup" },
+ {25, "XtpMainProcessStartup" },
+ {26, "XtlMainLibraryStartup" },
{ 0, NULL }
};
@@ -606,6 +611,12 @@ set_pe_subsystem (void)
{ "posix", 7},
{ "wince", 9},
{ "xbox", 14},
+ { "xt-driver", 21},
+ { "xt-native", 22},
+ { "xt-gdiapp", 23},
+ { "xt-cliapp", 24},
+ { "xt-psxapp", 25},
+ { "xt-dynlib", 26},
{ NULL, 0 }
};
diff --git a/ld/emultempl/pep.em b/ld/emultempl/pep.em
index a0a7023e70..001aa34769 100644
--- a/ld/emultempl/pep.em
+++ b/ld/emultempl/pep.em
@@ -504,6 +504,12 @@ set_entry_point (void)
{ 7, "__PosixProcessStartup" },
{ 9, "WinMainCRTStartup" },
{14, "mainCRTStartup" },
+ {21, "XtDriverStartup" },
+ {22, "XtProcessStartup" },
+ {23, "XtgMainProcessStartup" },
+ {24, "XtcMainProcessStartup" },
+ {25, "XtpMainProcessStartup" },
+ {26, "XtlMainLibraryStartup" },
{ 0, NULL }
};
@@ -568,6 +573,12 @@ set_pep_subsystem (void)
{ "posix", 7 },
{ "wince", 9 },
{ "xbox", 14 },
+ { "xt-driver", 21},
+ { "xt-native", 22},
+ { "xt-gdiapp", 23},
+ { "xt-cliapp", 24},
+ { "xt-psxapp", 25},
+ { "xt-dynlib", 26},
{ NULL, 0 }
};
@@ -1,36 +0,0 @@
Though GOLD is not yet enabled for TDM-GCC, this patch will help
From: J.M. Eubank <john@thesnappy.net>
From
<https://github.com/msys2/MINGW-packages/blob/master/mingw-w64-binutils/0001-enable-gold-on.mingw32.patch>
---
0 files changed
diff --git a/configure b/configure
index 6a9719f6..f07a3b7f 100755
--- a/configure
+++ b/configure
@@ -3001,6 +3001,7 @@ case "${ENABLE_GOLD}" in
yes|default)
# Check for ELF target.
is_elf=no
+ is_pe=no
case "${target}" in
*-*-elf* | *-*-sysv4* | *-*-unixware* | *-*-eabi* | hppa*64*-*-hpux* \
| *-*-linux* | *-*-gnu* | frv-*-uclinux* | *-*-irix5* | *-*-irix6* \
@@ -3012,10 +3013,12 @@ case "${ENABLE_GOLD}" in
*)
is_elf=yes
;;
- esac
+ esac;;
+ *-*-mingw*)
+ is_pe=yes;;
esac
- if test "$is_elf" = "yes"; then
+ if test "$is_elf" = "yes" -o "$is_pe" = "yes"; then
# Check for target supported by gold.
case "${target}" in
i?86-*-* | x86_64-*-* | sparc*-*-* | powerpc*-*-* | arm*-*-* \
@@ -1,57 +0,0 @@
Make GCC fully relocatable, not searching any fixed paths
From: J.M. Eubank <john@thesnappy.net>
that aren't relative to the current installation path
# HG changeset patch
# Parent 2a1167ee4ed20c6ff3558a104218585837e9963f
---
0 files changed
diff --git a/gcc/config/i386/mingw32.h b/gcc/config/i386/mingw32.h
index 086c0e460..f0ceca42b 100644
--- a/gcc/config/i386/mingw32.h
+++ b/gcc/config/i386/mingw32.h
@@ -78,7 +78,7 @@ along with GCC; see the file COPYING3. If not see
#endif
#undef NATIVE_SYSTEM_HEADER_COMPONENT
-#define NATIVE_SYSTEM_HEADER_COMPONENT "MINGW"
+#undef NATIVE_SYSTEM_HEADER_DIR
#undef CPP_SPEC
#define CPP_SPEC "%{posix:-D_POSIX_SOURCE} %{mthreads:-D_MT} " \
@@ -183,17 +183,12 @@ along with GCC; see the file COPYING3. If not see
/* Override startfile prefix defaults. */
#ifndef STANDARD_STARTFILE_PREFIX_1
-#define STANDARD_STARTFILE_PREFIX_1 "/mingw/lib/"
+#define STANDARD_STARTFILE_PREFIX_1 ""
#endif
#ifndef STANDARD_STARTFILE_PREFIX_2
#define STANDARD_STARTFILE_PREFIX_2 ""
#endif
-/* For native mingw-version we need to take care that NATIVE_SYSTEM_HEADER_DIR
- macro contains POSIX-style path. See bug 52947. */
-#undef NATIVE_SYSTEM_HEADER_DIR
-#define NATIVE_SYSTEM_HEADER_DIR "/mingw/include"
-
/* Output STRING, a string representing a filename, to FILE.
We canonicalize it to be in Unix format (backslashes are replaced
forward slashes. */
diff --git a/gcc/incpath.c b/gcc/incpath.c
index bcbe20829..c5d4453d8 100644
--- a/gcc/incpath.c
+++ b/gcc/incpath.c
@@ -183,8 +183,7 @@ add_standard_paths (const char *sysroot, const char *iprefix,
str = concat (sysroot_no_trailing_dir_separator, p->fname, NULL);
free (sysroot_no_trailing_dir_separator);
}
- else if (!p->add_sysroot && relocated
- && !filename_ncmp (p->fname, cpp_PREFIX, cpp_PREFIX_len))
+ if (relocated && !filename_ncmp (p->fname, cpp_PREFIX, cpp_PREFIX_len))
{
static const char *relocated_prefix;
char *ostr;
@@ -0,0 +1,13 @@
diff --git a/lldb/source/Host/windows/MainLoopWindows.cpp b/lldb/source/Host/windows/MainLoopWindows.cpp
index c0b10797e..e971b8cfd 100644
--- a/lldb/source/Host/windows/MainLoopWindows.cpp
+++ b/lldb/source/Host/windows/MainLoopWindows.cpp
@@ -58,7 +58,7 @@ public:
// Keep trying to cancel ReadFile() until the thread exits.
do {
CancelIoEx(m_handle, /*lpOverlapped=*/NULL);
- } while (WaitForSingleObject(m_monitor_thread.native_handle(), 1) ==
+ } while (WaitForSingleObject((HANDLE)m_monitor_thread.native_handle(), 1) ==
WAIT_TIMEOUT);
m_monitor_thread.join();
}
File diff suppressed because it is too large Load Diff
+4 -10
View File
@@ -6,20 +6,14 @@
# 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}))"
export XTCDIR="$(realpath $(dirname "${0}"))"
# Read the XTchain version
export XTCVER="$(cat ${XTCDIR}/Version)"
export XTCVER="$(cat "${XTCDIR}/Version")"
# Load the library
source ${XTCDIR}/lib/xtchain/xtclib
source "${XTCDIR}/lib/xtchain/xtclib"
# Set the target architecture
: ${TARGET:=${1}}
@@ -47,4 +41,4 @@ export PFMAT3="\[\033[0;1;97;104m\]"
export PFMAT4="\[\033[0;94;49m\]"
export PFMAT5="\[\033[1;38;5;74m\]"
export PROMPT="\n${PFMAT1} XT Toolchain ${PFMAT2}${PFMAT3} \w ${PFMAT4}${PFMAT5} "
bash --rcfile <(echo 'source ~/.bashrc && export PS1="${PROMPT}" && cd ${SRCDIR}')
bash --rcfile <(echo 'export PS1="${PROMPT}" && cd "${SRCDIR}"')
+2
View File
@@ -0,0 +1,2 @@
@echo off
powershell.exe -ExecutionPolicy Bypass -NoExit -File "%~dp0xtchain.ps1"
+156
View File
@@ -0,0 +1,156 @@
#
# PROJECT: XTchain
# LICENSE: See the COPYING.md in the top level directory
# FILE: scripts/xtchain.ps1
# DESCRIPTION: XTchain Entry Script
# DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
#
[CmdletBinding()]
param(
[Parameter(Position = 0)]
[string]$TargetArchitecture = "amd64",
[Parameter(Position = 1)]
[string]$SourceDirectory = $PWD.Path
)
# Initialize XTchain environment
function Initialize-XTChain {
[CmdletBinding()]
param(
[string]$Architecture,
[string]$SourcePath
)
# Get the absolute path to XTchain
$script:XTCDIR = (Get-Item -Path ".\").FullName
# Read XTchain version
$versionFile = Join-Path $script:XTCDIR "Version"
if (Test-Path $versionFile) {
$env:XTCVER = Get-Content $versionFile -Raw | ForEach-Object { $_.Trim() }
} else {
Write-Warning "Version file not found at $versionFile"
$env:XTCVER = "Unknown"
}
# Set XTchain directory environment variable
$env:XTCDIR = $script:XTCDIR
# Import XTchain module
$modulePath = Join-Path $script:XTCDIR "lib\xtchain\xtclib.psm1"
if (Test-Path $modulePath) {
Import-Module $modulePath -Force -Global
} else {
Write-Error "XTchain module not found at $modulePath"
return $false
}
# Set target architecture
$env:TARGET = $Architecture
# Validate source directory
if (-not (Test-Path $SourcePath)) {
Write-Error "Source directory does not exist: $SourcePath"
return $false
}
# Clean compiler environment variables
$env:HOST = $null
$env:CFLAGS = $null
$env:CXXFLAGS = $null
$env:LDFLAGS = $null
# Update PATH to include XTchain binaries
$xtcBinPath = Join-Path $script:XTCDIR "bin"
if (Test-Path $xtcBinPath) {
$env:PATH = "$xtcBinPath;" + $env:PATH
} else {
Write-Warning "XTchain bin directory not found at $xtcBinPath"
}
return $true
}
# Create fancy PowerLine-style prompt
function Set-XTChainPrompt {
[CmdletBinding()]
param()
function global:prompt {
try {
$promptText = " XT Toolchain "
$currentPath = (Get-Location).Path
$chevron = [char]0xE0B0
# Define prompt segments
$segments = @(
@{
Text = $promptText
BackgroundColor = "Blue"
ForegroundColor = "White"
},
@{
Text = " $currentPath "
BackgroundColor = "DarkCyan"
ForegroundColor = "White"
}
)
# Render segments
for ($index = 0; $index -lt $segments.Count; $index++) {
$segment = $segments[$index]
$nextBackground = if ($index + 1 -lt $segments.Count) {
$segments[$index + 1].BackgroundColor
} else {
"Default"
}
# Write segment text
Write-Host $segment.Text -NoNewLine -ForegroundColor $segment.ForegroundColor -BackgroundColor $segment.BackgroundColor
# Write separator
if ($nextBackground -ne "Default") {
Write-Host $chevron -NoNewLine -ForegroundColor $segment.BackgroundColor -BackgroundColor $nextBackground
} else {
Write-Host $chevron -NoNewLine -ForegroundColor $segment.BackgroundColor
}
}
return " "
}
catch {
# Fallback to simple prompt if PowerLine fails
return "XTC> "
}
}
}
# Main execution
try {
Write-Host "Initializing XTchain environment..." -ForegroundColor Green
if (-not (Initialize-XTChain -Architecture $TargetArchitecture -SourcePath $SourceDirectory)) {
Write-Error "Failed to initialize XTchain environment"
exit 1
}
# Display version information
Show-XTCVersion
# Set up the fancy prompt
Set-XTChainPrompt
# Change to source directory
Set-Location -Path $SourceDirectory
Write-Host "XTchain environment ready!" -ForegroundColor Green
Write-Host "Current directory: $(Get-Location)" -ForegroundColor Cyan
Write-Host "Target architecture: $env:TARGET" -ForegroundColor Cyan
Write-Host "Type 'Show-XTCHelp' or 'help' for available commands" -ForegroundColor Yellow
}
catch {
Write-Error "Failed to initialize XTchain: $_"
exit 1
}
+98 -16
View File
@@ -4,8 +4,20 @@
# FILE: scripts/xtclib
# DESCRIPTION: XTchain library
# DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
# Aiken Harris <harraiken91@gmail.com>
# Prints XTChain banner
banner()
{
local XTC_BANNER="XT Toolchain v${XTCVER} for Linux"
printf "###############################################################################\n\n"
printf "\033[33m%*s\033[00m\n\n" $(( (${#XTC_BANNER} + 80) / 2)) "${XTC_BANNER}"
printf "###############################################################################\n\n"
}
export -f banner
# Sets the target architecture
charch()
{
@@ -14,8 +26,14 @@ charch()
return
fi
case ${1} in
"aarch64"|"arm64")
export TARGET="aarch64"
;;
"arm"|"armv7")
export TARGET="armv7"
;;
"i386"|"i486"|"i586"|"i686"|"x86")
export TARGET="i386"
export TARGET="i686"
;;
"amd64"|"x64"|"x86_64")
export TARGET="amd64"
@@ -27,23 +45,87 @@ charch()
}
export -f charch
# Sets the build type
chbuild()
{
if [ "x${1}" == "x" ]; then
echo "Syntax: chbuild [DEBUG|RELEASE]"
return
fi
case ${1} in
[Rr][Ee][Ll][Ee][Aa][Ss][Ee])
export BUILD_TYPE="RELEASE"
;;
*)
export BUILD_TYPE="DEBUG"
esac
echo "Target build type: ${BUILD_TYPE}"
}
export -f chbuild
# Prints help
help()
{
banner
echo "XTChain defines an internal list of commands:"
echo " * banner - prints XTChain banner"
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 "# by Rafal Kupiec <belliash@codingworkshop.eu.org> #"
echo "###############################################################################"
echo
echo
echo "Binutils Version: $(${XTCDIR}/bin/i686-w64-mingw32-ld -v | cut -d' ' -f5)"
echo "GCC Version: $(${XTCDIR}/bin/i686-w64-mingw32-gcc -v 2>&1| grep 'gcc version' | cut -d' ' -f3)"
echo "IDL Compiler Version: $(${XTCDIR}/bin/i686-w64-mingw32-widl -V | grep 'version' | cut -d' ' -f5)"
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}
echo
echo
local XTCHAIN_EXTTOOLS=false
if [ ! -f "${XTCDIR}/bin/clang" ] || [ "$(which clang)" != "${XTCDIR}/bin/clang" ] || [ $(echo ${XTCVER} | grep "min") ]; then
XTCHAIN_EXTTOOLS=true
for TOOL in {clang,clang++,cmake,lld-link,ninja}; do
which ${TOOL} &> /dev/null
if [ $? -ne 0 ]; then
echo "ERROR: You are using minimal version of XTChain and '${TOOL}' has been not found in your system!"
echo "ERROR: Please install all required tools."
exit 1
fi
done
fi
banner
echo -en "\nLLVM/Clang Compiler: $(clang --version | grep 'clang version' | cut -d' ' -f3) ($(which clang))"
echo -en "\nLLVM/LLD Linker: $(lld-link --version | cut -d' ' -f2) ($(which lld-link))"
echo -en "\nWine IDL Compiler: $(widl -V | grep 'version' | cut -d' ' -f5) ($(which widl))"
echo -en "\nWine Message Compiler: $(wmc -V | grep 'version' | cut -d' ' -f5) ($(which wmc))"
echo -en "\nWine Resource Compiler: $(wrc --version | grep 'version' | cut -d' ' -f5) ($(which wrc))"
echo -en "\nXT SPEC Compiler: $(xtcspecc --help | grep Version | cut -d' ' -f5) ($(which xtcspecc))"
echo -en "\nCMake Build System: $(cmake --version | grep 'cmake version' | cut -d' ' -f3) ($(which cmake))"
echo -en "\nNinja Build System: $(ninja --version) ($(which ninja))"
echo -en "\n\n"
charch ${TARGET:-amd64}
chbuild ${BUILD_TYPE:-DEBUG}
echo -en "\n\nFor a list of all supported commands, type 'help'"
echo -en "\n-------------------------------------------------\n\n\n"
}
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
+248
View File
@@ -0,0 +1,248 @@
#
# MODULE: XTchain
# LICENSE: See the COPYING.md in the top level directory
# FILE: xtclib.psm1
# DESCRIPTION: XTchain PowerShell module
# DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
#
# Module variables
$script:XTCVersion = $env:XTCVER
$script:XTCDirectory = $env:XTCDIR
<#
.SYNOPSIS
Prints XTChain banner
.DESCRIPTION
Displays the XTChain version banner with formatting
#>
function Show-XTCBanner {
[CmdletBinding()]
param()
$XTC_BANNER = "XT Toolchain v$script:XTCVersion for Windows"
Write-Host "################################################################################"
Write-Host
Write-Host (' ' * [math]::Floor((80 - $XTC_BANNER.Length) / 2) + $XTC_BANNER) -ForegroundColor Yellow
Write-Host
Write-Host "################################################################################"
Write-Host
}
<#
.SYNOPSIS
Sets the target architecture
.DESCRIPTION
Configures the TARGET environment variable based on the specified architecture
.PARAMETER Architecture
The target architecture (aarch64, arm64, arm, armv7, i386, i486, i586, i686, x86, amd64, x64, x86_64)
#>
function Set-XTCArchitecture {
[CmdletBinding()]
param (
[Parameter(Mandatory = $true)]
[string]$Architecture
)
switch -Regex ($Architecture.ToLower()) {
"aarch64|arm64" {
$env:TARGET = "aarch64"
}
"arm|armv7" {
$env:TARGET = "armv7"
}
"i386|i486|i586|i686|x86" {
$env:TARGET = "i686"
}
"amd64|x64|x86_64" {
$env:TARGET = "amd64"
}
default {
$env:TARGET = "UNKNOWN"
Write-Warning "Unknown architecture '$Architecture'. Set to UNKNOWN."
}
}
Write-Host "Target Architecture: $($env:TARGET)"
}
<#
.SYNOPSIS
Sets the build type
.DESCRIPTION
Configures the BUILD_TYPE environment variable
.PARAMETER BuildType
The build type (DEBUG or RELEASE)
#>
function Set-XTCBuildType {
[CmdletBinding()]
param (
[Parameter(Mandatory = $true)]
[ValidateSet("DEBUG", "RELEASE")]
[string]$BuildType
)
$env:BUILD_TYPE = $BuildType.ToUpper()
Write-Host "Target build type: $($env:BUILD_TYPE)"
}
<#
.SYNOPSIS
Shows XTChain help information
.DESCRIPTION
Displays available XTChain commands and their usage
#>
function Show-XTCHelp {
[CmdletBinding()]
param()
Show-XTCBanner
Write-Host "XTChain PowerShell Module Commands:"
Write-Host " * Show-XTCBanner - prints XTChain banner"
Write-Host " * Set-XTCArchitecture - sets the target CPU architecture"
Write-Host " * Set-XTCBuildType - sets build type [DEBUG/RELEASE]"
Write-Host " * Show-XTCHelp - prints this message"
Write-Host " * Show-XTCVersion - prints XTChain and its components version"
Write-Host " * Invoke-XTCBuild - builds an application with Ninja build system"
Write-Host
Write-Host "Legacy command aliases:"
Write-Host " * banner, charch, chbuild, help, version, xbuild"
}
<#
.SYNOPSIS
Displays version information for XTChain components
.DESCRIPTION
Shows version information for all XTChain tools and components
#>
function Show-XTCVersion {
[CmdletBinding()]
param()
# Check for minimal XTChain version with external tools
$XTCHAIN_EXTTOOLS = $false
if ((Test-Path "$script:XTCDirectory/bin/clang") -and
((Get-Command clang -ErrorAction SilentlyContinue).Source -eq "$script:XTCDirectory/bin/clang") -and
($script:XTCVersion -match "min")) {
$XTCHAIN_EXTTOOLS = $true
$requiredTools = @("clang", "clang++", "cmake", "lld-link", "ninja")
foreach ($tool in $requiredTools) {
if (!(Get-Command $tool -ErrorAction SilentlyContinue)) {
Write-Error "You are using minimal version of XTChain and '$tool' has been not found in your system!"
Write-Error "Please install all required tools."
return
}
}
}
Show-XTCBanner
Write-Host
# Display tool versions
try {
$clangVersion = (clang --version | Select-String -Pattern "version (\d+\.\d+\.\d+)").Matches.Groups[1].Value
$clangPath = (Get-Command clang).Source
Write-Host "LLVM/Clang Compiler: $clangVersion ($clangPath)"
} catch { Write-Warning "Could not retrieve Clang version" }
try {
$lldVersion = (lld-link --version | Select-String -Pattern "(\d+\.\d+\.\d+)").Matches.Groups[1].Value
$lldPath = (Get-Command lld-link).Source
Write-Host "LLVM/LLD Linker: $lldVersion ($lldPath)"
} catch { Write-Warning "Could not retrieve LLD version" }
try {
$widlVersion = (widl -V | Select-String -Pattern "version (\d+\.\d+)").Matches.Groups[1].Value
$widlPath = (Get-Command widl).Source
Write-Host "Wine IDL Compiler: $widlVersion ($widlPath)"
} catch { Write-Warning "Could not retrieve WIDL version" }
try {
$wmcVersion = (wmc -V | Select-String -Pattern "version (\d+\.\d+)").Matches.Groups[1].Value
$wmcPath = (Get-Command wmc).Source
Write-Host "Wine Message Compiler: $wmcVersion ($wmcPath)"
} catch { Write-Warning "Could not retrieve WMC version" }
try {
$wrcVersion = (wrc --version | Select-String -Pattern "version (\d+\.\d+)").Matches.Groups[1].Value
$wrcPath = (Get-Command wrc).Source
Write-Host "Wine Resource Compiler: $wrcVersion ($wrcPath)"
} catch { Write-Warning "Could not retrieve WRC version" }
try {
$xtcspeccVersion = (xtcspecc --help | Select-String -Pattern "Version (\d+\.\d+)").Matches.Groups[1].Value
$xtcspeccPath = (Get-Command xtcspecc).Source
Write-Host "XT SPEC Compiler: $xtcspeccVersion ($xtcspeccPath)"
} catch { Write-Warning "Could not retrieve XTCSPECC version" }
try {
$cmakeVersion = (cmake --version | Select-String -Pattern "version (\d+\.\d+\.\d+)").Matches.Groups[1].Value
$cmakePath = (Get-Command cmake).Source
Write-Host "CMake Build System: $cmakeVersion ($cmakePath)"
} catch { Write-Warning "Could not retrieve CMake version" }
try {
$ninjaVersion = (ninja --version)
$ninjaPath = (Get-Command ninja).Source
Write-Host "Ninja Build System: $ninjaVersion ($ninjaPath)"
} catch { Write-Warning "Could not retrieve Ninja version" }
Write-Host
# Set default values and display current configuration
$BUILD_TYPE = if ([string]::IsNullOrEmpty($env:BUILD_TYPE)) { 'DEBUG' } else { $env:BUILD_TYPE }
$TARGET = if ([string]::IsNullOrEmpty($env:TARGET)) { 'amd64' } else { $env:TARGET }
Set-XTCArchitecture -Architecture $TARGET
Set-XTCBuildType -BuildType $BUILD_TYPE
Write-Host
Write-Host
Write-Host "For a list of all supported commands, type 'Show-XTCHelp' or 'help'"
Write-Host "--------------------------------------------------------"
Write-Host
}
<#
.SYNOPSIS
Builds application using Ninja build system
.DESCRIPTION
Wrapper around ninja command with architecture validation
.PARAMETER Arguments
Arguments to pass to ninja
#>
function Invoke-XTCBuild {
[CmdletBinding()]
param (
[Parameter(ValueFromRemainingArguments = $true)]
[string[]]$Arguments
)
if (Test-Path "build.arch") {
$buildArch = Get-Content "build.arch" -Raw
$buildArch = $buildArch.Trim()
if ($buildArch -ne $env:TARGET) {
Write-Host "Build is configured for '$buildArch' while current target set to '$($env:TARGET)'!" -ForegroundColor Red
Write-Host "Cannot continue until conflict is resolved..." -ForegroundColor Red
return 1
}
}
& ninja @Arguments
return $LASTEXITCODE
}
# Legacy function aliases for backwards compatibility
Set-Alias -Name banner -Value Show-XTCBanner
Set-Alias -Name charch -Value Set-XTCArchitecture
Set-Alias -Name chbuild -Value Set-XTCBuildType
Set-Alias -Name help -Value Show-XTCHelp
Set-Alias -Name version -Value Show-XTCVersion
Set-Alias -Name xbuild -Value Invoke-XTCBuild
# Export functions and aliases
Export-ModuleMember -Function Show-XTCBanner, Set-XTCArchitecture, Set-XTCBuildType, Show-XTCHelp, Show-XTCVersion, Invoke-XTCBuild
Export-ModuleMember -Alias banner, charch, chbuild, help, version, xbuild
+74
View 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
View 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;
}
-56
View File
@@ -7,57 +7,13 @@
* Rafal Kupiec <belliash@codingworkshop.eu.org>
*/
#ifdef UNICODE
#define _UNICODE
#endif
#include <ctype.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define _T(x) x
#ifdef _UNICODE
#define TS "%ls"
#else
#define TS "%s"
#endif
static
inline
int
_tcsicmp(const char *a,
const char *b)
{
while(*a && tolower(*a) == tolower(*b))
{
a++;
b++;
}
return *a - *b;
}
static
inline
char *
concat(const char *prefix,
const char *suffix)
{
int prefixlen = strlen(prefix);
int suffixlen = strlen(suffix);
char *buf = malloc((prefixlen + suffixlen + 1) * sizeof(*buf));
strcpy(buf, prefix);
strcpy(buf + prefixlen, suffix);
return buf;
}
static
inline
char *
@@ -148,15 +104,3 @@ split_argv(const char *argv0,
*exe_ptr = exe;
}
}
static
inline
int
run_final(const char *executable,
const char *const *argv)
{
execvp(executable, (char **) argv);
perror(executable);
return 1;
}
+8 -152
View File
@@ -49,7 +49,6 @@ enum _ARCH
};
typedef int (*PFNOUTLINE)(FILE *, EXPORT *);
int gbMSComp = 0;
int gbImportLib = 0;
int gbNotPrivateNoWarn = 0;
int gbTracing = 0;
@@ -531,20 +530,13 @@ PrintName(FILE *fileDest,
pcAt = ScanToken(pcName, '@');
if(pcAt && (pcAt < (pcName + nNameLength)))
{
/* On GCC, we need to remove the leading stdcall underscore */
if(!gbMSComp && (pexp->nCallingConvention == CC_STDCALL))
{
pcName++;
nNameLength--;
}
/* Print the already decorated function name */
fprintf(fileDest, "%.*s", nNameLength, pcName);
}
else
{
/* Print the prefix, but skip it for (GCC && stdcall) */
if(gbMSComp || (pexp->nCallingConvention != CC_STDCALL))
/* Print the prefix, but skip it for stdcall */
if(pexp->nCallingConvention != CC_STDCALL)
{
fprintf(fileDest, "%c", pexp->nCallingConvention == CC_FASTCALL ? '@' : '_');
}
@@ -560,10 +552,13 @@ PrintName(FILE *fileDest,
}
}
void
OutputLine_def_MS(FILE *fileDest,
EXPORT *pexp)
int
OutputLine_def(FILE *fileDest,
EXPORT *pexp)
{
DbgPrint("OutputLine_def: '%.*s'...\n", pexp->strName.len, pexp->strName.buf);
fprintf(fileDest, " ");
PrintName(fileDest, pexp, &pexp->strName, 0);
if(gbImportLib)
@@ -610,92 +605,6 @@ OutputLine_def_MS(FILE *fileDest,
/* Redirect it to the relay-tracing trampoline */
fprintf(fileDest, "=$relaytrace$%.*s", pexp->strName.len, pexp->strName.buf);
}
}
void
OutputLine_def_GCC(FILE *fileDest,
EXPORT *pexp)
{
int bTracing = 0;
/* Print the function name, with decoration for export libs */
PrintName(fileDest, pexp, &pexp->strName, gbImportLib);
DbgPrint("Generating def line for '%.*s'\n", pexp->strName.len, pexp->strName.buf);
/* Check if this is a forwarded export */
if(pexp->strTarget.buf)
{
int fIsExternal = !!ScanToken(pexp->strTarget.buf, '.');
DbgPrint("Got redirect '%.*s'\n", pexp->strTarget.len, pexp->strTarget.buf);
/* print the target name, don't decorate if it is external */
fprintf(fileDest, "=");
PrintName(fileDest, pexp, &pexp->strTarget, !fIsExternal);
}
else if(((pexp->uFlags & FL_STUB) || (pexp->nCallingConvention == CC_STUB)) &&
(pexp->strName.buf[0] == '?'))
{
/* C++ stubs are forwarded to C stubs */
fprintf(fileDest, "=stub_function%d", pexp->nNumber);
}
else if(gbTracing && ((pexp->uFlags & FL_NORELAY) == 0) &&
(pexp->nCallingConvention == CC_STDCALL) &&
(pexp->strName.buf[0] != '?'))
{
/* Redirect it to the relay-tracing trampoline */
char buf[256];
STRING strTarget;
fprintf(fileDest, "=");
sprintf(buf, "$relaytrace$%.*s", pexp->strName.len, pexp->strName.buf);
strTarget.buf = buf;
strTarget.len = pexp->strName.len + 12;
PrintName(fileDest, pexp, &strTarget, 1);
bTracing = 1;
}
/* Special handling for stdcall and fastcall */
if((giArch == ARCH_X86) &&
((pexp->nCallingConvention == CC_STDCALL) ||
(pexp->nCallingConvention == CC_FASTCALL)))
{
/* Is this the import lib? */
if(gbImportLib)
{
/* Is the name in the spec file decorated? */
const char* pcDeco = ScanToken(pexp->strName.buf, '@');
if(pcDeco &&
(pexp->strName.len > 1) &&
(pcDeco < pexp->strName.buf + pexp->strName.len))
{
/* Write the name including the leading @ */
fprintf(fileDest, "==%.*s", pexp->strName.len, pexp->strName.buf);
}
}
else if((!pexp->strTarget.buf) && !(bTracing))
{
/* Write a forwarder to the actual decorated symbol */
fprintf(fileDest, "=");
PrintName(fileDest, pexp, &pexp->strName, 1);
}
}
}
int
OutputLine_def(FILE *fileDest,
EXPORT *pexp)
{
DbgPrint("OutputLine_def: '%.*s'...\n", pexp->strName.len, pexp->strName.buf);
fprintf(fileDest, " ");
if(gbMSComp)
OutputLine_def_MS(fileDest, pexp);
else
OutputLine_def_GCC(fileDest, pexp);
/* On GCC builds we force ordinals */
if((pexp->uFlags & FL_ORDINAL) || (!gbMSComp && !gbImportLib))
{
fprintf(fileDest, " @%d", pexp->nOrdinal);
}
if(pexp->uFlags & FL_NONAME)
{
@@ -1028,10 +937,6 @@ ParseFile(char* pcStart,
else if(CompareToken(pc, "-ordinal"))
{
exp.uFlags |= FL_ORDINAL;
/* GCC doesn't automatically import by ordinal if an ordinal
* is found in the def file. Force it. */
if(gbImportLib && !gbMSComp)
exp.uFlags |= FL_NONAME;
}
else if(CompareToken(pc, "-stub"))
{
@@ -1226,41 +1131,6 @@ ParseFile(char* pcStart,
Fatal(pszSourceFileName, nLine, pcLine, pc, 0, "Ordinal export without ordinal");
}
/*
* Check for special handling of OLE exports, only when MSVC
* is not used, since otherwise this is handled by MS LINK.EXE.
*/
if(!gbMSComp)
{
/* Check whether the current export is not PRIVATE, or has an ordinal */
int bIsNotPrivate = (!gbNotPrivateNoWarn && /*gbImportLib &&*/ !(exp.uFlags & FL_PRIVATE));
int bHasOrdinal = (exp.uFlags & FL_ORDINAL);
/* Check whether the current export is an OLE export, in case any of these tests pass */
if(bIsNotPrivate || bHasOrdinal)
{
for(i = 0; i < ARRAYSIZE(astrOlePrivateExports); ++i)
{
if(strlen(astrOlePrivateExports[i]) == exp.strName.len &&
strncmp(exp.strName.buf, astrOlePrivateExports[i], exp.strName.len) == 0)
{
/* The current export is an OLE export: display the corresponding warning */
if(bIsNotPrivate)
{
fprintf(stderr, "WARNING: %s line %d: Exported symbol '%.*s' should be PRIVATE\n",
pszSourceFileName, nLine, exp.strName.len, exp.strName.buf);
}
if(bHasOrdinal)
{
fprintf(stderr, "WARNING: %s line %d: exported symbol '%.*s' should not be assigned an ordinal\n",
pszSourceFileName, nLine, exp.strName.len, exp.strName.buf);
}
break;
}
}
}
}
pexports[*cExports] = exp;
(*cExports)++;
gbDebug = 0;
@@ -1329,7 +1199,6 @@ void usage(void)
" -n=<name> name of the dll\n"
" -a=<arch> set architecture to one of: aarch64, armv7, i686, x86_64\n"
" --implib generate a def file for an import library\n"
" --msvc MSVC compatibility\n"
" --no-private-warnings suppress warnings about symbols that should be private\n"
" --with-tracing generate wine-like \"+relay\" trace trampolines (needs -s)\n",
XTCSPECC_VERSION,
@@ -1393,10 +1262,6 @@ int main(int argc,
{
gbImportLib = 1;
}
else if(strcasecmp(argv[i], "--msvc") == 0)
{
gbMSComp = 1;
}
else if(strcasecmp(argv[i], "--no-private-warnings") == 0)
{
gbNotPrivateNoWarn = 1;
@@ -1516,15 +1381,6 @@ int main(int argc,
return -1;
}
if(!gbMSComp)
{
if(ApplyOrdinals(pexports, cExports) < 0)
{
fprintf(stderr, "error: could not apply ordinals!\n");
return -1;
}
}
if(pszDefFileName)
{
/* Open output file */