diff --git a/.github/workflows/linux-workflow.yaml b/.github/workflows/linux-workflow.yaml index 07f943b212..1408986643 100644 --- a/.github/workflows/linux-workflow.yaml +++ b/.github/workflows/linux-workflow.yaml @@ -1,7 +1,5 @@ name: Linux -# Controls when the action will run. Triggers the workflow on push or pull request -# events but only for the master branch on: push: branches: @@ -15,7 +13,6 @@ on: jobs: build: strategy: - # Prevent one build from failing everything (although maybe those should be included as experimental builds instead) fail-fast: false matrix: os: [ubuntu-20.04] @@ -23,7 +20,6 @@ jobs: name: ${{ matrix.compiler }} runs-on: ${{ matrix.os }} - # Set some sort of timeout in the event of run-away builds. We are limited on concurrent jobs so, get rid of them. timeout-minutes: 45 env: # overrides: https://github.com/mbitsnbites/buildcache/blob/master/doc/configuration.md @@ -33,63 +29,66 @@ jobs: BUILDCACHE_DIRECT_MODE: true BUILDCACHE_LOG_FILE: ${{ github.workspace }}/buildcache.log + # TODO - separate clang and gcc into separate workflows + steps: - name: Checkout Repository uses: actions/checkout@v2 - - name: Checkout Submodules - run: git submodule update --init --recursive -j 2 - - - name: Get Common Package Dependencies - run: sudo apt install build-essential cmake clang gcc g++ lcov make nasm libxrandr-dev libxinerama-dev libxcursor-dev libpulse-dev libxi-dev zip - - - name: Get Clang - if: matrix.compiler == 'clang' - run: sudo apt install clang + - name: Install Package Dependencies + run: > + sudo apt install build-essential cmake + clang gcc g++ lcov make nasm libxrandr-dev + libxinerama-dev libxcursor-dev libpulse-dev + libxi-dev zip - name: Setup Buildcache - uses: mikehardy/buildcache-action@v1.2.2 + uses: mikehardy/buildcache-action@v1.3.0 with: cache_key: ${{ matrix.os }}-${{ matrix.compiler }} - - name: CMake Generation - Clang - if: matrix.compiler == 'clang' && !startsWith(github.ref, 'refs/tags/') + # TODO - CMake - replace with presets! + - name: CMake Generation - Clang - ASAN + if: matrix.compiler == 'clang' + env: + CC: clang + CXX: clang++ run: | - export CC=clang - export CXX=clang++ + ls -l ${{ github.workspace }}/buildcache/bin/buildcache cmake -B build \ -DCMAKE_BUILD_TYPE=Release \ - -DBUILD_FOR_RELEASE=ON \ - -DCMAKE_C_COMPILER_LAUNCHER="${{ github.workspace }}"/buildcache/bin/buildcache \ - -DCMAKE_CXX_COMPILER_LAUNCHER="${{ github.workspace }}"/buildcache/bin/buildcache \ - -DASAN_BUILD=ON + -DASAN_BUILD=ON \ + -DCMAKE_C_COMPILER_LAUNCHER=${{ github.workspace }}/buildcache/bin/buildcache \ + -DCMAKE_CXX_COMPILER_LAUNCHER=${{ github.workspace }}/buildcache/bin/buildcache - - name: CMake Generation - Clang - No ASAN + # TODO - CMake - replace with presets! + - name: CMake Generation - Clang - Statically Linked if: matrix.compiler == 'clang' && startsWith(github.ref, 'refs/tags/') + env: + CC: clang + CXX: clang++ run: | - export CC=clang - export CXX=clang++ cmake -B build \ -DCMAKE_BUILD_TYPE=Release \ - -DBUILD_FOR_RELEASE=ON \ - -DCMAKE_C_COMPILER_LAUNCHER="${{ github.workspace }}"/buildcache/bin/buildcache \ - -DCMAKE_CXX_COMPILER_LAUNCHER="${{ github.workspace }}"/buildcache/bin/buildcache \ - -DASAN_BUILD=OFF + -DSTATICALLY_LINK=ON \ + -DCMAKE_C_COMPILER_LAUNCHER=${{ github.workspace }}/buildcache/bin/buildcache \ + -DCMAKE_CXX_COMPILER_LAUNCHER=${{ github.workspace }}/buildcache/bin/buildcache - name: CMake Generation - GCC if: matrix.compiler == 'gcc' + env: + CC: gcc + CXX: g++ run: | - export CC=gcc - export CXX=g++ cmake -B build \ -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_C_COMPILER_LAUNCHER="${{ github.workspace }}"/buildcache/bin/buildcache \ - -DCMAKE_CXX_COMPILER_LAUNCHER="${{ github.workspace }}"/buildcache/bin/buildcache \ - -DCODE_COVERAGE=ON + -DCODE_COVERAGE=ON \ + -DCMAKE_C_COMPILER_LAUNCHER=${{ github.workspace }}/buildcache/bin/buildcache \ + -DCMAKE_CXX_COMPILER_LAUNCHER=${{ github.workspace }}/buildcache/bin/buildcache - name: Build Project working-directory: ./build - run: make -j4 + run: make -j$((`nproc`+1)) - name: Run Tests if: matrix.compiler == 'clang' @@ -105,9 +104,27 @@ jobs: continue-on-error: true with: project-token: ${{ secrets.CODACY_PROJECT_KEY }} - # lcov report coverage-reports: ./build/goalc-test_coverage.info + - name: Upload artifact + # NOTE - the GCC executables are huge as they've been compiled with coverage support + if: matrix.compiler == 'clang' + uses: actions/upload-artifact@v3 + with: + name: opengoal-${{ matrix.os }}-${{ matrix.compiler }} + path: | + ./build/**/*.so + ./build/**/*.a + ./build/decompiler/decompiler + ./build/decompiler/extractor + ./build/game/gk + ./build/sound/sndplay + ./build/goalc/goalc + ./build/tools/dgo_packer + ./build/tools/dgo_unpacker + ./build/tools/memory_dump_tolls + ./build/tools/level_tools/level_dump + # ---- Release / Tagging related steps ---- - name: Prepare Build Artifacts if: github.repository == 'open-goal/jak-project' && startsWith(github.ref, 'refs/tags/') && matrix.compiler == 'clang' diff --git a/.github/workflows/windows-workflow.yaml b/.github/workflows/windows-workflow.yaml index 5974536ef2..9a9fdb0a6c 100644 --- a/.github/workflows/windows-workflow.yaml +++ b/.github/workflows/windows-workflow.yaml @@ -39,45 +39,52 @@ jobs: - name: Checkout Repository uses: actions/checkout@v2 - - name: Checkout Submodules - run: git submodule update --init --recursive -j 2 - - - name: Install Dependencies - run: Choco-Install -PackageName nasm + - name: Install NASM + run: choco install ${{ github.workspace }}/third-party/nasm/nasm.2.15.05.nupkg - name: Setup Buildcache - uses: mikehardy/buildcache-action@v1.2.2 + uses: mikehardy/buildcache-action@v1.3.0 with: cache_key: ${{ matrix.os }}-${{ matrix.compiler }} - # TODO - eventually fight with this to get it to use Ninja and such - - name: CMake Generation - shell: cmd # ideally id like everything to be powershell but running this bat file is finicky - run: | - if "${{ matrix.compiler }}" == "clang" ( - call "C:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC/Auxiliary/Build/vcvars64.bat" - cmake -B build -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DBUILD_FOR_RELEASE=ON -DCMAKE_C_COMPILER="C:/Program Files/LLVM/bin/clang-cl.exe" -DCMAKE_CXX_COMPILER="C:/Program Files/LLVM/bin/clang-cl.exe" . - ) else ( - call "C:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC/Auxiliary/Build/vcvars64.bat" - cmake -B build -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER_LAUNCHER="${{ github.workspace }}"/buildcache/bin/buildcache.exe -DCMAKE_CXX_COMPILER_LAUNCHER="${{ github.workspace }}"/buildcache/bin/buildcache.exe . - ) + - uses: ilammy/msvc-dev-cmd@v1 + + # TODO - separate workflows! + + - name: CMake Generation - Clang + shell: cmd + if: matrix.compiler == 'clang' + run: cmake -B build --preset=Release-clang -DCMAKE_C_COMPILER_LAUNCHER=${{ github.workspace }}/buildcache/bin/buildcache.exe -DCMAKE_CXX_COMPILER_LAUNCHER=${{ github.workspace }}/buildcache/bin/buildcache.exe . + + - name: CMake Generation - Clang - Statically Linked + shell: cmd + if: matrix.compiler == 'clang' && startsWith(github.ref, 'refs/tags/') + run: cmake -B build --preset=Release-clang-static -DCMAKE_C_COMPILER_LAUNCHER=${{ github.workspace }}/buildcache/bin/buildcache.exe -DCMAKE_CXX_COMPILER_LAUNCHER=${{ github.workspace }}/buildcache/bin/buildcache.exe . + + - name: CMake Generation - MSVC + shell: cmd + if: matrix.compiler == 'msvc' + run: cmake -B build --preset=Release-msvc -DCMAKE_C_COMPILER_LAUNCHER=${{ github.workspace }}/buildcache/bin/buildcache.exe -DCMAKE_CXX_COMPILER_LAUNCHER=${{ github.workspace }}/buildcache/bin/buildcache.exe . - name: Build Project - working-directory: ./build shell: cmd run: | - call "C:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC/Auxiliary/Build/vcvars64.bat" if "${{ matrix.compiler }}" == "msvc" ( set CL=/MP ) - nmake + cmake --build build -j 2 - name: Run Tests - timeout-minutes: 5 - env: - NEXT_DIR: ${{ github.workspace }} + timeout-minutes: 10 run: ./build/bin/goalc-test.exe --gtest_color=yes --gtest_filter="-*MANUAL_TEST*" + - name: Upload artifact + if: matrix.compiler == 'clang' + uses: actions/upload-artifact@v3 + with: + name: opengoal-${{ matrix.os }}-${{ matrix.compiler }} + path: ./build/bin + # ---- Release / Tagging related steps ---- - name: Prepare Build Artifacts if: github.repository == 'open-goal/jak-project' && startsWith(github.ref, 'refs/tags/') && matrix.compiler == 'clang' diff --git a/CMakeLists.txt b/CMakeLists.txt index 116d7a0ba0..da4f6b8b01 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,43 +5,70 @@ set(CMAKE_CXX_STANDARD 17) project(jak) include(CTest) +# Include third-party modules +set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/third-party/cmake/modules/) + +# Default to Release mode if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "Release") endif() -option(BUILD_FOR_RELEASE "Build for release purposes (static everything)" OFF) -if(BUILD_FOR_RELEASE) +# Potentially statically build the project +option(STATICALLY_LINK "Build for release purposes (statically link everything)" OFF) + +if(STATICALLY_LINK) + message(STATUS "Statically linking project") set(BUILD_SHARED_LIBS OFF) else() set(BUILD_SHARED_LIBS ON) endif() -# Set default compile flags -# optimization level can be set here. You can overwrite these in a per-project basis if you want. -if(MSVC AND (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")) - message(STATUS "Clang on MSVC detected! Adding compile flags") +# Setup compiler flags +# TODO - consider moving most of the configuration into presets +# - https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html +# - requires atleast CMake 3.19 +if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + message(STATUS "Clang Detected - Setting Defaults") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \ - -Xclang -fcxx-exceptions \ - -Xclang -fexceptions \ - -Xclang -std=c++17 \ - -Xclang -D_CRT_SECURE_NO_WARNINGS \ - /arch:AVX \ - -Wno-c++11-narrowing -Wno-c++98-compat -Wno-c++20-compat -W3") + -fcxx-exceptions \ + -fexceptions \ + -fdiagnostics-color=always \ + -std=c++17 \ + -mavx \ + -Wall \ + -Wno-c++11-narrowing \ + -Wno-c++98-compat \ + -O3") - # linker flags - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /STACK:16000000,16384") - - # additional c++ and linker flags for release mode for our projects - if(CMAKE_BUILD_TYPE MATCHES "Release") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /O2 /Ob2") - elseif(CMAKE_BUILD_TYPE MATCHES "RelWithDebInfo") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /O2 /Ob2") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /DEBUG") + # Increase stack size for windows, who's default is too low + if(WIN32) + # Increase the reserved stack size for all threads to 16MB + # Note: this is only _reserved_ memory, not necessarily _committed_ memory + # TODO - test with add_link_options instead + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${LDFLAGS} -Xlinker /STACK:16000000") endif() -elseif(UNIX) - message(STATUS "GCC detected! Adding compile flags") + # additional c++ and linker flags for release mode for our projects + if(CMAKE_BUILD_TYPE MATCHES "Release" OR CMAKE_BUILD_TYPE MATCHES "RelWithDebInfo") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3") + endif() + + if(CMAKE_BUILD_TYPE MATCHES "RelWithDebInfo") + # TODO - test with add_link_options instead + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${LDFLAGS} -Xlinker /debug") + endif() + + # Fuzzing + if(NOT STATICALLY_LINK AND ASAN_BUILD) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -O1") + message(STATUS "Doing ASAN build") + endif() + + # Warnings + set(THIRDPARTY_IGNORED_WARNINGS "-Wno-everything") +elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + message(STATUS "GCC detected - Setting Defaults") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \ -Wall \ @@ -64,62 +91,59 @@ elseif(UNIX) if(CMAKE_BUILD_TYPE MATCHES "Release") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3") endif() + set(THIRDPARTY_IGNORED_WARNINGS "-w") +elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") + message(STATUS "MSVC detected - Setting Defaults") -elseif(MSVC) - message(STATUS "MSVC detected!! Adding compile flags") - if(CMAKE_BUILD_TYPE MATCHES "Debug") - # This actually breaks some standard library things for some reason? - # message("Setting Flags to Enable Edit and Continue") - # set(CMAKE_CXX_FLAGS_DEBUG "/ZI") - endif() - # c++ flags for all build types set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc /utf-8 /arch:AVX") - # linker flags + # Increase stack size for windows, who's default is too low + # Increase the reserved stack size for all threads to 16MB set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /STACK:16000000,16384") - + # additional c++ and linker flags for specific build types - if(CMAKE_BUILD_TYPE MATCHES "Release") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /O2 /Ob2") - elseif(CMAKE_BUILD_TYPE MATCHES "RelWithDebInfo") + if(CMAKE_BUILD_TYPE MATCHES "Release" OR CMAKE_BUILD_TYPE MATCHES "RelWithDebInfo") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /O2 /Ob2") + endif() + + if(CMAKE_BUILD_TYPE MATCHES "RelWithDebInfo") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /DEBUG") endif() + set(THIRDPARTY_IGNORED_WARNINGS "/w") +else() + message(FATAL_ERROR "Unknown Compiler '${CMAKE_CXX_COMPILER_ID}', get out!") endif() +# Platform Specific Settings if(WIN32) set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) - set(CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION 7.1.7600.0.30514) # win7.1, supports xp message("Windows SDK version: ${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION}") endif() -if(ASAN_BUILD) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -O1") - message(STATUS "Doing ASAN build") -endif() - +# Code Coverage option(CODE_COVERAGE "Enable Code Coverage Compiler Flags" OFF) -set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/third-party/cmake/modules/) -if(UNIX AND CODE_COVERAGE) - include(CodeCoverage) - append_coverage_compiler_flags() - message("Code Coverage build is enabled!") -else() - message("Code Coverage build is disabled!") +if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CODE_COVERAGE) + include(CodeCoverage) + append_coverage_compiler_flags() + message(STATUS "Code Coverage build is enabled!") endif() +# Dependencies and Libraries # includes relative to top level jak-project folder include_directories(./) +# build templating engine library +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${THIRDPARTY_IGNORED_WARNINGS} ") include_directories(SYSTEM third-party/inja) # build repl library add_subdirectory(third-party/replxx EXCLUDE_FROM_ALL) +string(REPLACE " ${THIRDPARTY_IGNORED_WARNINGS} " "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") # build common library add_subdirectory(common) @@ -127,6 +151,7 @@ add_subdirectory(common) # build decompiler add_subdirectory(decompiler) +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${THIRDPARTY_IGNORED_WARNINGS} ") add_subdirectory(third-party/cubeb) # build glfw library @@ -137,6 +162,7 @@ add_subdirectory(third-party/zstd) include_directories(third-party/glad/include) include_directories(third-party/glfw/include) add_subdirectory(third-party/imgui) +string(REPLACE " ${THIRDPARTY_IGNORED_WARNINGS} " "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") # build the game code in C++ add_subdirectory(game) @@ -149,41 +175,47 @@ add_subdirectory(tools) # build the gtest libraries if(WIN32) - set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) + set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) endif() + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${THIRDPARTY_IGNORED_WARNINGS} ") add_subdirectory(third-party/googletest EXCLUDE_FROM_ALL) include(GoogleTest) +string(REPLACE " ${THIRDPARTY_IGNORED_WARNINGS} " "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") # build tests include(test/CMakeLists.txt) # build lzokay library +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${THIRDPARTY_IGNORED_WARNINGS} ") add_subdirectory(third-party/lzokay EXCLUDE_FROM_ALL) # build format library add_subdirectory(third-party/fmt EXCLUDE_FROM_ALL) + add_subdirectory(third-party/stb_image EXCLUDE_FROM_ALL) add_subdirectory(third-party/tiny_gltf EXCLUDE_FROM_ALL) add_subdirectory(third-party/xdelta3 EXCLUDE_FROM_ALL) - # discord rich presence include_directories(third-party/discord-rpc/include) add_subdirectory(third-party/discord-rpc EXCLUDE_FROM_ALL) # build zydis third party library for disassembling x86 -# NOTE: Once under CMake 3.13's policy CMP0077, override with `set()` instead +# TODO - Once under CMake 3.13's policy CMP0077, override with `set()` instead option(ZYDIS_BUILD_TOOLS "Zydis: Build tools" OFF) option(ZYDIS_BUILD_EXAMPLES "Zydis: Build examples" OFF) + if(BUILD_SHARED_LIBS) option(ZYDIS_BUILD_SHARED_LIB "Zydis: Build shared library" ON) else() option(ZYDIS_BUILD_SHARED_LIB "Zydis: Build shared library" OFF) endif() + add_subdirectory(third-party/zydis EXCLUDE_FROM_ALL) # windows memory management lib if(WIN32) add_subdirectory(third-party/mman) endif() - +string(REPLACE " ${THIRDPARTY_IGNORED_WARNINGS} " "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") diff --git a/CMakePresets.json b/CMakePresets.json index 9dadfa309a..bb0365cf60 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -2,130 +2,100 @@ "version": 2, "configurePresets": [ { - "name": "linux-default", - "displayName": "Linux Debug", - "description": "Target the Windows Subsystem for Linux (WSL) or a remote Linux system.", + "name": "base", + "hidden": true, "generator": "Ninja", - "binaryDir": "${sourceDir}/out/build/${presetName}", - "cacheVariables": { - "CMAKE_BUILD_TYPE": "Debug", - "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}" + "architecture": { + "value": "x64", + "strategy": "external" }, - "vendor": { - "microsoft.com/VisualStudioSettings/CMake/1.0": { "hostOS": [ "Linux" ] }, - "microsoft.com/VisualStudioRemoteSettings/CMake/1.0": { "sourceDir": "$env{HOME}/.vs/$ms{projectDirName}" } + "cacheVariables": { + "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}", + "INSTALL_GTEST": "True", + "ASAN_BUILD": "OFF" + } + }, + { + "name": "base-release", + "hidden": true, + "inherits": "base", + "binaryDir": "${sourceDir}/out/build/Release", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Release" + } + }, + { + "name": "base-relwithdeb", + "hidden": true, + "inherits": "base", + "binaryDir": "${sourceDir}/out/build/Release", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "RelWithDebInfo" + } + }, + { + "name": "base-debug", + "hidden": true, + "inherits": "base", + "binaryDir": "${sourceDir}/out/build/Debug", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug" + } + }, + { + "name": "base-clang", + "hidden": true, + "cacheVariables": { + "CMAKE_C_COMPILER": "clang", + "CMAKE_CXX_COMPILER": "clang++" + } + }, + { + "name": "base-msvc", + "hidden": true, + "cacheVariables": { + "CMAKE_C_COMPILER": "cl", + "CMAKE_CXX_COMPILER": "cl" } }, { "name": "Debug-clang", - "displayName": "Windows Debug (clang-cl)", - "description": "Target Windows with the Visual Studio development environment.", - "generator": "Ninja", - "binaryDir": "${sourceDir}/out/build/Debug", - "architecture": { - "value": "x64", - "strategy": "external" - }, - "cacheVariables": { - "CMAKE_BUILD_TYPE": "Debug", - "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}", - "INSTALL_GTEST": "True", - "CMAKE_C_COMPILER": "clang-cl", - "CMAKE_CXX_COMPILER": "clang-cl" - }, - "vendor": { "microsoft.com/VisualStudioSettings/CMake/1.0": { "hostOS": [ "Windows" ] } } - }, - { - "name": "Release-clang", - "displayName": "Windows Release (clang-cl)", - "description": "Target Windows with the Visual Studio development environment.", - "generator": "Ninja", - "binaryDir": "${sourceDir}/out/build/Release", - "architecture": { - "value": "x64", - "strategy": "external" - }, - "cacheVariables": { - "CMAKE_BUILD_TYPE": "Release", - "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}", - "INSTALL_GTEST": "True", - "CMAKE_C_COMPILER": "clang-cl", - "CMAKE_CXX_COMPILER": "clang-cl" - }, - "vendor": { "microsoft.com/VisualStudioSettings/CMake/1.0": { "hostOS": [ "Windows" ] } } + "displayName": "Windows Debug (clang)", + "description": "Build with Clang with Debug Symbols", + "inherits": ["base-debug", "base-clang"] }, { "name": "RelWithDebInfo-clang", - "displayName": "Windows RelWithDebInfo (clang-cl)", - "description": "Target Windows with the Visual Studio development environment.", - "generator": "Ninja", - "binaryDir": "${sourceDir}/out/build/Release", - "architecture": { - "value": "x64", - "strategy": "external" - }, - "cacheVariables": { - "CMAKE_BUILD_TYPE": "RelWithDebInfo", - "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}", - "INSTALL_GTEST": "True", - "CMAKE_C_COMPILER": "clang-cl", - "CMAKE_CXX_COMPILER": "clang-cl" - }, - "vendor": { "microsoft.com/VisualStudioSettings/CMake/1.0": { "hostOS": [ "Windows" ] } } + "displayName": "Windows RelWithDebInfo (clang)", + "description": "Build with Clang as Release with Debug Symbols", + "inherits": ["base-relwithdeb", "base-clang"] + }, + { + "name": "Release-clang", + "displayName": "Windows Release (clang)", + "description": "Build with Clang as Release without Debug Symbols", + "inherits": ["base-release", "base-clang"] }, { "name": "Release-clang-static", - "displayName": "Windows Release - Static (clang-cl)", - "description": "Target Windows with the Visual Studio development environment.", - "generator": "Ninja", - "binaryDir": "${sourceDir}/out/build/Release", - "architecture": { - "value": "x64", - "strategy": "external" - }, + "displayName": "Windows Static Release (clang)", + "description": "Build with Clang as Release but statically linked", + "inherits": ["base-release", "base-clang"], "cacheVariables": { - "CMAKE_BUILD_TYPE": "Release", - "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}", - "INSTALL_GTEST": "True", - "CMAKE_C_COMPILER": "clang-cl", - "CMAKE_CXX_COMPILER": "clang-cl", - "BUILD_FOR_RELEASE": "true" - }, - "vendor": { "microsoft.com/VisualStudioSettings/CMake/1.0": { "hostOS": [ "Windows" ] } } + "STATICALLY_LINK": "true" + } }, { "name": "Debug-msvc", "displayName": "Windows Debug (msvc)", - "description": "Target Windows with the Visual Studio development environment.", - "generator": "Ninja", - "binaryDir": "${sourceDir}/out/build/Debug", - "architecture": { - "value": "x64", - "strategy": "external" - }, - "cacheVariables": { - "CMAKE_BUILD_TYPE": "Debug", - "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}", - "INSTALL_GTEST": "True" - }, - "vendor": { "microsoft.com/VisualStudioSettings/CMake/1.0": { "hostOS": [ "Windows" ] } } + "description": "Build with MSVC's CL with Debug Symbols", + "inherits": ["base-debug", "base-msvc"] }, { "name": "Release-msvc", "displayName": "Windows Release (msvc)", - "description": "Target Windows with the Visual Studio development environment.", - "generator": "Ninja", - "binaryDir": "${sourceDir}/out/build/Release", - "architecture": { - "value": "x64", - "strategy": "external" - }, - "cacheVariables": { - "CMAKE_BUILD_TYPE": "Release", - "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}", - "INSTALL_GTEST": "True" - }, - "vendor": { "microsoft.com/VisualStudioSettings/CMake/1.0": { "hostOS": [ "Windows" ] } } + "description": "Build with MSVC's CL as Release without Debug Symbols", + "inherits": ["base-release", "base-msvc"] } ] } diff --git a/README.md b/README.md index 2797811e63..1e71205022 100644 --- a/README.md +++ b/README.md @@ -167,8 +167,7 @@ On Windows, it's recommended to use a package manager, we use Scoop. Follow the Once Scoop is installed, run the following commands: ```sh -scoop install git llvm nasm python -scoop install task +scoop install git llvm nasm python task ``` ### Setting up and Opening the Project @@ -183,7 +182,7 @@ This will create a `jak-project` folder, open the project as a CMake project via ![](./docs/img/windows/open-project.png) -Then build the entire project as `Windows Release (clang-cl)`. You can also press Ctrl+Shift+B as a hotkey for Build All. We currently prefer `clang-cl` on Windows as opposed to `msvc`, though it should work as well! +Then build the entire project as `Windows Release (clang)`. You can also press Ctrl+Shift+B as a hotkey for Build All. We currently prefer `clang` on Windows as opposed to `msvc`, though it should work as well! ![](./docs/img/windows/release-build.png) ![](./docs/img/windows/build-all.png) diff --git a/bin/linux/buildcache b/bin/linux/buildcache deleted file mode 100755 index 1bb8bb3226..0000000000 Binary files a/bin/linux/buildcache and /dev/null differ diff --git a/bin/windows/buildcache.exe b/bin/windows/buildcache.exe deleted file mode 100644 index c03c2287b7..0000000000 Binary files a/bin/windows/buildcache.exe and /dev/null differ diff --git a/common/util/FileUtil.cpp b/common/util/FileUtil.cpp index bbf31a62ce..392eb65234 100644 --- a/common/util/FileUtil.cpp +++ b/common/util/FileUtil.cpp @@ -116,15 +116,15 @@ std::optional try_get_jak_project_path() { return {}; } - return std::string(my_path).substr( - 0, pos + 11); // + 12 to include "/jak-project" in the returned filepath + return std::make_optional(std::string(my_path).substr( + 0, pos + 11)); // + 12 to include "/jak-project" in the returned filepath } std::optional try_get_data_dir() { std::filesystem::path my_path = get_current_executable_path(); auto data_dir = my_path.parent_path() / "data"; if (std::filesystem::exists(data_dir) && std::filesystem::is_directory(data_dir)) { - return data_dir; + return std::make_optional(data_dir); } else { return {}; } diff --git a/decompiler/ObjectFile/LinkedWord.h b/decompiler/ObjectFile/LinkedWord.h index 7559362ff4..8e334b979d 100644 --- a/decompiler/ObjectFile/LinkedWord.h +++ b/decompiler/ObjectFile/LinkedWord.h @@ -1,5 +1,13 @@ #pragma once +#if defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#elif defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" +#endif + /*! * @file LinkedWord.h * A word (4 bytes), possibly with some linking info. @@ -152,3 +160,9 @@ class LinkedWord { }; } // namespace decompiler + +#if defined(__GNUC__) +#pragma GCC diagnostic pop +#elif defined(__clang__) +#pragma clang diagnostic pop +#endif diff --git a/docs/img/windows/release-build.png b/docs/img/windows/release-build.png index 608949b49e..2767bbd774 100644 Binary files a/docs/img/windows/release-build.png and b/docs/img/windows/release-build.png differ diff --git a/game/kernel/jak1/kmachine.cpp b/game/kernel/jak1/kmachine.cpp index f446a144a6..4770f1be3b 100644 --- a/game/kernel/jak1/kmachine.cpp +++ b/game/kernel/jak1/kmachine.cpp @@ -1,3 +1,11 @@ +#if defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#elif defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" +#endif + #include "kmachine.h" #include @@ -721,3 +729,9 @@ void InitMachineScheme() { } } // namespace jak1 + +#if defined(__GNUC__) +#pragma GCC diagnostic pop +#elif defined(__clang__) +#pragma clang diagnostic pop +#endif diff --git a/game/mips2c/functions/collide_cache.cpp b/game/mips2c/functions/collide_cache.cpp index b369167279..50956ebf28 100644 --- a/game/mips2c/functions/collide_cache.cpp +++ b/game/mips2c/functions/collide_cache.cpp @@ -1,3 +1,11 @@ +#if defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-but-set-variable" +#elif defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunused-but-set-variable" +#endif + //--------------------------MIPS2C--------------------- #include "common/dma/gs.h" @@ -3274,4 +3282,8 @@ void link() { } // namespace method_9_collide_puss_work } // namespace Mips2C - +#if defined(__GNUC__) +#pragma GCC diagnostic pop +#elif defined(__clang__) +#pragma clang diagnostic pop +#endif diff --git a/game/mips2c/functions/collide_edge_grab.cpp b/game/mips2c/functions/collide_edge_grab.cpp index 155e43450d..a52f46211d 100644 --- a/game/mips2c/functions/collide_edge_grab.cpp +++ b/game/mips2c/functions/collide_edge_grab.cpp @@ -1,3 +1,10 @@ +#if defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-but-set-variable" +#elif defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunused-but-set-variable" +#endif //--------------------------MIPS2C--------------------- #include "game/kernel/jak1/kscheme.h" @@ -1011,3 +1018,9 @@ void link() { } // namespace method_18_collide_edge_work } // namespace Mips2C + +#if defined(__GNUC__) +#pragma GCC diagnostic pop +#elif defined(__clang__) +#pragma clang diagnostic pop +#endif diff --git a/game/overlord/fake_iso.cpp b/game/overlord/fake_iso.cpp index 94ef862be0..d3883199c6 100644 --- a/game/overlord/fake_iso.cpp +++ b/game/overlord/fake_iso.cpp @@ -9,6 +9,14 @@ * should work. */ +#if defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#elif defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" +#endif + #include "fake_iso.h" #include @@ -369,3 +377,9 @@ void LoadMusicTweaks() { gMusicTweakInfo.TweakCount = 0; } } + +#if defined(__GNUC__) +#pragma GCC diagnostic pop +#elif defined(__clang__) +#pragma clang diagnostic pop +#endif diff --git a/third-party/fmt/CMakeLists.txt b/third-party/fmt/CMakeLists.txt index f7fe06dc17..72171dce87 100644 --- a/third-party/fmt/CMakeLists.txt +++ b/third-party/fmt/CMakeLists.txt @@ -1,8 +1,8 @@ -if (UNIX) +if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") set(CMAKE_CXX_FLAGS "-O3") -else () +elseif(MSVC) set(CMAKE_CXX_FLAGS "/EHsc") -endif (UNIX) +endif() include_directories(../) add_library(fmt format.cc) diff --git a/third-party/nasm/LICENSE b/third-party/nasm/LICENSE new file mode 100644 index 0000000000..331e2600ad --- /dev/null +++ b/third-party/nasm/LICENSE @@ -0,0 +1,29 @@ +NASM is now licensed under the 2-clause BSD license, also known as the +simplified BSD license. + + Copyright 1996-2010 the NASM Authors - All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following + conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/third-party/nasm/nasm.2.15.05.nupkg b/third-party/nasm/nasm.2.15.05.nupkg new file mode 100644 index 0000000000..6e81676ab7 Binary files /dev/null and b/third-party/nasm/nasm.2.15.05.nupkg differ diff --git a/third-party/stb_image/CMakeLists.txt b/third-party/stb_image/CMakeLists.txt index f390f23512..6284b27d3f 100644 --- a/third-party/stb_image/CMakeLists.txt +++ b/third-party/stb_image/CMakeLists.txt @@ -1,8 +1,8 @@ -if (UNIX) - set(CMAKE_CXX_FLAGS "-O3") -else () - set(CMAKE_CXX_FLAGS "/EHsc") -endif (UNIX) +if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + set(CMAKE_CXX_FLAGS "-O3") +elseif(MSVC) + set(CMAKE_CXX_FLAGS "/EHsc") +endif() add_library(stb_image stb_image.cpp) diff --git a/third-party/tiny_gltf/CMakeLists.txt b/third-party/tiny_gltf/CMakeLists.txt index 639bd564c1..a2b638cdc9 100644 --- a/third-party/tiny_gltf/CMakeLists.txt +++ b/third-party/tiny_gltf/CMakeLists.txt @@ -1,8 +1,8 @@ -if (UNIX) - set(CMAKE_CXX_FLAGS "-O3") -else () - set(CMAKE_CXX_FLAGS "/EHsc") -endif (UNIX) +if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + set(CMAKE_CXX_FLAGS "-O3") +elseif(MSVC) + set(CMAKE_CXX_FLAGS "/EHsc") +endif() include_directories(../ ../stb_image) add_library(tiny_gltf tiny_gltf.cpp)