diff --git a/CMakeLists.txt b/CMakeLists.txt index 1db925a..bd5d5d6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,16 +1,17 @@ -cmake_minimum_required(VERSION 3.20) +cmake_minimum_required(VERSION 3.24) set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") project(Hell2Modding CXX C ASM ASM_MASM) -set(SRC_DIR "${PROJECT_SOURCE_DIR}/src") - -# Fetch modules set(CMAKE_POLICY_VERSION_MINIMUM 3.5) -message("\nFetching modules") + +set(SRC_DIR "${PROJECT_SOURCE_DIR}/src") + +# Fetch modules +message(STATUS "\nFetching modules") include(cmake_scripts/capstone.cmake) include(cmake_scripts/eastl.cmake) include(cmake_scripts/git.cmake) @@ -22,7 +23,6 @@ include(cmake_scripts/rom.cmake) include(cmake_scripts/safetyhook.cmake) include(cmake_scripts/tolk.cmake) -message(STATUS "Hell2Modding") file(GLOB_RECURSE SRC_MAIN "${SRC_DIR}/**.hpp" "${SRC_DIR}/**.h" @@ -34,79 +34,78 @@ file(GLOB_RECURSE SRC_MAIN "${SRC_DIR}/**.rc" ) -add_compile_options(/bigobj) -add_compile_options("$<$:/utf-8>") -add_compile_options("$<$:/utf-8>") - -if (FINAL) - add_compile_definitions(FINAL) +if(CMAKE_GENERATOR MATCHES "Visual Studio|Xcode") + set_property(GLOBAL PROPERTY USE_FOLDERS ON) + source_group( + TREE ${SRC_DIR} + PREFIX "src" + FILES ${SRC_MAIN} + ) endif() +message(STATUS "Hell2Modding") add_library(Hell2Modding MODULE "${SRC_MAIN}") -set_property(GLOBAL PROPERTY USE_FOLDERS ON) -set_property(TARGET Hell2Modding PROPERTY CXX_STANDARD 23) - -source_group(TREE ${SRC_DIR} PREFIX "src" FILES ${SRC_MAIN}) - -target_include_directories(Hell2Modding PRIVATE - "${SRC_DIR}" - "${eastl_SOURCE_DIR}/include" - "${tolk_SOURCE_DIR}/include" - "${lpeg_SOURCE_DIR}" - "${luasocket_SOURCE_DIR}/src" - "${raw_pdb_SOURCE_DIR}/src" - "${capstone_SOURCE_DIR}/include/" +target_compile_options(Hell2Modding + PUBLIC + $<$,$>:/bigobj;/utf-8> +) +target_compile_features(Hell2Modding PRIVATE cxx_std_23) +target_compile_definitions(Hell2Modding + PUBLIC + $<$:FINAL> + _CRT_SECURE_NO_WARNINGS + NOMINMAX + WIN32_LEAN_AND_MEAN ) - target_precompile_headers(Hell2Modding PRIVATE "${SRC_DIR}/common.hpp") - -target_link_libraries(Hell2Modding PRIVATE ReturnOfModdingBase dxgi dxguid Tolk lpeg_static luasocket_static wsock32 ws2_32 EASTL raw_pdb capstone-static safetyhook Zydis::Zydis ${LOVELY_LIB} userenv ntdll) - -set_property(TARGET Hell2Modding PROPERTY COMPILE_WARNING_AS_ERROR ON) - -add_compile_definitions(Hell2Modding - "_CRT_SECURE_NO_WARNINGS" - "NOMINMAX" - "WIN32_LEAN_AND_MEAN" +target_include_directories(Hell2Modding PRIVATE ${SRC_DIR}) +target_link_libraries(Hell2Modding + PRIVATE + ReturnOfModdingBase + dxgi + dxguid + Tolk + lpeg_static + luasocket_static + wsock32 + ws2_32 + EASTL + raw_pdb + capstone + safetyhook + Zydis::Zydis + ${LOVELY_LIB} + userenv + ntdll +) +set_target_properties(Hell2Modding + PROPERTIES + COMPILE_WARNING_AS_ERROR ON + OUTPUT_NAME "d3d12_" ) -if (MSVC) - if (FINAL) - # Aggresive inlining (Release) - string(REPLACE "Ob2" "Ob3" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}") - # Aggresive inlining (RelWithDebInfo) - string(REPLACE "Ob1" "Ob3" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") - # Enable intrinsics - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Oi") - # Favor fast code - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Ot") - # -ffast-math (fused multiply-add if the arch allows) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /fp:fast") - # Whole program optimization - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /GL") - # Function-level linking - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Gy") - # Disable Buffer Security Check - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /GS-") - # Package global data in COMDAT sections for optimization. - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Gw") - - # For all objects: - # - strip unused functions - # - fold identical functions - # - link-time code generation - string(REPLACE "INCREMENTAL" "INCREMENTAL:NO" CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO}") - string(REPLACE "INCREMENTAL" "INCREMENTAL:NO" CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO}") - string(REPLACE "INCREMENTAL" "INCREMENTAL:NO" CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO}") - set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO} /OPT:ICF,REF /LTCG") - set(CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO} /OPT:ICF,REF /LTCG") - set(CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO} /OPT:ICF,REF /LTCG") - - set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO} /PDBALTPATH:d3d12.pdb") - set(CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO} /PDBALTPATH:d3d12.pdb") - set(CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO} /PDBALTPATH:d3d12.pdb") - endif() +if(MSVC AND FINAL) + target_compile_options(Hell2Modding + PUBLIC + $<$:/Ob3> # Aggressive inlining (Release) + $<$:/Ob3> # Aggressive inlining (RelWithDebInfo) + /Oi # Enable intrinsics + /Ot # Favor fast code + /fp:fast # -ffast-math (fused multiply-add if the arch allows) + /GL # Whole program optimization + /Gy # Function-level linking + /GS- # Disable Buffer Security Check + /Gw # Package global data in COMDAT sections for optimization. + ) + + target_link_options(Hell2Modding + PUBLIC + $<$: + /INCREMENTAL:NO # Disable incremental linking for space + /OPT:ICF,REF # Strip unused functions and fold identical ones + /LTCG # Link-time code generation + /PDBALTPATH:d3d12.pdb # Provide alternate PDB path + > + ) endif() - -set_target_properties(Hell2Modding PROPERTIES OUTPUT_NAME "d3d12_") diff --git a/CMakePresets.json b/CMakePresets.json new file mode 100644 index 0000000..aa7020b --- /dev/null +++ b/CMakePresets.json @@ -0,0 +1,71 @@ +{ + "version": 5, + "cmakeMinimumRequired": { + "major": 3, + "minor": 24, + "patch": 0 + }, + "configurePresets": [ + { + "name": "gen-ninja", + "hidden": true, + "generator": "Ninja" + }, + { + "name": "build-type-deb", + "hidden": true, + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug" + } + }, + { + "name": "build-type-rel-with-deb", + "hidden": true, + "cacheVariables": { + "CMAKE_BUILD_TYPE": "RelWithDebInfo" + } + }, + { + "name": "arch_msvc_x64", + "hidden": true, + "architecture": { + "value": "x64", + "strategy": "external" + } + }, + { + "name": "common-structure", + "hidden": true, + "binaryDir": "${sourceDir}/out/build/${presetName}", + "installDir": "${sourceDir}/out/install/${presetName}" + }, + { + "name": "x64-Release-FastCompile", + "inherits": [ + "gen-ninja", + "build-type-rel-with-deb", + "arch_msvc_x64", + "common-structure" + ] + }, + { + "name": "x64-Release-FINAL", + "inherits": "x64-Release-FastCompile", + "cacheVariables": { + "FINAL": { + "type": "BOOL", + "value": "ON" + } + } + }, + { + "name": "x64-Debug", + "inherits": [ + "gen-ninja", + "build-type-deb", + "arch_msvc_x64", + "common-structure" + ] + } + ] +} \ No newline at end of file diff --git a/CMakeSettings.json b/CMakeSettings.json deleted file mode 100644 index fb88823..0000000 --- a/CMakeSettings.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "configurations": [ - { - "name": "x64-Release-FastCompile", - "generator": "Ninja", - "configurationType": "RelWithDebInfo", - "inheritEnvironments": [ "msvc_x64_x64" ], - "buildRoot": "${projectDir}\\out\\build\\${name}", - "installRoot": "${projectDir}\\out\\install\\${name}", - "cmakeCommandArgs": "", - "buildCommandArgs": "", - "ctestCommandArgs": "" - }, - { - "name": "x64-Release-FINAL", - "generator": "Ninja", - "configurationType": "RelWithDebInfo", - "inheritEnvironments": [ "msvc_x64_x64" ], - "buildRoot": "${projectDir}\\out\\build\\${name}", - "installRoot": "${projectDir}\\out\\install\\${name}", - "cmakeCommandArgs": "", - "buildCommandArgs": "", - "ctestCommandArgs": "", - "variables": [ - { - "name": "FINAL", - "value": "YES", - "type": "BOOL" - } - ] - }, - { - "name": "x64-Debug", - "generator": "Ninja", - "configurationType": "Debug", - "buildRoot": "${projectDir}\\out\\build\\${name}", - "installRoot": "${projectDir}\\out\\install\\${name}", - "cmakeCommandArgs": "", - "buildCommandArgs": "", - "ctestCommandArgs": "", - "inheritEnvironments": [ "msvc_x64_x64" ], - "variables": [] - } - ] -} diff --git a/cmake_scripts/capstone.cmake b/cmake_scripts/capstone.cmake index b0787a6..ab21e8e 100644 --- a/cmake_scripts/capstone.cmake +++ b/cmake_scripts/capstone.cmake @@ -3,11 +3,13 @@ include(FetchContent) FetchContent_Declare( capstone GIT_REPOSITORY https://github.com/aquynh/capstone.git - GIT_TAG 0f1674223452827493357dd7258145fe9f51cd05 + GIT_TAG 6.0.0-Alpha6 ) set(CAPSTONE_BUILD_SHARED OFF CACHE BOOL "Disable shared builds of capstone" FORCE) set(CAPSTONE_BUILD_TESTS OFF CACHE BOOL "Disable capstone tests" FORCE) -set(CAPSTONE_X86_ATT_DISABLE ON CACHE BOOL "Disble ATT syntax" FORCE) +set(CAPSTONE_X86_ATT_DISABLE ON CACHE BOOL "Disable ATT syntax" FORCE) +set(CAPSTONE_ARCHITECTURE_DEFAULT OFF CACHE BOOL "Disable all architecture by default" FORCE) +set(CAPSTONE_X86_SUPPORT ON CACHE BOOL "Enable x86 architecture" FORCE) + FetchContent_MakeAvailable(capstone) -set(CAPSTONE_INCLUDES ${capstone_SOURCE_DIR}/include/) \ No newline at end of file diff --git a/cmake_scripts/luasocket.cmake b/cmake_scripts/luasocket.cmake index dfa6d4c..3459884 100644 --- a/cmake_scripts/luasocket.cmake +++ b/cmake_scripts/luasocket.cmake @@ -26,25 +26,32 @@ set(FILES ${luasocket_SOURCE_DIR}/src/mime.c ) -set(CMAKE_SHARED_LIBRARY_PREFIX "") add_library(luasocket_static STATIC ${FILES}) -set_target_properties(luasocket_static PROPERTIES OUTPUT_NAME "luasocket") -if (WIN32) - add_definitions(-D_CRT_SECURE_NO_WARNINGS) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") -endif () +target_compile_definitions(luasocket_static PUBLIC $<$:_CRT_SECURE_NO_WARNINGS>) find_package(Lua) -if (LUA_FOUND) - target_link_libraries(luasocket_static PRIVATE ${LUA_LIBRARIES} wsock32 ws2_32) - target_include_directories(luasocket_static PRIVATE ${LUA_INCLUDE_DIR}) -else() - target_link_libraries(luasocket_static PRIVATE lua_static wsock32 ws2_32) -endif() - -set_target_properties(luasocket_static PROPERTIES OUTPUT_NAME luasocket) -set_target_properties(luasocket_static PROPERTIES PREFIX "") + +target_link_libraries(luasocket_static + PRIVATE + $,${LUA_LIBRARIES},lua_static> + wsock32 + ws2_32 +) + +target_include_directories(luasocket_static + PUBLIC + ${luasocket_SOURCE_DIR}/src + PRIVATE + $<$:${LUA_INCLUDE_DIR}> # FIXME: It'd be better if lua_static did populate its INTERFACE_INCLUDE_DIRECTORIES property instead +) + +set_target_properties(luasocket_static + PROPERTIES + OUTPUT_NAME luasocket + PREFIX "" +) + install( TARGETS luasocket_static RENAME luasocket