diff --git a/.github/workflows/ci-windows.yml b/.github/workflows/ci-windows.yml index b805c8eb..1c7b5ae0 100644 --- a/.github/workflows/ci-windows.yml +++ b/.github/workflows/ci-windows.yml @@ -1,21 +1,15 @@ name: CI (Windows) on: workflow_call: -env: - CMAKE_BUILD_PARALLEL_LEVEL: '4' jobs: build: name: Windows runs-on: windows-2022 steps: - - name: Checkout source + - name: Checkout repository uses: actions/checkout@v4 - - name: Install Ninja - run: choco install ninja - name: Generate cache keys run: | - echo "qt=${{ runner.os }}-qt-6.7.2" >> $env:GITHUB_OUTPUT - echo "target=${{ runner.os }}-target" >> $env:GITHUB_OUTPUT echo "vulkan=${{ runner.os }}-vulkan-1.3.290.0" >> $env:GITHUB_OUTPUT id: cache-keys - name: Restore Vulkan SDK @@ -33,70 +27,22 @@ jobs: if: ${{ steps.restore-vulkan.outputs.cache-hit != 'true' }} - name: Set Vulkan SDK path run: echo "VULKAN_SDK=C:\VulkanSDK" >> $env:GITHUB_ENV - - name: Restore Qt - uses: actions/cache/restore@v4 - with: - path: qt - key: ${{ steps.cache-keys.outputs.qt }} - id: restore-qt - - name: Download Qt - run: | - Invoke-WebRequest ` - -Uri "https://download.qt.io/official_releases/qt/6.7/6.7.2/single/qt-everywhere-src-6.7.2.tar.xz" ` - -OutFile qt.tar.xz - 7z x -so qt.tar.xz | 7z x -si -ttar - rm qt.tar.xz - mkdir qt-build - if: ${{ steps.restore-qt.outputs.cache-hit != 'true' }} - - name: Build Qt - run: | - call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" amd64 - ${{ github.workspace }}\qt-everywhere-src-6.7.2\configure.bat -prefix "${{ github.workspace }}\qt" -no-openssl && cmake --build . --parallel && cmake --install . - shell: cmd - working-directory: qt-build - if: ${{ steps.restore-qt.outputs.cache-hit != 'true' }} - - name: Set Qt path - run: echo "CMAKE_PREFIX_PATH=qt" >> $env:GITHUB_ENV - - name: Restore target directory - uses: actions/cache/restore@v4 - with: - path: target - key: ${{ steps.cache-keys.outputs.target }} - name: Update Rust run: rustup update stable - name: Add additional Rust targets run: rustup target add x86_64-unknown-none - - name: Run CMake - run: cmake --preset windows-release . - name: Build - run: cmake --build --preset windows-release - - name: Build Slint - run: cargo build -p gui --bin obliteration -F slint -r + run: python3 build.py -r - name: Run tests run: cargo test --workspace --exclude gui --exclude kernel - working-directory: src - - name: Export artifacts - run: cmake --install build --prefix dist - name: Upload artifacts uses: actions/upload-artifact@v4 with: name: obliteration-win-x64 path: dist - - name: Cache target directory - uses: actions/cache/save@v4 - with: - path: target - key: ${{ steps.cache-keys.outputs.target }}-${{ github.run_id }} - if: startsWith(github.ref, 'refs/heads/') - name: Cache Vulkan SDK uses: actions/cache/save@v4 with: path: C:\VulkanSDK key: ${{ steps.cache-keys.outputs.vulkan }} if: startsWith(github.ref, 'refs/heads/') && steps.install-vulkan.outputs.new-install == 'true' - - name: Cache Qt - uses: actions/cache/save@v4 - with: - path: qt - key: ${{ steps.cache-keys.outputs.qt }} - if: startsWith(github.ref, 'refs/heads/') && steps.restore-qt.outputs.cache-hit != 'true' diff --git a/.vscode/settings.json b/.vscode/settings.json index 1f728525..0d58b288 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,6 +2,14 @@ "[json]": { "editor.formatOnSave": true }, + "[jsonl]": { + "editor.formatOnSave": true + }, + "[python]": { + "editor.rulers": [ + 100 + ] + }, "[rust]": { "editor.defaultFormatter": "rust-lang.rust-analyzer", "editor.formatOnSave": true, diff --git a/Cargo.toml b/Cargo.toml index 5ad5c179..ec9c4588 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,7 @@ members = [ "src/param", "src/pfs", "src/pkg", - "src/tls" + "src/tls", ] [profile.dev] @@ -20,5 +20,4 @@ panic = "abort" [profile.release] panic = "abort" -debug = "full" lto = true diff --git a/build.py b/build.py index 4a2569e4..d713039e 100755 --- a/build.py +++ b/build.py @@ -28,9 +28,7 @@ def cargo(package, toolchain=None, target=None, release=False, args=None): if args is not None: cmd.extend(args) - cmd.extend([ - '--message-format', 'json-render-diagnostics' - ]) + cmd.extend(['--message-format', 'json-render-diagnostics']) # Run. with Popen(cmd, stdout=PIPE) as proc: @@ -48,42 +46,43 @@ def cargo(package, toolchain=None, target=None, release=False, args=None): return artifact -def export_darwin(root, kern): - # Create bundle directory. +def export_darwin(root, kern, gui): + # Create directories. bundle = os.path.join(root, 'Obliteration.app') - - os.mkdir(bundle) - - # Create Contents directory. contents = os.path.join(bundle, 'Contents') - - os.mkdir(contents) - - # Create Resources directory. + macos = os.path.join(contents, 'MacOS') resources = os.path.join(contents, 'Resources') + os.mkdir(bundle) + os.mkdir(contents) + os.mkdir(macos) os.mkdir(resources) - # Copy kernel. + # Export files shutil.copy(kern['executable'], resources) + shutil.copy(gui['executable'], macos) -def export_linux(root, kern): +def export_linux(root, kern, gui): + # Create directories. + bin = os.path.join(root, 'bin') + share = os.path.join(root, 'share') + + os.mkdir(bin) + os.mkdir(share) + + # Export files. + shutil.copy(kern['executable'], share) + shutil.copy(gui['executable'], bin) + +def export_windows(root, kern, gui): # Create share directory. share = os.path.join(root, 'share') os.mkdir(share) - # Copy kernel. - shutil.copy(kern['executable'], share) - -def export_windows(root, kern): - # Create share directory. - share = os.path.join(root, 'share') - - os.mkdir(share) - - # Copy kernel. + # Export files. shutil.copy(kern['executable'], share) + shutil.copy(gui['executable'], root) def main(): # Setup argument parser. @@ -98,14 +97,14 @@ def main(): # Build kernel. m = platform.machine() - if m == 'arm64' or m == 'aarch64': + if m == 'aarch64' or m == 'arm64': kern = cargo( 'obkrnl', toolchain='nightly', target='aarch64-unknown-none-softfloat', release=args.release, args=['-Z', 'build-std=core,alloc']) - elif m == 'x86_64': + elif m == 'x86_64' or m == 'AMD64': kern = cargo( 'obkrnl', target='x86_64-unknown-none', @@ -114,6 +113,9 @@ def main(): print(f'Architecture {m} is not supported.', file=sys.stderr) sys.exit(1) + # Build GUI. + gui = cargo('gui', release=args.release, args=['--bin', 'obliteration', '-F', 'slint']) + # Create output directory. dest = 'dist' @@ -126,11 +128,11 @@ def main(): s = platform.system() if s == 'Darwin': - export_darwin(dest, kern) + export_darwin(dest, kern, gui) elif s == 'Linux': - export_linux(dest, kern) + export_linux(dest, kern, gui) elif s == 'Windows': - export_windows(dest, kern) + export_windows(dest, kern, gui) else: print(f'OS {s} is not supported.', file=sys.stderr) sys.exit(1) diff --git a/gui/main_window.cpp b/gui/main_window.cpp index 7ad9eabc..e128b9f8 100644 --- a/gui/main_window.cpp +++ b/gui/main_window.cpp @@ -30,7 +30,6 @@ #include #include -#include #include #ifndef _WIN32 @@ -107,7 +106,6 @@ MainWindow::MainWindow( connect(m_launch, &LaunchSettings::saveClicked, this, &MainWindow::saveProfile); connect(m_launch, &LaunchSettings::startClicked, [this](const QString &debug) { if (debug.isEmpty()) { - startVmm({}); } else { startDebug(debug); } @@ -356,9 +354,6 @@ void MainWindow::debuggerConnected() QString("Failed to accept a debugger connection: %1.").arg(error_message(error))); return; } - - // Start VMM. - startVmm(std::move(debugger)); } void MainWindow::vmmError(const QString &msg) @@ -562,37 +557,6 @@ void MainWindow::startDebug(const QString &addr) } } -void MainWindow::startVmm(Rust &&debug) -{ - // Get full path to kernel binary. - std::string kernel; - - m_debugServer.free(); - - if (m_args.isSet(Args::kernel)) { - kernel = m_args.value(Args::kernel).toStdString(); - } else { -#ifdef _WIN32 - std::filesystem::path b(QCoreApplication::applicationDirPath().toStdString(), std::filesystem::path::native_format); - b /= L"share"; - b /= L"obkrnl"; - kernel = b.u8string(); -#else - auto b = std::filesystem::path(QCoreApplication::applicationDirPath().toStdString(), std::filesystem::path::native_format).parent_path(); -#ifdef __APPLE__ - b /= "Resources"; -#else - b /= "share"; -#endif - b /= "obkrnl"; - kernel = b.u8string(); -#endif - } - - // Swap launch settings with the screen before getting a Vulkan surface otherwise it will fail. - m_main->setCurrentIndex(1); -} - bool MainWindow::requireVmmStopped() { if (m_vmm) { diff --git a/gui/main_window.hpp b/gui/main_window.hpp index 3a9b2252..6179290e 100644 --- a/gui/main_window.hpp +++ b/gui/main_window.hpp @@ -33,7 +33,6 @@ public: bool loadGames(); void restoreGeometry(); void startDebug(const QString &addr); - void startVmm(Rust &&debug); protected: void closeEvent(QCloseEvent *event) override; private slots: