diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..5d70981 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,208 @@ +name: Main + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + +env: + CMAKE_BUILD_PARALLEL_LEVEL: 2 + MAKEFLAGS: '-j 2' + +jobs: + build: + runs-on: ${{ matrix.os }} + + strategy: + fail-fast: false + matrix: + os: [windows-latest, ubuntu-latest] + build_type: [Release] + c_compiler: [gcc, cl] + include: + - os: windows-latest + c_compiler: cl + cpp_compiler: cl + - os: ubuntu-latest + c_compiler: gcc + cpp_compiler: g++ + exclude: + - os: windows-latest + c_compiler: gcc + - os: ubuntu-latest + c_compiler: cl + + steps: + - uses: actions/checkout@v4 + with: + submodules: true + + - name: Install Qt + uses: jurplel/install-qt-action@v3 + with: + version: "6.6.*" + cache: true + modules: 'qtwebengine qtwebview' + + - name: Set reusable strings + id: strings + shell: bash + run: | + echo "build-output-dir=${{ github.workspace }}/build" >> "$GITHUB_OUTPUT" + echo "prefix-dir=${{ github.workspace }}/prefix" >> "$GITHUB_OUTPUT" + + - name: Setup Linux dependencies + if: runner.os == 'Linux' + run: | + sudo apt-get update + sudo apt-get install \ + gettext \ + gperf \ + libwayland-dev \ + + - name: Cache Prefix + id: cache-prefix-restore + uses: actions/cache/restore@v4 + with: + path: ${{ steps.strings.outputs.prefix-dir }} + key: ${{ runner.os }}-prefix + + - name: Setup Windows dependencies + if: (runner.os == 'Windows') && (steps.cache-prefix-restore.outputs.cache-hit != 'true') + shell: powershell + run: | + $ProgressPreference = 'SilentlyContinue' + + Invoke-WebRequest https://xiv.zone/distrib/dependencies/gettext.zip -OutFile gettext.zip + unzip gettext.zip -d ${{ steps.strings.outputs.prefix-dir }} + + Invoke-WebRequest https://xiv.zone/distrib/dependencies/iconv.zip -OutFile iconv.zip + unzip iconv.zip -d ${{ steps.strings.outputs.prefix-dir }} + + Invoke-WebRequest https://xiv.zone/distrib/dependencies/icoutils.zip -OutFile icoutils.zip + unzip icoutils.zip -d ${{ steps.strings.outputs.prefix-dir }} + + - name: Build zlib + if: (runner.os == 'Windows') && (steps.cache-prefix-restore.outputs.cache-hit != 'true') + run: | + git clone https://github.com/madler/zlib.git + cmake -B ${{ steps.strings.outputs.build-output-dir }}-zlib -DCMAKE_PREFIX_PATH=${{ steps.strings.outputs.prefix-dir }} -DCMAKE_CXX_COMPILER=${{ matrix.cpp_compiler }} -DCMAKE_C_COMPILER=${{ matrix.c_compiler }} -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} -S zlib -DCMAKE_INSTALL_PREFIX=${{ steps.strings.outputs.prefix-dir }} -DBUILD_TESTING=OFF + cmake --build ${{ steps.strings.outputs.build-output-dir }}-zlib --config ${{ matrix.build_type }} --target install + + - name: Build Extra CMake Modules + if: steps.cache-prefix-restore.outputs.cache-hit != 'true' + run: | + git clone https://invent.kde.org/frameworks/extra-cmake-modules.git + cmake -B ${{ steps.strings.outputs.build-output-dir }}-ECM -DCMAKE_PREFIX_PATH=${{ steps.strings.outputs.prefix-dir }} -DCMAKE_CXX_COMPILER=${{ matrix.cpp_compiler }} -DCMAKE_C_COMPILER=${{ matrix.c_compiler }} -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} -S extra-cmake-modules -DCMAKE_INSTALL_PREFIX=${{ steps.strings.outputs.prefix-dir }} -DBUILD_TESTING=OFF + cmake --build ${{ steps.strings.outputs.build-output-dir }}-ECM --config ${{ matrix.build_type }} --target install + cmake --install ${{ steps.strings.outputs.build-output-dir }}-ECM --config ${{ matrix.build_type }} + + - name: Configure KI18n + if: steps.cache-prefix-restore.outputs.cache-hit != 'true' + run: | + git clone https://invent.kde.org/frameworks/ki18n.git + cmake -B ${{ steps.strings.outputs.build-output-dir }}-ki18n -DCMAKE_PREFIX_PATH=${{ steps.strings.outputs.prefix-dir }} -DCMAKE_CXX_COMPILER=${{ matrix.cpp_compiler }} -DCMAKE_C_COMPILER=${{ matrix.c_compiler }} -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} -S ki18n -DCMAKE_INSTALL_PREFIX=${{ steps.strings.outputs.prefix-dir }} -DBUILD_TESTING=OFF + + - name: Windows KI18n workaround + if: (runner.os == 'Windows') && (steps.cache-prefix-restore.outputs.cache-hit != 'true') + run: | + (Get-Content -ReadCount 0 ${{ steps.strings.outputs.build-output-dir }}-ki18n/cmake/build-pofiles.cmake) -replace 'FATAL_ERROR', 'WARNING' | Set-Content ${{ steps.strings.outputs.build-output-dir }}-ki18n/cmake/build-pofiles.cmake + + - name: Build KI18n + if: steps.cache-prefix-restore.outputs.cache-hit != 'true' + run: | + cmake --build ${{ steps.strings.outputs.build-output-dir }}-ki18n --config ${{ matrix.build_type }} --target install + + - name: Build KCoreAddons + if: steps.cache-prefix-restore.outputs.cache-hit != 'true' + run: | + git clone https://invent.kde.org/frameworks/kcoreaddons.git + cmake -B ${{ steps.strings.outputs.build-output-dir }}-kca -DCMAKE_PREFIX_PATH=${{ steps.strings.outputs.prefix-dir }} -DCMAKE_CXX_COMPILER=${{ matrix.cpp_compiler }} -DCMAKE_C_COMPILER=${{ matrix.c_compiler }} -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} -S kcoreaddons -DCMAKE_INSTALL_PREFIX=${{ steps.strings.outputs.prefix-dir }} -DBUILD_TESTING=OFF + cmake --build ${{ steps.strings.outputs.build-output-dir }}-kca --config ${{ matrix.build_type }} --target install + + - name: Build KConfig + if: steps.cache-prefix-restore.outputs.cache-hit != 'true' + run: | + git clone https://invent.kde.org/frameworks/kconfig.git + cmake -B ${{ steps.strings.outputs.build-output-dir }}-kconfig -DCMAKE_PREFIX_PATH=${{ steps.strings.outputs.prefix-dir }} -DCMAKE_CXX_COMPILER=${{ matrix.cpp_compiler }} -DCMAKE_C_COMPILER=${{ matrix.c_compiler }} -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} -S kconfig -DCMAKE_INSTALL_PREFIX=${{ steps.strings.outputs.prefix-dir }} -DBUILD_TESTING=OFF + cmake --build ${{ steps.strings.outputs.build-output-dir }}-kconfig --config ${{ matrix.build_type }} --target install + + - name: Build KArchive + if: steps.cache-prefix-restore.outputs.cache-hit != 'true' + run: | + git clone https://invent.kde.org/frameworks/karchive.git + cmake -B ${{ steps.strings.outputs.build-output-dir }}-karchive -DCMAKE_PREFIX_PATH=${{ steps.strings.outputs.prefix-dir }} -DCMAKE_CXX_COMPILER=${{ matrix.cpp_compiler }} -DCMAKE_C_COMPILER=${{ matrix.c_compiler }} -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} -S karchive -DCMAKE_INSTALL_PREFIX=${{ steps.strings.outputs.prefix-dir }} -DBUILD_TESTING=OFF -DWITH_BZIP2=OFF -DWITH_LIBLZMA=OFF -DWITH_LIBZSTD=OFF # TODO: enable bzip which we need later + cmake --build ${{ steps.strings.outputs.build-output-dir }}-karchive --config ${{ matrix.build_type }} --target install + + - name: Build Kirigami + if: steps.cache-prefix-restore.outputs.cache-hit != 'true' + run: | + git clone https://invent.kde.org/frameworks/kirigami.git + cmake -B ${{ steps.strings.outputs.build-output-dir }}-kirigami -DCMAKE_PREFIX_PATH=${{ steps.strings.outputs.prefix-dir }} -DCMAKE_CXX_COMPILER=${{ matrix.cpp_compiler }} -DCMAKE_C_COMPILER=${{ matrix.c_compiler }} -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} -S kirigami -DCMAKE_INSTALL_PREFIX=${{ steps.strings.outputs.prefix-dir }} -DBUILD_TESTING=OFF + cmake --build ${{ steps.strings.outputs.build-output-dir }}-kirigami --config ${{ matrix.build_type }} --target install + + - name: Build Kirigami Add-ons + if: steps.cache-prefix-restore.outputs.cache-hit != 'true' + run: | + git clone https://invent.kde.org/libraries/kirigami-addons.git + cmake -B ${{ steps.strings.outputs.build-output-dir }}-kirigami-addons -DCMAKE_PREFIX_PATH=${{ steps.strings.outputs.prefix-dir }} -DCMAKE_CXX_COMPILER=${{ matrix.cpp_compiler }} -DCMAKE_C_COMPILER=${{ matrix.c_compiler }} -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} -S kirigami-addons -DCMAKE_INSTALL_PREFIX=${{ steps.strings.outputs.prefix-dir }} -DBUILD_TESTING=OFF + cmake --build ${{ steps.strings.outputs.build-output-dir }}-kirigami-addons --config ${{ matrix.build_type }} --target install + + - name: Build Corrosion + if: steps.cache-prefix-restore.outputs.cache-hit != 'true' + run: | + git clone https://github.com/corrosion-rs/corrosion.git + cmake -B ${{ steps.strings.outputs.build-output-dir }}-corrosion -DCMAKE_PREFIX_PATH=${{ steps.strings.outputs.prefix-dir }} -DCMAKE_CXX_COMPILER=${{ matrix.cpp_compiler }} -DCMAKE_C_COMPILER=${{ matrix.c_compiler }} -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} -S corrosion -DCMAKE_INSTALL_PREFIX=${{ steps.strings.outputs.prefix-dir }} -DCORROSION_BUILD_TESTS=OFF + cmake --build ${{ steps.strings.outputs.build-output-dir }}-corrosion --config ${{ matrix.build_type }} --target install + + - name: Build QCoro + if: steps.cache-prefix-restore.outputs.cache-hit != 'true' + run: | + git clone https://github.com/danvratil/qcoro.git + cmake -B ${{ steps.strings.outputs.build-output-dir }}-qcoro -DCMAKE_PREFIX_PATH=${{ steps.strings.outputs.prefix-dir }} -DCMAKE_CXX_COMPILER=${{ matrix.cpp_compiler }} -DCMAKE_C_COMPILER=${{ matrix.c_compiler }} -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} -S qcoro -DCMAKE_INSTALL_PREFIX=${{ steps.strings.outputs.prefix-dir }} -DBUILD_TESTING=OFF + cmake --build ${{ steps.strings.outputs.build-output-dir }}-qcoro --config ${{ matrix.build_type }} --target install + + - name: Save Prefix + id: cache-prefix-save + uses: actions/cache/save@v4 + with: + path: ${{ steps.strings.outputs.prefix-dir }} + key: ${{ steps.cache-prefix-restore.outputs.cache-primary-key }} + + - name: Configure + run: > + cmake -B ${{ steps.strings.outputs.build-output-dir }} + -DCMAKE_CXX_COMPILER=${{ matrix.cpp_compiler }} + -DCMAKE_C_COMPILER=${{ matrix.c_compiler }} + -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} + -DCMAKE_PREFIX_PATH=${{ steps.strings.outputs.prefix-dir }} + -DCMAKE_INSTALL_PREFIX=${{ steps.strings.outputs.build-output-dir }}/bin + -S ${{ github.workspace }} + + - name: Build + run: cmake --build ${{ steps.strings.outputs.build-output-dir }} --config ${{ matrix.build_type }} --target install + + - name: Copy required DLLs + if: runner.os == 'Windows' + run: | + Copy-Item -Path ${{ steps.strings.outputs.prefix-dir }}/bin/KF6ItemViews.dll -Destination ${{ steps.strings.outputs.build-output-dir }}/bin/bin + Copy-Item -Path ${{ steps.strings.outputs.prefix-dir }}/bin/KF6IconWidgets.dll -Destination ${{ steps.strings.outputs.build-output-dir }}/bin/bin + Copy-Item -Path ${{ steps.strings.outputs.prefix-dir }}/bin/KF6GuiAddons.dll -Destination ${{ steps.strings.outputs.build-output-dir }}/bin/bin + Copy-Item -Path ${{ steps.strings.outputs.prefix-dir }}/bin/KF6ColorScheme.dll -Destination ${{ steps.strings.outputs.build-output-dir }}/bin/bin + Copy-Item -Path ${{ steps.strings.outputs.prefix-dir }}/bin/intl-8.dll -Destination ${{ steps.strings.outputs.build-output-dir }}/bin/bin + Copy-Item -Path ${{ steps.strings.outputs.prefix-dir }}/bin/KF6IconThemes.dll -Destination ${{ steps.strings.outputs.build-output-dir }}/bin/bin + Copy-Item -Path ${{ steps.strings.outputs.prefix-dir }}/bin/iconv.dll -Destination ${{ steps.strings.outputs.build-output-dir }}/bin/bin + Copy-Item -Path ${{ steps.strings.outputs.prefix-dir }}/bin/zlib.dll -Destination ${{ steps.strings.outputs.build-output-dir }}/bin/bin + Copy-Item -Path $env:Qt6_DIR/bin/Qt6PrintSupport.dll -Destination ${{ steps.strings.outputs.build-output-dir }}/bin/bin + + - name: Remove extra files + if: runner.os == 'Windows' + run: | + Remove-Item -Path ${{ steps.strings.outputs.build-output-dir }}/bin/bin/opengl32sw.dll + + - name: Archive artifacts + uses: actions/upload-artifact@v4 + with: + name: ${{ runner.os }}-package + path: ${{ steps.strings.outputs.build-output-dir }}/bin \ No newline at end of file diff --git a/.gitignore b/.gitignore index e06e316..54f53e1 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,7 @@ .directory *.flatpak export/ -.clang-format \ No newline at end of file +.clang-format +# Windows +local/ +prefix/ \ No newline at end of file diff --git a/scripts/windows-build.ps1 b/scripts/windows-build.ps1 new file mode 100644 index 0000000..7b7adfb --- /dev/null +++ b/scripts/windows-build.ps1 @@ -0,0 +1,22 @@ +# SPDX-FileCopyrightText: 2024 NotNite +# SPDX-License-Identifier: CC0-1.0 + +$ErrorActionPreference = "Stop" +$PSNativeCommandUseErrorActionPreference = $true + +$LocalDir = "./local" +$BuildDir = "./build" +$PrefixDir = (Get-Location).Path + "/prefix" + +cmake -B "$BuildDir" "-DCMAKE_PREFIX_PATH=$PrefixDir" "-DCMAKE_CXX_COMPILER=cl" "-DCMAKE_C_COMPILER=cl" "-DCMAKE_BUILD_TYPE=Debug" "-S" . "-DCMAKE_INSTALL_PREFIX=$BuildDir" +cmake --build "$BuildDir" --config Debug --target install + +Copy-Item -Path "$PrefixDir/bin/KF6ItemViews.dll" -Destination "$BuildDir/bin" +Copy-Item -Path "$PrefixDir/bin/KF6IconWidgets.dll" -Destination "$BuildDir/bin" +Copy-Item -Path "$PrefixDir/bin/KF6GuiAddons.dll" -Destination "$BuildDir/bin" +Copy-Item -Path "$PrefixDir/bin/KF6ColorScheme.dll" -Destination "$BuildDir/bin" +Copy-Item -Path "$PrefixDir/bin/intl-8.dll" -Destination "$BuildDir/bin" +Copy-Item -Path "$PrefixDir/bin/KF6IconThemes.dll" -Destination "$BuildDir/bin" +Copy-Item -Path "$PrefixDir/bin/iconv.dll" -Destination "$BuildDir/bin" +Copy-Item -Path "$PrefixDir/bin/zlibd.dll" -Destination "$BuildDir/bin" +Copy-Item -Path "$env:QTDIR/bin/Qt6PrintSupportd.dll" -Destination "$BuildDir/bin" diff --git a/scripts/windows-setup.ps1 b/scripts/windows-setup.ps1 new file mode 100644 index 0000000..89e29ca --- /dev/null +++ b/scripts/windows-setup.ps1 @@ -0,0 +1,116 @@ +# SPDX-FileCopyrightText: 2024 NotNite +# SPDX-License-Identifier: CC0-1.0 + +$ErrorActionPreference = "Stop" +$PSNativeCommandUseErrorActionPreference = $true + +$LocalDir = "./local" +$BuildDir = "$LocalDir/build" +$PrefixDir = (Get-Location).Path + "/prefix" + +$NumCores = [Environment]::ProcessorCount + +function Configure($Name, $ExtraArgs = "") { + $Command = "cmake -B $BuildDir-$Name -DCMAKE_PREFIX_PATH=$PrefixDir -DCMAKE_CXX_COMPILER=cl -DCMAKE_C_COMPILER=cl -DCMAKE_BUILD_TYPE=Debug -S $LocalDir/$Name -DCMAKE_INSTALL_PREFIX=$PrefixDir $ExtraArgs" + Write-Output "Running $Command" + Invoke-Expression $Command + if ($LASTEXITCODE -ne 0) { + throw "Failed to configure $Name" + } +} + +function Clone($Name, $Url) { + if (Test-Path "$LocalDir/$Name") { + Write-Information "Skipping clone of $Name because it's source directory already exists" + } else { + git clone --depth=1 $Url "$LocalDir/$Name" + + if ($LASTEXITCODE -ne 0) { + throw "Failed to clone $Name from $Url" + } + } +} + +function CheckCompileResult($Name) { + if ($LASTEXITCODE -ne 0) { + throw "Failed to build $Name!" + } +} + +if (!(Test-Path $LocalDir)) { + New-Item -ItemType Directory -Path $LocalDir +} + +# Setup Windows dependencies +Invoke-WebRequest https://xiv.zone/distrib/dependencies/gettext.zip -OutFile "$LocalDir/gettext.zip" +Expand-Archive -Path "$LocalDir/gettext.zip" -DestinationPath $PrefixDir -Force + +Invoke-WebRequest https://xiv.zone/distrib/dependencies/iconv.zip -OutFile "$LocalDir/iconv.zip" +Expand-Archive -Path "$LocalDir/iconv.zip" -DestinationPath $PrefixDir -Force + +Invoke-WebRequest https://xiv.zone/distrib/dependencies/icoutils.zip -OutFile "$LocalDir/icoutils.zip" +Expand-Archive -Path "$LocalDir/icoutils.zip" -DestinationPath $PrefixDir -Force + +# Build zlib +Clone "zlib" "https://github.com/madler/zlib.git" +Configure "zlib" "-DBUILD_TESTING=OFF" +cmake --build "$BuildDir-zlib" --config Debug --target install +CheckCompileResult "zlib" + +# Build Extra CMake Modules +Clone "extra-cmake-modules" "https://invent.kde.org/frameworks/extra-cmake-modules.git" +Configure "extra-cmake-modules" "-DBUILD_TESTING=OFF" +cmake --build "$BuildDir-extra-cmake-modules" --config Debug --target install --parallel $NumCores +cmake --install "$BuildDir-extra-cmake-modules" --config Debug +CheckCompileResult "extra-cmake-modules" + +# Build KI18n +Clone "ki18n" "https://invent.kde.org/frameworks/ki18n.git" +# Workaround for Windows +Configure "ki18n" "-DBUILD_TESTING=OFF" + +(Get-Content -ReadCount 0 "$BuildDir-ki18n/cmake/build-pofiles.cmake") -replace 'FATAL_ERROR', 'WARNING' | Set-Content "$BuildDir-ki18n/cmake/build-pofiles.cmake" +cmake --build "$BuildDir-ki18n" --config Debug --target install --parallel $NumCores +CheckCompileResult "ki18n" + +# Build KCoreAddons +Clone "kcoreaddons" "https://invent.kde.org/frameworks/kcoreaddons.git" +Configure "kcoreaddons" "-DBUILD_TESTING=OFF" +cmake --build "$BuildDir-kcoreaddons" --config Debug --target install --parallel $NumCores +CheckCompileResult "kcoreaddons" + +# Build KConfig +Clone "kconfig" "https://invent.kde.org/frameworks/kconfig.git" +Configure "kconfig" "-DBUILD_TESTING=OFF" +cmake --build "$BuildDir-kconfig" --config Debug --target install --parallel $NumCores +CheckCompileResult "kconfig" + +# Build KArchive +Clone "karchive" "https://invent.kde.org/frameworks/karchive.git" +Configure "karchive" "-DBUILD_TESTING=OFF -DWITH_BZIP2=OFF -DWITH_LIBLZMA=OFF -DWITH_LIBZSTD=OFF" +cmake --build "$BuildDir-karchive" --config Debug --target install --parallel $NumCores +CheckCompileResult "karchive" + +# Build Kirigami +Clone "kirigami" "https://invent.kde.org/frameworks/kirigami.git" +Configure "kirigami" "-DBUILD_TESTING=OFF" +cmake --build "$BuildDir-kirigami" --config Debug --target install --parallel $NumCores +CheckCompileResult "kirigami" + +# Build Kirigami Add-ons +Clone "kirigami-addons" "https://invent.kde.org/libraries/kirigami-addons.git" +Configure "kirigami-addons" "-DBUILD_TESTING=OFF" +cmake --build "$BuildDir-kirigami-addons" --config Debug --target install --parallel $NumCores +CheckCompileResult "kirigami-addons" + +# Build Corrosion +Clone "corrosion" "https://github.com/corrosion-rs/corrosion.git" +Configure "corrosion" "-DCORROSION_BUILD_TESTS=OFF" +cmake --build "$BuildDir-corrosion" --config Debug --target install --parallel $NumCores +CheckCompileResult "corrosion" + +# Build QCoro +Clone "qcoro" "https://github.com/danvratil/qcoro.git" +Configure "qcoro" "-DBUILD_TESTING=OFF" +cmake --build "$BuildDir-qcoro" --config Debug --target install --parallel $NumCores +CheckCompileResult "qcoro"