From b2e0f2cf11246ba0963ebfcc13be55a8a9c39547 Mon Sep 17 00:00:00 2001 From: PancakeTAS Date: Sat, 5 Jul 2025 09:49:02 +0200 Subject: [PATCH] build mostly static and organize build files --- .gitignore | 1 + CMakeLists.txt | 19 +++------ README.md | 2 +- cmake/FetchDXVK.cmake | 74 +++++++++++++++++++++++++++++++++ cmake/FetchPeParse.cmake | 32 ++++++++++++++ lsfg-vk-gen/CMakeLists.txt | 85 ++------------------------------------ 6 files changed, 117 insertions(+), 96 deletions(-) create mode 100644 cmake/FetchDXVK.cmake create mode 100644 cmake/FetchPeParse.cmake diff --git a/.gitignore b/.gitignore index eb55056..43ab8ae 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ /build # ide/lsp files +/.zed /.vscode /.clangd /.cache diff --git a/CMakeLists.txt b/CMakeLists.txt index 533ff70..7d2d495 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,26 +1,24 @@ cmake_minimum_required(VERSION 3.29) # cmake options - set(CMAKE_CXX_COMPILER clang++) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_SKIP_BUILD_RPATH FALSE) -set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) -set(CMAKE_INSTALL_RPATH "$\{ORIGIN\}") - set(CMAKE_EXPORT_COMPILE_COMMANDS ON) -# main project +# subprojects +include(cmake/FetchDXVK.cmake) +include(cmake/FetchPeParse.cmake) +add_subdirectory(lsfg-vk-gen) + +# main project project(lsfg-vk VERSION 0.0.1 DESCRIPTION "lsfg-vk: LSFG on Linux through Vulkan" LANGUAGES CXX) -add_subdirectory(lsfg-vk-gen) - file(GLOB SOURCES "src/loader/*.cpp" "src/mini/*.cpp" @@ -54,9 +52,4 @@ target_compile_options(lsfg-vk PRIVATE -Wno-cast-function-type-strict ) -install(FILES "${CMAKE_BINARY_DIR}/peparse/src/peparse_git/pe-parser-library/build/libpe-parse.so" DESTINATION lib) -install(FILES "${CMAKE_BINARY_DIR}/dxvk/native/usr/lib/libdxvk_d3d11.so.0.20602" DESTINATION lib RENAME libdxvk_d3d11.so.0) -install(FILES "${CMAKE_BINARY_DIR}/dxvk/native/usr/lib/libdxvk_dxgi.so.0.20602" DESTINATION lib RENAME libdxvk_dxgi.so.0) -install(FILES "${CMAKE_BINARY_DIR}/dxvk/libdxbc.so" DESTINATION lib) install(FILES "${CMAKE_BINARY_DIR}/liblsfg-vk.so" DESTINATION lib) -install(FILES "${CMAKE_BINARY_DIR}/lsfg-vk-gen/liblsfg-vk-gen.so" DESTINATION lib) diff --git a/README.md b/README.md index b2d8e4a..7bd5540 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ By specifying an `LD_PRELOAD`, lsfg-vk can place itself inbetween your game and In order to compile LSFG, make sure you have the following components installed on your system: - Traditional build tools (+ bash, sed, git) - Clang compiler (this project does NOT compile easily with GCC) -- Vulkan and SPIR-V header files +- Vulkan header files - CMake build system - Meson build system (for DXVK) - Ninja build system (backend for CMake) diff --git a/cmake/FetchDXVK.cmake b/cmake/FetchDXVK.cmake new file mode 100644 index 0000000..d26938f --- /dev/null +++ b/cmake/FetchDXVK.cmake @@ -0,0 +1,74 @@ +include(ExternalProject) + +if(CMAKE_BUILD_TYPE STREQUAL "Release") + set(BUILD_TYPE "release") + set(STRIP_FLAG "--strip") +else() + set(BUILD_TYPE "debug") + set(STRIP_FLAG "") +endif() + +ExternalProject_Add(dxvk_git + GIT_REPOSITORY "https://github.com/doitsujin/dxvk" + GIT_TAG "v2.6.2" + UPDATE_DISCONNECTED true + USES_TERMINAL_CONFIGURE true + USES_TERMINAL_BUILD true + BUILD_IN_SOURCE true + CONFIGURE_COMMAND + sed -i s/private://g + src/dxvk/dxvk_shader.h && + CC=clang CXX=clang++ CFLAGS=-w CXXFLAGS=-w + meson setup + --buildtype ${BUILD_TYPE} + --prefix /build-native + ${STRIP_FLAG} + -Dbuild_id=false + --force-fallback-for=libdisplay-info + --wipe + build + BUILD_COMMAND + ninja -C build install && + mv build/src/dxvk/libdxvk.a build/src/dxvk/libldxvk.a && + cd build/src/dxgi/libdxvk_dxgi.so.0.20602.p && + ar rcs -o ../libdxgi.a + dxgi_adapter.cpp.o dxgi_enums.cpp.o dxgi_factory.cpp.o + dxgi_format.cpp.o dxgi_main.cpp.o dxgi_monitor.cpp.o + dxgi_options.cpp.o dxgi_output.cpp.o dxgi_surface.cpp.o + dxgi_swapchain.cpp.o && + cd ../../d3d11/libdxvk_d3d11.so.0.20602.p && + ar rcs -o ../libd3d11.a + d3d11_annotation.cpp.o d3d11_blend.cpp.o d3d11_buffer.cpp.o + d3d11_class_linkage.cpp.o d3d11_cmdlist.cpp.o d3d11_context.cpp.o + d3d11_context_def.cpp.o d3d11_context_ext.cpp.o d3d11_context_imm.cpp.o + d3d11_cuda.cpp.o d3d11_depth_stencil.cpp.o d3d11_device.cpp.o + d3d11_enums.cpp.o d3d11_features.cpp.o d3d11_fence.cpp.o + d3d11_gdi.cpp.o d3d11_initializer.cpp.o d3d11_input_layout.cpp.o + d3d11_interop.cpp.o d3d11_main.cpp.o d3d11_on_12.cpp.o + d3d11_options.cpp.o d3d11_query.cpp.o d3d11_rasterizer.cpp.o + d3d11_resource.cpp.o d3d11_sampler.cpp.o d3d11_shader.cpp.o + d3d11_state.cpp.o d3d11_state_object.cpp.o d3d11_swapchain.cpp.o + d3d11_texture.cpp.o d3d11_util.cpp.o d3d11_video.cpp.o + d3d11_view_dsv.cpp.o d3d11_view_rtv.cpp.o d3d11_view_srv.cpp.o + d3d11_view_uav.cpp.o + INSTALL_COMMAND "" +) + +ExternalProject_Get_Property(dxvk_git SOURCE_DIR) + +add_library(dxvk INTERFACE) +add_dependencies(dxvk dxvk_git) + +target_link_directories(dxvk + INTERFACE ${SOURCE_DIR}/build/src/dxvk + INTERFACE ${SOURCE_DIR}/build/src/dxbc + INTERFACE ${SOURCE_DIR}/build/src/dxgi + INTERFACE ${SOURCE_DIR}/build/src/d3d11 + INTERFACE ${SOURCE_DIR}/build/src/spirv + INTERFACE ${SOURCE_DIR}/build/src/util) +target_include_directories(dxvk SYSTEM + INTERFACE ${SOURCE_DIR}/build-native/include/dxvk + INTERFACE ${SOURCE_DIR}/src + INTERFACE ${SOURCE_DIR}/include/spirv/include) +target_link_libraries(dxvk INTERFACE + -Wl,--start-group dxgi d3d11 util ldxvk dxbc spirv -Wl,--end-group) diff --git a/cmake/FetchPeParse.cmake b/cmake/FetchPeParse.cmake new file mode 100644 index 0000000..df7879b --- /dev/null +++ b/cmake/FetchPeParse.cmake @@ -0,0 +1,32 @@ +include(ExternalProject) + +ExternalProject_Add(peparse_git + GIT_REPOSITORY "https://github.com/trailofbits/pe-parse" + GIT_TAG "v2.1.1" + UPDATE_DISCONNECTED true + USES_TERMINAL_CONFIGURE true + USES_TERMINAL_BUILD true + BUILD_IN_SOURCE true + CONFIGURE_COMMAND + cmake -S pe-parser-library -B build -G Ninja + -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} + -DCMAKE_C_COMPILER=clang + -DCMAKE_CXX_COMPILER=clang++ + -DCMAKE_C_FLAGS=-fPIC + -DCMAKE_CXX_FLAGS=-fPIC + BUILD_COMMAND + ninja -C build + INSTALL_COMMAND "" +) + +ExternalProject_Get_Property(peparse_git SOURCE_DIR) + +add_library(peparse INTERFACE) +add_dependencies(peparse peparse_git) + +target_link_directories(peparse + INTERFACE ${SOURCE_DIR}/build) +target_include_directories(peparse SYSTEM + INTERFACE ${SOURCE_DIR}/pe-parser-library/include) +target_link_libraries(peparse + INTERFACE pe-parse) diff --git a/lsfg-vk-gen/CMakeLists.txt b/lsfg-vk-gen/CMakeLists.txt index 21f5bb3..3c6faa1 100644 --- a/lsfg-vk-gen/CMakeLists.txt +++ b/lsfg-vk-gen/CMakeLists.txt @@ -1,83 +1,4 @@ -# dxvk subproject - -include(ExternalProject) - -ExternalProject_Add(dxvk_git - PREFIX ${CMAKE_BINARY_DIR}/dxvk - GIT_REPOSITORY "https://github.com/doitsujin/dxvk" - GIT_TAG "v2.6.2" - UPDATE_DISCONNECTED true - USES_TERMINAL_CONFIGURE true - USES_TERMINAL_BUILD true - CONFIGURE_COMMAND - cd ${CMAKE_BINARY_DIR}/dxvk/src/dxvk_git && - sed -i s/private://g - src/dxvk/dxvk_shader.h && - CFLAGS=-w CXXFLAGS=-w CC=clang CXX=clang++ meson setup - --buildtype "release" - --prefix "${CMAKE_BINARY_DIR}/dxvk/native/usr" - --strip - -Dbuild_id=false - --force-fallback-for=libdisplay-info - --wipe - ${CMAKE_BINARY_DIR}/dxvk/build - BUILD_COMMAND - cd ${CMAKE_BINARY_DIR}/dxvk && - ninja -C build install && # sorry cursed lol - echo "clang -shared -o libdxbc.so $(find build/src/{dxbc,dxvk,dxgi,spirv,util}/*.p -type f -name \\*.o)" > archive.sh && - bash archive.sh - INSTALL_COMMAND "" -) - -add_library(dxvk INTERFACE) -add_dependencies(dxvk dxvk_git) - -target_link_directories(dxvk - INTERFACE ${CMAKE_BINARY_DIR}/dxvk) -target_include_directories(dxvk SYSTEM - INTERFACE ${CMAKE_BINARY_DIR}/dxvk/native/usr/include/dxvk - INTERFACE ${CMAKE_BINARY_DIR}/dxvk/src/dxvk_git/src - INTERFACE ${CMAKE_BINARY_DIR}/dxvk/src/dxvk_git/include/spirv/include) -target_link_libraries(dxvk INTERFACE - dxbc) - -# pe-parse subproject - -ExternalProject_Add(peparse_git - PREFIX ${CMAKE_BINARY_DIR}/peparse - GIT_REPOSITORY "https://github.com/trailofbits/pe-parse" - GIT_TAG "v2.1.1" - UPDATE_DISCONNECTED true - USES_TERMINAL_CONFIGURE true - USES_TERMINAL_BUILD true - CONFIGURE_COMMAND - cd ${CMAKE_BINARY_DIR}/peparse/src/peparse_git/pe-parser-library && - CC=clang CXX=clang++ CXXFLAGS=-Wno-deprecated-declarations - cmake -B build -G Ninja - -DCMAKE_BUILD_TYPE=Release - -DBUILD_SHARED_LIBS=1 - BUILD_COMMAND - cd ${CMAKE_BINARY_DIR}/peparse/src/peparse_git/pe-parser-library && - ninja -C build - INSTALL_COMMAND "" -) - -add_library(peparse INTERFACE) -add_dependencies(peparse peparse_git) - -target_link_directories(peparse - INTERFACE ${CMAKE_BINARY_DIR}/peparse/src/peparse_git/pe-parser-library/build) -target_include_directories(peparse SYSTEM - INTERFACE ${CMAKE_BINARY_DIR}/peparse/src/peparse_git/pe-parser-library/include) -target_link_libraries(peparse - INTERFACE pe-parse) - -# main project - -project(lsfg-vk-gen - VERSION 0.0.1 - DESCRIPTION "lsfg-vk-gen: LSFG on Linux through Vulkan (backend)" - LANGUAGES CXX) +project(lsfg-vk-gen LANGUAGES CXX) file(GLOB BACKEND_SOURCES "src/core/*.cpp" @@ -86,7 +7,7 @@ file(GLOB BACKEND_SOURCES "src/*.cpp" ) -add_library(lsfg-vk-gen SHARED ${BACKEND_SOURCES}) +add_library(lsfg-vk-gen STATIC ${BACKEND_SOURCES}) target_include_directories(lsfg-vk-gen PRIVATE include @@ -96,7 +17,7 @@ target_link_libraries(lsfg-vk-gen set_target_properties(lsfg-vk-gen PROPERTIES CXX_CLANG_TIDY clang-tidy) target_compile_options(lsfg-vk-gen PRIVATE - -Weverything + -Weverything -fPIC # disable compat c++ flags -Wno-pre-c++20-compat-pedantic -Wno-pre-c++17-compat