diff --git a/.github/actions/configure-clang/action.yml b/.github/actions/configure-clang/action.yml new file mode 100644 index 00000000..2a5da7c5 --- /dev/null +++ b/.github/actions/configure-clang/action.yml @@ -0,0 +1,117 @@ +name: "Configure clang" +description: "Installs and configures clang in a specific version on an ubuntu image" +inputs: + clang_version: + description: "The version of clang to install. Must be the major version only." + required: true + enable_x86: + description: "Whether to enable x86 support." + default: "false" +runs: + using: "composite" + steps: + - name: Enable i386 architecture + if: ${{ inputs.enable_x86 == 'true' }} + shell: bash + run: dpkg --add-architecture i386 + + - name: Install clang + shell: bash + run: | + apt-get update + apt-get install -y \ + clang-${{ inputs.clang_version }}${PKG_SUFFIX} \ + lld-${{ inputs.clang_version }}${PKG_SUFFIX} \ + lldb-${{ inputs.clang_version }}${PKG_SUFFIX} \ + clang-format-${{ inputs.clang_version }}${PKG_SUFFIX} \ + clang-tidy-${{ inputs.clang_version }}${PKG_SUFFIX} + env: + PKG_SUFFIX: ${{ case(inputs.enable_x86 == 'true', ':i386', '') }} + + - name: Configure clang + shell: bash + # Source: https://gist.github.com/junkdog/70231d6953592cd6f27def59fe19e50d + run: | + function register_clang_version { + local version=$1 + local priority=$2 + + update-alternatives \ + --verbose \ + --install /usr/bin/llvm-config llvm-config /usr/bin/llvm-config-${version} ${priority} \ + --slave /usr/bin/llvm-ar llvm-ar /usr/bin/llvm-ar-${version} \ + --slave /usr/bin/llvm-as llvm-as /usr/bin/llvm-as-${version} \ + --slave /usr/bin/llvm-bcanalyzer llvm-bcanalyzer /usr/bin/llvm-bcanalyzer-${version} \ + --slave /usr/bin/llvm-c-test llvm-c-test /usr/bin/llvm-c-test-${version} \ + --slave /usr/bin/llvm-cat llvm-cat /usr/bin/llvm-cat-${version} \ + --slave /usr/bin/llvm-cfi-verify llvm-cfi-verify /usr/bin/llvm-cfi-verify-${version} \ + --slave /usr/bin/llvm-cov llvm-cov /usr/bin/llvm-cov-${version} \ + --slave /usr/bin/llvm-cvtres llvm-cvtres /usr/bin/llvm-cvtres-${version} \ + --slave /usr/bin/llvm-cxxdump llvm-cxxdump /usr/bin/llvm-cxxdump-${version} \ + --slave /usr/bin/llvm-cxxfilt llvm-cxxfilt /usr/bin/llvm-cxxfilt-${version} \ + --slave /usr/bin/llvm-diff llvm-diff /usr/bin/llvm-diff-${version} \ + --slave /usr/bin/llvm-dis llvm-dis /usr/bin/llvm-dis-${version} \ + --slave /usr/bin/llvm-dlltool llvm-dlltool /usr/bin/llvm-dlltool-${version} \ + --slave /usr/bin/llvm-dwarfdump llvm-dwarfdump /usr/bin/llvm-dwarfdump-${version} \ + --slave /usr/bin/llvm-dwp llvm-dwp /usr/bin/llvm-dwp-${version} \ + --slave /usr/bin/llvm-exegesis llvm-exegesis /usr/bin/llvm-exegesis-${version} \ + --slave /usr/bin/llvm-extract llvm-extract /usr/bin/llvm-extract-${version} \ + --slave /usr/bin/llvm-lib llvm-lib /usr/bin/llvm-lib-${version} \ + --slave /usr/bin/llvm-link llvm-link /usr/bin/llvm-link-${version} \ + --slave /usr/bin/llvm-lto llvm-lto /usr/bin/llvm-lto-${version} \ + --slave /usr/bin/llvm-lto2 llvm-lto2 /usr/bin/llvm-lto2-${version} \ + --slave /usr/bin/llvm-mc llvm-mc /usr/bin/llvm-mc-${version} \ + --slave /usr/bin/llvm-mca llvm-mca /usr/bin/llvm-mca-${version} \ + --slave /usr/bin/llvm-modextract llvm-modextract /usr/bin/llvm-modextract-${version} \ + --slave /usr/bin/llvm-mt llvm-mt /usr/bin/llvm-mt-${version} \ + --slave /usr/bin/llvm-nm llvm-nm /usr/bin/llvm-nm-${version} \ + --slave /usr/bin/llvm-objcopy llvm-objcopy /usr/bin/llvm-objcopy-${version} \ + --slave /usr/bin/llvm-objdump llvm-objdump /usr/bin/llvm-objdump-${version} \ + --slave /usr/bin/llvm-opt-report llvm-opt-report /usr/bin/llvm-opt-report-${version} \ + --slave /usr/bin/llvm-pdbutil llvm-pdbutil /usr/bin/llvm-pdbutil-${version} \ + --slave /usr/bin/llvm-PerfectShuffle llvm-PerfectShuffle /usr/bin/llvm-PerfectShuffle-${version} \ + --slave /usr/bin/llvm-profdata llvm-profdata /usr/bin/llvm-profdata-${version} \ + --slave /usr/bin/llvm-ranlib llvm-ranlib /usr/bin/llvm-ranlib-${version} \ + --slave /usr/bin/llvm-rc llvm-rc /usr/bin/llvm-rc-${version} \ + --slave /usr/bin/llvm-readelf llvm-readelf /usr/bin/llvm-readelf-${version} \ + --slave /usr/bin/llvm-readobj llvm-readobj /usr/bin/llvm-readobj-${version} \ + --slave /usr/bin/llvm-rtdyld llvm-rtdyld /usr/bin/llvm-rtdyld-${version} \ + --slave /usr/bin/llvm-size llvm-size /usr/bin/llvm-size-${version} \ + --slave /usr/bin/llvm-split llvm-split /usr/bin/llvm-split-${version} \ + --slave /usr/bin/llvm-stress llvm-stress /usr/bin/llvm-stress-${version} \ + --slave /usr/bin/llvm-strings llvm-strings /usr/bin/llvm-strings-${version} \ + --slave /usr/bin/llvm-strip llvm-strip /usr/bin/llvm-strip-${version} \ + --slave /usr/bin/llvm-symbolizer llvm-symbolizer /usr/bin/llvm-symbolizer-${version} \ + --slave /usr/bin/llvm-tblgen llvm-tblgen /usr/bin/llvm-tblgen-${version} \ + --slave /usr/bin/llvm-undname llvm-undname /usr/bin/llvm-undname-${version} \ + --slave /usr/bin/llvm-xray llvm-xray /usr/bin/llvm-xray-${version} + + + update-alternatives \ + --verbose \ + --install /usr/bin/clang clang /usr/bin/clang-${version} ${priority} \ + --slave /usr/bin/clang++ clang++ /usr/bin/clang++-${version} \ + --slave /usr/bin/clang-format clang-format /usr/bin/clang-format-${version} \ + --slave /usr/bin/clang-cpp clang-cpp /usr/bin/clang-cpp-${version} \ + --slave /usr/bin/clang-cl clang-cl /usr/bin/clang-cl-${version} \ + --slave /usr/bin/clangd clangd /usr/bin/clangd-${version} \ + --slave /usr/bin/clang-tidy clang-tidy /usr/bin/clang-tidy-${version} \ + --slave /usr/bin/clang-check clang-check /usr/bin/clang-check-${version} \ + --slave /usr/bin/clang-query clang-query /usr/bin/clang-query-${version} \ + --slave /usr/bin/asan_symbolize asan_symbolize /usr/bin/asan_symbolize-${version} \ + --slave /usr/bin/bugpoint bugpoint /usr/bin/bugpoint-${version} \ + --slave /usr/bin/dsymutil dsymutil /usr/bin/dsymutil-${version} \ + --slave /usr/bin/lld lld /usr/bin/lld-${version} \ + --slave /usr/bin/ld.lld ld.lld /usr/bin/ld.lld-${version} \ + --slave /usr/bin/lld-link lld-link /usr/bin/lld-link-${version} \ + --slave /usr/bin/llc llc /usr/bin/llc-${version} \ + --slave /usr/bin/lli lli /usr/bin/lli-${version} \ + --slave /usr/bin/obj2yaml obj2yaml /usr/bin/obj2yaml-${version} \ + --slave /usr/bin/opt opt /usr/bin/opt-${version} \ + --slave /usr/bin/sanstats sanstats /usr/bin/sanstats-${version} \ + --slave /usr/bin/verify-uselistorder verify-uselistorder /usr/bin/verify-uselistorder-${version} \ + --slave /usr/bin/wasm-ld wasm-ld /usr/bin/wasm-ld-${version} \ + --slave /usr/bin/yaml2obj yaml2obj /usr/bin/yaml2obj-${version} + } + + register_clang_version ${{ inputs.clang_version }} 100 diff --git a/.github/actions/configure-gcc/action.yml b/.github/actions/configure-gcc/action.yml new file mode 100644 index 00000000..7df45840 --- /dev/null +++ b/.github/actions/configure-gcc/action.yml @@ -0,0 +1,34 @@ +name: "Configure gcc" +description: "Installs and configures gcc in a specific version on an ubuntu image" +inputs: + gcc_version: + description: "The version of gcc to install. Must be the major version only." + required: true + enable_x86: + description: "Whether to enable x86 support." + default: "false" +runs: + using: "composite" + steps: + - name: Install g++ and multilib + shell: bash + run: | + apt-get update + apt-get install -y gcc-${{ inputs.gcc_version }} g++-${{ inputs.gcc_version }} ${ADDITIONAL_PACKAGES} + env: + ADDITIONAL_PACKAGES: ${{ case(inputs.enable_x86 == 'true', format('gcc-{0}-multilib g++-{0}-multilib', inputs.gcc_version), '') }} + + - name: Configure gcc + shell: bash + run: | + function register_gcc_version { + local version=$1 + local priority=$2 + + update-alternatives \ + --verbose \ + --install /usr/bin/gcc gcc /usr/bin/gcc-${version} ${priority} \ + --slave /usr/bin/g++ g++ /usr/bin/g++-${version} + } + + register_gcc_version ${{ inputs.gcc_version }} 100 diff --git a/.github/workflows/check-formatting.yaml b/.github/workflows/check-formatting.yaml index f44a7fd2..f30e669b 100644 --- a/.github/workflows/check-formatting.yaml +++ b/.github/workflows/check-formatting.yaml @@ -5,21 +5,28 @@ on: jobs: check-formatting: - runs-on: ubuntu-latest name: Check formatting + runs-on: ubuntu-latest + container: ubuntu:24.04 + defaults: + run: + shell: bash steps: + - name: Install base packages + run: | + apt-get update + apt-get install -y wget tar git make curl + - name: Checkout repository uses: actions/checkout@v6 with: submodules: recursive - - name: Install LLVM and Clang - uses: KyleMayes/install-llvm-action@v2 + - name: Configure clang + uses: ./.github/actions/configure-clang with: - version: "20.1" + clang_version: 20 - name: Test formatting for all files working-directory: ${{ github.workspace }} - run: | - export CLANG_FORMAT_BIN="${LLVM_PATH}/bin/clang-format" - ./scripts/check-format.sh + run: ./scripts/check-format.sh diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 6c3933ae..bedb585f 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -13,47 +13,56 @@ jobs: strategy: matrix: build_arch: [x86, x64] + toolset: [gcc, clang] include: - build_arch: x86 gtk_packages: libgtk-4-dev:i386 libwebkitgtk-6.0-dev:i386 - additional_packages: gcc-14-multilib g++-14-multilib - build_arch: x64 gtk_packages: libgtk-4-dev libwebkitgtk-6.0-dev - name: Build-Test Linux ${{ matrix.build_arch }} + name: Build-Test Linux ${{ matrix.toolset }} ${{ matrix.build_arch }} runs-on: ubuntu-latest container: ubuntu:24.04 defaults: run: shell: bash steps: - - name: Setup env for x86 cross-compilation + - name: Enable i386 architecture if: ${{ matrix.build_arch == 'x86' }} run: dpkg --add-architecture i386 - - name: Install g++ and multilib + - name: Install base packages run: | apt-get update - apt-get install -y wget tar git make curl gcc-14 g++-14 ${{ matrix.gtk_packages }} ${{ matrix.additional_packages }} - update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-14 14 - update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-14 14 - update-alternatives --set gcc /usr/bin/gcc-14 - update-alternatives --set g++ /usr/bin/g++-14 - - - name: Install node - uses: actions/setup-node@v6 - with: - node-version: 24 + apt-get install -y wget tar git make curl ${{ matrix.gtk_packages }} - name: Checkout repository uses: actions/checkout@v6 with: submodules: recursive + - name: Configure gcc + uses: ./.github/actions/configure-gcc + with: + gcc_version: 14 + enable_x86: ${{ case(matrix.build_arch == 'x86', 'true', 'false') }} + + - name: Configure clang + if: ${{ matrix.toolset == 'clang' }} + uses: ./.github/actions/configure-clang + with: + clang_version: 20 + enable_x86: ${{ case(matrix.build_arch == 'x86', 'true', 'false') }} + + - name: Install node + uses: actions/setup-node@v6 + with: + node-version: 24 + - name: Premake generate working-directory: ${{ github.workspace }} env: PREMAKE_NO_PROMPT: 1 - run: ./generate.sh --modman + run: ./generate.sh --cc=${{ matrix.toolset }} --modman - name: Build UI working-directory: ${{ github.workspace }} diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 87b0bf8d..9a855c9b 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -13,14 +13,17 @@ jobs: run: shell: bash steps: - - name: Install g++ and multilib + - name: Install base packages run: | apt-get update - apt-get install -y wget tar git make gcc-14 g++-14 gcc-14-multilib g++-14-multilib - update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-14 14 - update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-14 14 - update-alternatives --set gcc /usr/bin/gcc-14 - update-alternatives --set g++ /usr/bin/g++-14 + apt-get install -y wget tar git make curl + + - name: Configure gcc + if: ${{ matrix.toolset == 'gcc' }} + uses: ./.github/actions/configure-gcc + with: + gcc_version: 14 + enable_x86: "true" - name: Checkout repository uses: actions/checkout@v6 @@ -31,12 +34,12 @@ jobs: working-directory: ${{ github.workspace }} env: PREMAKE_NO_PROMPT: 1 - run: ./generate.sh --oat-version=${{ github.ref_name }} + run: ./generate.sh --cc=gcc --oat-version=${{ github.ref_name }} - name: Build working-directory: ${{ github.workspace }} run: | - make -C build -j$(nproc) config=release_x86 all + scripts/build.sh release x86 chmod +x build/bin/Release_x86/{ImageConverter,Unlinker,Linker} - name: Upload artifacts diff --git a/premake5.lua b/premake5.lua index de9a8c62..535668a0 100644 --- a/premake5.lua +++ b/premake5.lua @@ -31,9 +31,11 @@ workspace "OpenAssetTools" } defaultplatform "x86" - disablewarnings { - "26812" -- Prefer enum class over unscoped - } + filter "toolset:msc" + disablewarnings { + "26812" -- Prefer enum class over unscoped + } + filter {} filter "platforms:x86" architecture "x86" diff --git a/src/ModMan/Utils/DispatchableThread.h b/src/ModMan/Utils/DispatchableThread.h index 383ef586..f557d6b9 100644 --- a/src/ModMan/Utils/DispatchableThread.h +++ b/src/ModMan/Utils/DispatchableThread.h @@ -15,9 +15,9 @@ public: DispatchableThread(); ~DispatchableThread(); DispatchableThread(const DispatchableThread& other) = delete; - DispatchableThread(DispatchableThread&& other) noexcept = default; + DispatchableThread(DispatchableThread&& other) noexcept = delete; DispatchableThread& operator=(const DispatchableThread& other) = delete; - DispatchableThread& operator=(DispatchableThread&& other) noexcept = default; + DispatchableThread& operator=(DispatchableThread&& other) noexcept = delete; void Start(); void Terminate(); diff --git a/src/ModMan/main.cpp b/src/ModMan/main.cpp index 4441853f..ebd59dbc 100644 --- a/src/ModMan/main.cpp +++ b/src/ModMan/main.cpp @@ -134,10 +134,10 @@ int main(int argc, const char** argv) ModManArgs args; auto shouldContinue = true; if (!args.ParseArgs(MODMAN_ARGC, MODMAN_ARGV, shouldContinue)) - return false; + return 1; if (!shouldContinue) - return true; + return 0; con::info("Starting ModMan " GIT_VERSION); diff --git a/src/ObjCompiling/Game/IW4/Material/CompilerMaterialIW4.cpp b/src/ObjCompiling/Game/IW4/Material/CompilerMaterialIW4.cpp index 1b2aad5f..84421051 100644 --- a/src/ObjCompiling/Game/IW4/Material/CompilerMaterialIW4.cpp +++ b/src/ObjCompiling/Game/IW4/Material/CompilerMaterialIW4.cpp @@ -1334,7 +1334,7 @@ namespace public: MaterialLoader(MemoryManager& memory, ISearchPath& searchPath, IGdtQueryable& gdt) : m_memory(memory), - m_search_path(m_search_path), + m_search_path(searchPath), m_gdt(gdt) { } diff --git a/src/ObjLoading/XModel/Gltf/GltfInput.h b/src/ObjLoading/XModel/Gltf/GltfInput.h index 6bb5486f..0fdb6513 100644 --- a/src/ObjLoading/XModel/Gltf/GltfInput.h +++ b/src/ObjLoading/XModel/Gltf/GltfInput.h @@ -1,7 +1,7 @@ #pragma once #include -#include +#include namespace gltf { diff --git a/src/ZoneWriting/Writing/ContentWriterBase.h b/src/ZoneWriting/Writing/ContentWriterBase.h index 47da7b56..9d6dcb3a 100644 --- a/src/ZoneWriting/Writing/ContentWriterBase.h +++ b/src/ZoneWriting/Writing/ContentWriterBase.h @@ -13,8 +13,8 @@ public: virtual ~ContentWriterBase() = default; ContentWriterBase(const ContentWriterBase& other) = default; ContentWriterBase(ContentWriterBase&& other) noexcept = default; - ContentWriterBase& operator=(const ContentWriterBase& other) = default; - ContentWriterBase& operator=(ContentWriterBase&& other) noexcept = default; + ContentWriterBase& operator=(const ContentWriterBase& other) = delete; + ContentWriterBase& operator=(ContentWriterBase&& other) noexcept = delete; protected: void WriteXString(bool atStreamStart);