diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..6d2bc17 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,143 @@ +# ------------------------------ +# cmake config / project +# ------------------------------ +include(FetchContent) +cmake_minimum_required(VERSION 3.25.0) + +set(CMAKE_CXX_STANDARD 20) +if(MSVC) + set(CMAKE_CXX_FLAGS "/EHsc /D_AMD64_ /DWIN32_LEAN_AND_MEAN") + set(CMAKE_CXX_FLAGS_RELEASE "/O2 /DNDEBUG") +else() + set(CMAKE_CXX_FLAGS "-D_AMD64_ -DWIN32_LEAN_AND_MEAN") + set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG") +endif() + +project(hex-unlocked LANGUAGES CXX) +set_property(GLOBAL PROPERTY USE_FOLDERS ON) + +# ------------------------------ +# options +# ------------------------------ +option(UNLOCKER_DUMPER "Build with dumper" OFF) + + +if (UNLOCKER_DUMPER) + if (NOT CMAKE_GENERATOR MATCHES "Visual Studio") + message(FATAL_ERROR "Dumper is only compatible with MSVC") + endif() + enable_language(CSharp) +endif() + +# ------------------------------ +# msvc stuff +# ------------------------------ +if(CMAKE_GENERATOR MATCHES "Visual Studio") + string(APPEND CMAKE_CXX_FLAGS " /EHsc /DWIN32_LEAN_AND_MEAN /utf-8 /Zc:char8_t") + if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64") + string(APPEND CMAKE_CXX_FLAGS " /D_AMD64_") + elseif(CMAKE_GENERATOR_PLATFORM STREQUAL "Win32") + string(APPEND CMAKE_CXX_FLAGS " /D_WIN32_") + else() + message(FATAL_ERROR "unhandled architecture") + endif() +endif() + +# --------------------- +# dependencies +# --------------------- +if (UNLOCKER_DUMPER) + FetchContent_Declare( + cue4parse + GIT_REPOSITORY https://github.com/FabianFG/CUE4Parse + GIT_TAG master + ) + FetchContent_MakeAvailable(cue4parse) + + # --------------------- + # CUE4Parse implementation bc importing just the .csproj has no compatibility with the native stuff + # --------------------- + + # native + set(CUE4PARSE_NATIVE_DIR "${cue4parse_SOURCE_DIR}/CUE4Parse-Natives") + add_subdirectory(${CUE4PARSE_NATIVE_DIR}) + + # net + set(CUE4PARSE_NET_DIR "${cue4parse_SOURCE_DIR}/CUE4Parse") + set(CUE4PARSE_OUTPUT_DIR "${CUE4PARSE_NET_DIR}/bin/$(Configuration)/net8.0") + + add_custom_target(CUE4Parse-Net + COMMAND dotnet build "${CUE4PARSE_NET_DIR}/CUE4Parse.csproj" + --configuration $(Configuration) + -p:BuildNatives=false + -p:SkipNativeBuild=true + -p:CMakeExitCode=0 + --output "${CUE4PARSE_OUTPUT_DIR}" + WORKING_DIRECTORY "${CUE4PARSE_NET_DIR}" + COMMENT "Building CUE4Parse" + ) +endif() + +set(SEALLIB_ASSERT ON CACHE BOOL "" FORCE) +set(SEALLIB_LOG ON CACHE BOOL "" FORCE) +set(SEALLIB_EVENTS ON CACHE BOOL "" FORCE) # required for tinymitm +FetchContent_Declare( + seallib + GIT_REPOSITORY https://git.neru.rip/neru/seallib + GIT_TAG main +) +FetchContent_MakeAvailable(seallib) + +FetchContent_Declare( + tinymitm + GIT_REPOSITORY https://git.neru.rip/neru/tinymitm + GIT_TAG main +) +FetchContent_MakeAvailable(tinymitm) + +FetchContent_Declare( + glaze + GIT_REPOSITORY https://github.com/stephenberry/glaze + GIT_TAG main +) +FetchContent_MakeAvailable(glaze) + +# --------------------- +# warnings +# --------------------- +add_library(hex-warned INTERFACE) +if(CMAKE_GENERATOR MATCHES "Visual Studio") + target_compile_options(hex-warned INTERFACE /W4 /WX) +else() + target_compile_options(hex-warned INTERFACE -Wall -Wextra -Werror) +endif() + +# ------------------------------ +# dumper +# ------------------------------ +if (UNLOCKER_DUMPER) + include_external_msproject(hex-dumped "${CMAKE_CURRENT_SOURCE_DIR}/src/dumper/hex-dumped.csproj") + set_target_properties(hex-dumped PROPERTIES VS_PROJECT_TYPE "9A19103F-16F7-4668-BE54-9A1E7A4F7556") + add_dependencies(hex-dumped CUE4Parse-Natives CUE4Parse-Net) +endif() + +# ------------------------------ +# unlocker +# ------------------------------ +file(GLOB_RECURSE UNLOCKER_SOURCES CONFIGURE_DEPENDS "src/unlocker/*.cpp" "src/unlocker/*.h") + +add_executable(hex-unlocked ${UNLOCKER_SOURCES}) +target_link_libraries(hex-unlocked PRIVATE dbd-unlocker-warnings seallib glaze::glaze tinymitm) + +# rnd exe name +string(RANDOM LENGTH 12 ALPHABET "abcdefghijklmnopqrstuvwxyz0123456789" RANDOM_EXE_NAME) +set_target_properties(hex-unlocked PROPERTIES OUTPUT_NAME "${RANDOM_EXE_NAME}") + +# compiler / IDE config +if(NOT MSVC) + target_link_options(hex-unlocked PRIVATE -static -static-libgcc -static-libstdc++) +else() + set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT hex-unlocked) +endif() + +source_group(TREE "${CMAKE_CURRENT_SOURCE_DIR}/src/unlocker" FILES ${UNLOCKER_SOURCES}) \ No newline at end of file