From 2942d9c38d106ab0795398a0d1a59eb7d285fb00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mika=C3=ABl=20Capelle?= Date: Wed, 3 Jul 2024 16:42:46 +0200 Subject: [PATCH 01/20] Tentative work for asmjit, currently fails. --- .gitmodules | 9 ------ CMakeLists.txt | 11 +++++++ asmjit | 1 - spdlog | 1 - src/shared/CMakeLists.txt | 18 +++++++++++ src/shared/formatters.h | 4 ++- src/thooklib/CMakeLists.txt | 10 ++++++ udis86 | 1 - vcpkg-configuration.json | 27 ++++++++++++++++ .../ports/asmjit/fb9f82c/asmjit.patch | 15 +++++++++ .../ports/asmjit/fb9f82c/portfile.cmake | 31 +++++++++++++++++++ .../ports/asmjit/fb9f82c/vcpkg.json | 17 ++++++++++ vcpkg-registry/versions/a-/asmjit.json | 8 +++++ vcpkg-registry/versions/baseline.json | 8 +++++ vcpkg-triplets/x64-windows.cmake | 11 +++++++ vcpkg-triplets/x86-windows.cmake | 11 +++++++ vcpkg.json | 30 ++++++++++++++++++ 17 files changed, 200 insertions(+), 13 deletions(-) delete mode 100644 .gitmodules create mode 100644 CMakeLists.txt delete mode 160000 asmjit delete mode 160000 spdlog create mode 100644 src/shared/CMakeLists.txt create mode 100644 src/thooklib/CMakeLists.txt delete mode 160000 udis86 create mode 100644 vcpkg-configuration.json create mode 100644 vcpkg-registry/ports/asmjit/fb9f82c/asmjit.patch create mode 100644 vcpkg-registry/ports/asmjit/fb9f82c/portfile.cmake create mode 100644 vcpkg-registry/ports/asmjit/fb9f82c/vcpkg.json create mode 100644 vcpkg-registry/versions/a-/asmjit.json create mode 100644 vcpkg-registry/versions/baseline.json create mode 100644 vcpkg-triplets/x64-windows.cmake create mode 100644 vcpkg-triplets/x86-windows.cmake create mode 100644 vcpkg.json diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 272512f..0000000 --- a/.gitmodules +++ /dev/null @@ -1,9 +0,0 @@ -[submodule "asmjit"] - path = asmjit - url = https://github.com/asmjit/asmjit.git -[submodule "udis86"] - path = udis86 - url = https://github.com/ModOrganizer2/udis86 -[submodule "spdlog"] - path = spdlog - url = https://github.com/gabime/spdlog.git diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..1d38f02 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,11 @@ +cmake_minimum_required(VERSION 3.16) + +project(usvfs) + +set(USE_FOLDERS TRUE) +set(CMAKE_CXX_STANDARD 20) + +add_subdirectory(src/shared) + +add_subdirectory(src/thooklib) +# add_subdirectory(src/tinjectlib) diff --git a/asmjit b/asmjit deleted file mode 160000 index fb9f82c..0000000 --- a/asmjit +++ /dev/null @@ -1 +0,0 @@ -Subproject commit fb9f82cb61df36aa513d054e748dc6769045f33e diff --git a/spdlog b/spdlog deleted file mode 160000 index 27cb4c7..0000000 --- a/spdlog +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 27cb4c76708608465c413f6d0e6b8d99a4d84302 diff --git a/src/shared/CMakeLists.txt b/src/shared/CMakeLists.txt new file mode 100644 index 0000000..877bfcb --- /dev/null +++ b/src/shared/CMakeLists.txt @@ -0,0 +1,18 @@ +cmake_minimum_required(VERSION 3.16) + +find_package(Boost CONFIG REQUIRED COMPONENTS algorithm interprocess) +find_package(spdlog CONFIG REQUIRED) + +file(GLOB sources "*.cpp" "*.h") +source_group("" FILES ${sources}) + +add_library(shared STATIC ${sources}) +target_link_libraries(shared PUBLIC Boost Boost::algorithm Boost::interprocess spdlog::spdlog) +target_include_directories(shared + PUBLIC ${PROJECT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}) +target_precompile_headers(shared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/pch.h) +target_compile_definitions(shared PUBLIC + SPDLOG_USE_STD_FORMAT SPDLOG_NO_NAME SPDLOG_NO_REGISTRY_MUTEX + BOOST_INTERPROCESS_SHARED_DIR_FUNC BOOST_CONFIG_SUPPRESS_OUTDATED_MESSAGE + NOMINMAX +) diff --git a/src/shared/formatters.h b/src/shared/formatters.h index ab963a7..829422f 100644 --- a/src/shared/formatters.h +++ b/src/shared/formatters.h @@ -75,7 +75,9 @@ struct std::formatter : std::formatter - requires (std::is_pointer_v + requires (std::is_pointer_v + && !std::is_same_v + && !std::is_same_v && !std::is_same_v && !std::is_same_v) struct std::formatter : std::formatter diff --git a/src/thooklib/CMakeLists.txt b/src/thooklib/CMakeLists.txt new file mode 100644 index 0000000..9e37aac --- /dev/null +++ b/src/thooklib/CMakeLists.txt @@ -0,0 +1,10 @@ +cmake_minimum_required(VERSION 3.16) + +find_package(asmjit CONFIG REQUIRED) + +file(GLOB sources "*.cpp" "*.h") +source_group("" FILES ${sources}) + +add_library(thooklib STATIC ${sources}) +target_link_libraries(thooklib PRIVATE shared asmjit::asmjit) +set_target_properties(thooklib PROPERTIES FOLDER injection) diff --git a/udis86 b/udis86 deleted file mode 160000 index df9323a..0000000 --- a/udis86 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit df9323a47f4c343302617239d42968f6ac61218a diff --git a/vcpkg-configuration.json b/vcpkg-configuration.json new file mode 100644 index 0000000..c081c7e --- /dev/null +++ b/vcpkg-configuration.json @@ -0,0 +1,27 @@ +{ + "default-registry": { + "kind": "git", + "repository": "https://github.com/Microsoft/vcpkg", + "baseline": "f61a294e765b257926ae9e9d85f96468a0af74e7" + }, + "registries": [ + { + "kind": "git", + "repository": "https://github.com/Microsoft/vcpkg", + "baseline": "f61a294e765b257926ae9e9d85f96468a0af74e7", + "packages": [ + "boost*", + "boost-*" + ] + }, + { + "kind": "filesystem", + "baseline": "asmjit-fb9f82c", + "path": "./vcpkg-registry", + "packages": [ ] + } + ], + "overlay-triplets": [ + "./vcpkg-triplets" + ] +} diff --git a/vcpkg-registry/ports/asmjit/fb9f82c/asmjit.patch b/vcpkg-registry/ports/asmjit/fb9f82c/asmjit.patch new file mode 100644 index 0000000..0b8579c --- /dev/null +++ b/vcpkg-registry/ports/asmjit/fb9f82c/asmjit.patch @@ -0,0 +1,15 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 37061c9..7b5f9d6 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -220,9 +220,7 @@ macro(asmjit_add_library _target _src _deps _cflags _cflags_dbg _cflags_rel) + $<$>:${_cflags_rel}>) + endif() + +- if(NOT ASMJIT_STATIC) +- install(TARGETS ${_target} DESTINATION "lib${LIB_SUFFIX}") +- endif() ++ install(TARGETS ${_target} DESTINATION "lib${LIB_SUFFIX}") + endmacro() + + # ============================================================================= diff --git a/vcpkg-registry/ports/asmjit/fb9f82c/portfile.cmake b/vcpkg-registry/ports/asmjit/fb9f82c/portfile.cmake new file mode 100644 index 0000000..d355c09 --- /dev/null +++ b/vcpkg-registry/ports/asmjit/fb9f82c/portfile.cmake @@ -0,0 +1,31 @@ +vcpkg_from_github( + OUT_SOURCE_PATH SOURCE_PATH + REPO asmjit/asmjit + REF fb9f82cb61df36aa513d054e748dc6769045f33e + SHA512 937a1ea1855d7eef53e6afc3401dd015e5de26d174dc667f8be4580a2d8388a703fff4298e4e2ca9ea490c5053197f33d3b010456985243931a1c0a6845926cc + HEAD_REF master + PATCHES + asmjit.patch +) + +set(VCPKG_LIBRARY_LINKAGE static) + +vcpkg_cmake_configure( + SOURCE_PATH "${SOURCE_PATH}" + OPTIONS + -DASMJIT_STATIC=TRUE +) + +vcpkg_cmake_install() +vcpkg_copy_pdbs() + +vcpkg_cmake_config_fixup(CONFIG_PATH lib/cmake/asmjit) + +file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/include") + +vcpkg_replace_string("${CURRENT_PACKAGES_DIR}/include/asmjit/core/api-config.h" + "#if !defined(ASMJIT_STATIC)" + "#if 0" +) + +vcpkg_install_copyright(FILE_LIST "${SOURCE_PATH}/LICENSE.md") diff --git a/vcpkg-registry/ports/asmjit/fb9f82c/vcpkg.json b/vcpkg-registry/ports/asmjit/fb9f82c/vcpkg.json new file mode 100644 index 0000000..7190016 --- /dev/null +++ b/vcpkg-registry/ports/asmjit/fb9f82c/vcpkg.json @@ -0,0 +1,17 @@ +{ + "name": "asmjit", + "version-string": "fb9f82c", + "description": "Complete x86/x64 JIT and Remote Assembler for C++", + "homepage": "https://github.com/asmjit/asmjit", + "supports": "!arm", + "dependencies": [ + { + "name": "vcpkg-cmake", + "host": true + }, + { + "name": "vcpkg-cmake-config", + "host": true + } + ] +} diff --git a/vcpkg-registry/versions/a-/asmjit.json b/vcpkg-registry/versions/a-/asmjit.json new file mode 100644 index 0000000..7dbaf92 --- /dev/null +++ b/vcpkg-registry/versions/a-/asmjit.json @@ -0,0 +1,8 @@ +{ + "versions": [ + { + "version-string": "fb9f82c", + "path": "$/ports/asmjit/fb9f82c" + } + ] +} diff --git a/vcpkg-registry/versions/baseline.json b/vcpkg-registry/versions/baseline.json new file mode 100644 index 0000000..f5cd36a --- /dev/null +++ b/vcpkg-registry/versions/baseline.json @@ -0,0 +1,8 @@ +{ + "asmjit-fb9f82c": { + "asmjit": { + "baseline": "fb9f82c", + "port-version": 0 + } + } +} diff --git a/vcpkg-triplets/x64-windows.cmake b/vcpkg-triplets/x64-windows.cmake new file mode 100644 index 0000000..ef26fdd --- /dev/null +++ b/vcpkg-triplets/x64-windows.cmake @@ -0,0 +1,11 @@ +set(VCPKG_TARGET_ARCHITECTURE x64) +set(VCPKG_CRT_LINKAGE dynamic) +set(VCPKG_LIBRARY_LINKAGE dynamic) + +if(PORT MATCHES "^boost-") + set(VCPKG_LIBRARY_LINKAGE static) +endif() + +if(PORT MATCHES "asmjit") + set(VCPKG_LIBRARY_LINKAGE static) +endif() diff --git a/vcpkg-triplets/x86-windows.cmake b/vcpkg-triplets/x86-windows.cmake new file mode 100644 index 0000000..c323339 --- /dev/null +++ b/vcpkg-triplets/x86-windows.cmake @@ -0,0 +1,11 @@ +set(VCPKG_TARGET_ARCHITECTURE x86) +set(VCPKG_CRT_LINKAGE dynamic) +set(VCPKG_LIBRARY_LINKAGE dynamic) + +if(PORT MATCHES "^boost-") + set(VCPKG_LIBRARY_LINKAGE static) +endif() + +if(PORT MATCHES "asmjit") + set(VCPKG_LIBRARY_LINKAGE static) +endif() diff --git a/vcpkg.json b/vcpkg.json new file mode 100644 index 0000000..6fa303c --- /dev/null +++ b/vcpkg.json @@ -0,0 +1,30 @@ +{ + "dependencies": [ + "asmjit", + { + "name": "spdlog", + "features": [ + "wchar" + ] + }, + "libudis86", + "boost-algorithm", + "boost-any", + "boost-dll", + "boost-filesystem", + "boost-format", + "boost-interprocess", + "boost-headers", + "boost-locale", + "boost-multi-index", + "boost-thread" + ], + "features": { + "tests": { + "description": "Build USVFS tests.", + "dependencies": [ + "gtest" + ] + } + } +} From 9bab84bcacdf10032fbeb22f1abb7cae34ec504b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mika=C3=ABl=20Capelle?= Date: Wed, 3 Jul 2024 17:16:27 +0200 Subject: [PATCH 02/20] Workaround for asmjit, work-in-progress. --- CMakeLists.txt | 5 +- src/shared/CMakeLists.txt | 3 +- src/thooklib/CMakeLists.txt | 1 + src/thooklib/asmjit_sane.h | 4 +- src/thooklib/hooklib.cpp | 2 +- src/tinjectlib/CMakeLists.txt | 11 + src/tinjectlib/asmjit_sane.h | 4 +- src/usvfs_helper/CMakeLists.txt | 9 + src/usvfs_helper/inject.cpp | 2 +- vcpkg-configuration.json | 2 +- .../ports/asmjit/fb9f82c/asmjit.patch | 905 +++++++++++++++++- .../ports/asmjit/fb9f82c/portfile.cmake | 8 +- vcpkg.json | 3 +- 13 files changed, 937 insertions(+), 22 deletions(-) create mode 100644 src/tinjectlib/CMakeLists.txt create mode 100644 src/usvfs_helper/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 1d38f02..3c9b06d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,10 +2,11 @@ cmake_minimum_required(VERSION 3.16) project(usvfs) -set(USE_FOLDERS TRUE) +set_property(GLOBAL PROPERTY USE_FOLDERS ON) set(CMAKE_CXX_STANDARD 20) add_subdirectory(src/shared) add_subdirectory(src/thooklib) -# add_subdirectory(src/tinjectlib) +add_subdirectory(src/tinjectlib) +add_subdirectory(src/usvfs_helper) diff --git a/src/shared/CMakeLists.txt b/src/shared/CMakeLists.txt index 877bfcb..9c00e68 100644 --- a/src/shared/CMakeLists.txt +++ b/src/shared/CMakeLists.txt @@ -11,8 +11,9 @@ target_link_libraries(shared PUBLIC Boost Boost::algorithm Boost::interprocess s target_include_directories(shared PUBLIC ${PROJECT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}) target_precompile_headers(shared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/pch.h) +target_compile_options(shared PUBLIC /FI"pch.h") target_compile_definitions(shared PUBLIC SPDLOG_USE_STD_FORMAT SPDLOG_NO_NAME SPDLOG_NO_REGISTRY_MUTEX BOOST_INTERPROCESS_SHARED_DIR_FUNC BOOST_CONFIG_SUPPRESS_OUTDATED_MESSAGE - NOMINMAX + NOMINMAX _WINDOWS _UNICODE UNICODE ) diff --git a/src/thooklib/CMakeLists.txt b/src/thooklib/CMakeLists.txt index 9e37aac..1baab9e 100644 --- a/src/thooklib/CMakeLists.txt +++ b/src/thooklib/CMakeLists.txt @@ -8,3 +8,4 @@ source_group("" FILES ${sources}) add_library(thooklib STATIC ${sources}) target_link_libraries(thooklib PRIVATE shared asmjit::asmjit) set_target_properties(thooklib PROPERTIES FOLDER injection) +target_precompile_headers(shared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../shared/pch.h) diff --git a/src/thooklib/asmjit_sane.h b/src/thooklib/asmjit_sane.h index ec0c438..23f637d 100644 --- a/src/thooklib/asmjit_sane.h +++ b/src/thooklib/asmjit_sane.h @@ -24,6 +24,6 @@ along with usvfs. If not, see . #pragma warning(disable : 4201) #pragma warning(disable : 4244) #pragma warning(disable : 4245) -#include -#include +#include +#include #pragma warning (pop) diff --git a/src/thooklib/hooklib.cpp b/src/thooklib/hooklib.cpp index 0b66493..10b2b61 100644 --- a/src/thooklib/hooklib.cpp +++ b/src/thooklib/hooklib.cpp @@ -23,7 +23,7 @@ along with usvfs. If not, see . #include #include "udis86wrapper.h" #pragma warning (push, 3) -#include "asmjit.h" +#include #pragma warning (pop) #include "hooklib.h" #include "utility.h" diff --git a/src/tinjectlib/CMakeLists.txt b/src/tinjectlib/CMakeLists.txt new file mode 100644 index 0000000..936f832 --- /dev/null +++ b/src/tinjectlib/CMakeLists.txt @@ -0,0 +1,11 @@ +cmake_minimum_required(VERSION 3.16) + +find_package(asmjit CONFIG REQUIRED) + +file(GLOB sources "*.cpp" "*.h") +source_group("" FILES ${sources}) + +add_library(tinjectlib STATIC ${sources}) +target_link_libraries(tinjectlib PRIVATE shared asmjit::asmjit) +target_include_directories(tinjectlib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +set_target_properties(tinjectlib PROPERTIES FOLDER injection) diff --git a/src/tinjectlib/asmjit_sane.h b/src/tinjectlib/asmjit_sane.h index 56be2b1..10d0521 100644 --- a/src/tinjectlib/asmjit_sane.h +++ b/src/tinjectlib/asmjit_sane.h @@ -27,6 +27,6 @@ along with usvfs. If not, see . //#ifndef ASMJIT_API //#define ASMJIT_API //#endif // ASMJIT_API -#include -#include +#include +#include #pragma warning (pop) diff --git a/src/usvfs_helper/CMakeLists.txt b/src/usvfs_helper/CMakeLists.txt new file mode 100644 index 0000000..30df5a8 --- /dev/null +++ b/src/usvfs_helper/CMakeLists.txt @@ -0,0 +1,9 @@ +cmake_minimum_required(VERSION 3.16) + +file(GLOB sources "*.cpp" "*.h") +source_group("" FILES ${sources}) + +add_library(usvfs_helper STATIC ${sources}) +target_link_libraries(usvfs_helper PRIVATE shared tinjectlib) +set_target_properties(usvfs_helper PROPERTIES FOLDER injection) +# target_precompile_headers(shared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../shared/pch.h) diff --git a/src/usvfs_helper/inject.cpp b/src/usvfs_helper/inject.cpp index 264bbce..fd6f414 100644 --- a/src/usvfs_helper/inject.cpp +++ b/src/usvfs_helper/inject.cpp @@ -26,7 +26,7 @@ along with usvfs. If not, see . #include #include -#include +#include "inject.h" #include #include #include diff --git a/vcpkg-configuration.json b/vcpkg-configuration.json index c081c7e..50bc428 100644 --- a/vcpkg-configuration.json +++ b/vcpkg-configuration.json @@ -18,7 +18,7 @@ "kind": "filesystem", "baseline": "asmjit-fb9f82c", "path": "./vcpkg-registry", - "packages": [ ] + "packages": [ "asmjit" ] } ], "overlay-triplets": [ diff --git a/vcpkg-registry/ports/asmjit/fb9f82c/asmjit.patch b/vcpkg-registry/ports/asmjit/fb9f82c/asmjit.patch index 0b8579c..35f90ca 100644 --- a/vcpkg-registry/ports/asmjit/fb9f82c/asmjit.patch +++ b/vcpkg-registry/ports/asmjit/fb9f82c/asmjit.patch @@ -1,15 +1,906 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt -index 37061c9..7b5f9d6 100644 +index 37061c9..a211ae1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt -@@ -220,9 +220,7 @@ macro(asmjit_add_library _target _src _deps _cflags _cflags_dbg _cflags_rel) - $<$>:${_cflags_rel}>) +@@ -1,363 +1,618 @@ +-cmake_minimum_required(VERSION 3.1) +-include(CheckCXXCompilerFlag) +- +-# ============================================================================= +-# [AsmJit - Configuration] +-# ============================================================================= ++cmake_minimum_required(VERSION 3.8 FATAL_ERROR) + +-# Embedding mode, asmjit will not create any targets (default FALSE). +-# set(ASMJIT_EMBED FALSE) ++cmake_policy(PUSH) + +-# Whether to build a static library (default FALSE). +-# set(ASMJIT_STATIC FALSE) ++if (POLICY CMP0063) ++ cmake_policy(SET CMP0063 NEW) # Honor visibility properties. ++endif() + +-# Used for debugging asmjit itself (default FALSE). +-# set(ASMJIT_TRACE FALSE) ++if (POLICY CMP0092) ++ cmake_policy(SET CMP0092 NEW) # Don't add -W3 warning level by default. ++endif() + +-# Whether to build ARM32 backend (TRUE if building for ARM32). +-# set(ASMJIT_BUILD_ARM32 FALSE) ++# Don't create a project if it was already created by another CMakeLists.txt. ++# This allows one library to embed another library without making a collision. ++if (NOT CMAKE_PROJECT_NAME OR "${CMAKE_PROJECT_NAME}" STREQUAL "asmjit") ++ project(asmjit CXX) ++endif() + +-# Whether to build ARM64 backend (TRUE if building for ARM64). +-# set(ASMJIT_BUILD_ARM64 FALSE) ++include(CheckCXXCompilerFlag) ++INCLUDE(CheckCXXSourceCompiles) ++include(GNUInstallDirs) + +-# Whether to build X86 backend (TRUE if building for X86). +-# set(ASMJIT_BUILD_X86 FALSE) ++# AsmJit - Deprecated ++# =================== + +-# Whether to build X64 backend (TRUE if building for X64). +-# set(ASMJIT_BUILD_X64 FALSE) ++if (DEFINED ASMJIT_BUILD_EMBED) ++ message(DEPRECATION "ASMJIT_BUILD_EMBED is deprecated, use ASMJIT_EMBED") ++ set(ASMJIT_EMBED "${ASMJIT_BUILD_EMBED}") ++endif() + +-# Whether to build tests and samples (default FALSE). +-# set(ASMJIT_BUILD_TEST FALSE) ++if (DEFINED ASMJIT_BUILD_STATIC) ++ message(DEPRECATION "ASMJIT_BUILD_STATIC is deprecated, use ASMJIT_STATIC") ++ set(ASMJIT_STATIC "${ASMJIT_BUILD_STATIC}") ++endif() + +-# ============================================================================= +-# [AsmJit - Build / Embed] +-# ============================================================================= ++# AsmJit - Configuration - Build ++# ============================== + +-# Do not create a project if this CMakeLists.txt is included from another +-# project. This makes it easy to embed or create a static library. +-if(NOT CMAKE_PROJECT_NAME OR "${CMAKE_PROJECT_NAME}" MATCHES "^asmjit$") +- project(asmjit C CXX) +- set(ASMJIT_SIGNATURE "Standalone") +-else() +- set(ASMJIT_SIGNATURE "Included") ++if (NOT DEFINED ASMJIT_TEST) ++ set(ASMJIT_TEST FALSE) + endif() + +-if(ASMJIT_EMBED) +- set(ASMJIT_SIGNATURE "${ASMJIT_SIGNATURE} | Mode=Embed") +- set(ASMJIT_STATIC TRUE) # Implies ASMJIT_STATIC. +-elseif(ASMJIT_STATIC) +- set(ASMJIT_SIGNATURE "${ASMJIT_SIGNATURE} | Mode=Static") +-else() +- set(ASMJIT_SIGNATURE "${ASMJIT_SIGNATURE} | Mode=Shared") ++if (NOT DEFINED ASMJIT_EMBED) ++ set(ASMJIT_EMBED FALSE) + endif() + +-if(ASMJIT_BUILD_TEST) +- set(ASMJIT_SIGNATURE "${ASMJIT_SIGNATURE} | Test=On") +-else() +- set(ASMJIT_SIGNATURE "${ASMJIT_SIGNATURE} | Test=Off") ++if (NOT DEFINED ASMJIT_STATIC) ++ set(ASMJIT_STATIC ${ASMJIT_EMBED}) + endif() + +-if(NOT ASMJIT_DIR) +- set(ASMJIT_DIR ${CMAKE_CURRENT_LIST_DIR}) ++if (NOT DEFINED ASMJIT_SANITIZE) ++ set(ASMJIT_SANITIZE FALSE) + endif() + +-message("-- [asmjit] ${ASMJIT_SIGNATURE}") +-message("-- [asmjit] ASMJIT_DIR=${ASMJIT_DIR}") +- +-# ============================================================================= +-# [NP-Utilities] +-# ============================================================================= +- +-function(np_detect_options out) +- set(out_array) +- foreach(flag ${ARGN}) +- check_cxx_compiler_flag("${flag}" ok) +- if(ok) +- list(APPEND out_array "${flag}") +- endif() +- unset(ok) +- endforeach() +- set(${out} "${out_array}" PARENT_SCOPE) +-endfunction() +- +-# ============================================================================= +-# [AsmJit - Flags / Deps] +-# ============================================================================= +- +-set(ASMJIT_SOURCE_DIR "${ASMJIT_DIR}/src") # Asmjit source directory. +-set(ASMJIT_INCLUDE_DIR "${ASMJIT_SOURCE_DIR}") # Asmjit include directory. +- +-set(ASMJIT_CFLAGS) # Asmjit CFLAGS / CXXFLAGS. +-set(ASMJIT_DEPS) # Asmjit dependencies (list of libraries) for the linker. +-set(ASMJIT_LIBS) # Asmjit dependencies with asmjit included, for consumers. +- +-# Internal, never use. +-set(ASMJIT_D "-D") # Used to define a C/C++ preprocessor parameter (-D or /D). +-set(ASMJIT_PRIVATE_CFLAGS) # Compiler flags independent of build type. +-set(ASMJIT_PRIVATE_LFLAGS "") # Linker flags used by the library and tests. +- +-set(ASMJIT_PRIVATE_CFLAGS_DBG) # Compiler flags used only by debug build. +-set(ASMJIT_PRIVATE_CFLAGS_REL) # Compiler flags used only by release build. ++if (NOT DEFINED ASMJIT_NO_CUSTOM_FLAGS) ++ set(ASMJIT_NO_CUSTOM_FLAGS FALSE) ++endif() + +-if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") +- set(ASMJIT_D "/D") +- set(ASMJIT_PRIVATE_LFLAGS "/OPT:REF /OPT:ICF") ++if (NOT DEFINED ASMJIT_NO_NATVIS) ++ set(ASMJIT_NO_NATVIS FALSE) ++endif() + +- list(APPEND ASMJIT_PRIVATE_CFLAGS /GF) +- list(APPEND ASMJIT_PRIVATE_CFLAGS_DBG /GS /GR-) +- list(APPEND ASMJIT_PRIVATE_CFLAGS_REL /Oi /Oy /GS- /GR-) +- if(NOT MSVC60 AND NOT MSVC70 AND NOT MSVC71) +- list(APPEND ASMJIT_PRIVATE_CFLAGS /MP) # Enable multi-process compilation. +- endif() ++# EMBED implies STATIC. ++if (ASMJIT_EMBED AND NOT ASMJIT_STATIC) ++ set(ASMJIT_STATIC TRUE) + endif() + +-if("${CMAKE_CXX_COMPILER_ID}" MATCHES "^(GNU|Clang)$") +- # Keep only the first option detected. +- np_detect_options(ASMJIT_CC_OPTIONS +- "-std=c++14" +- "-std=c++11" +- "-std=c++0x") +- if(ASMJIT_CC_OPTIONS) +- list(GET ASMJIT_CC_OPTIONS 0 ASMJIT_CC_OPTIONS) +- list(APPEND ASMJIT_PRIVATE_CFLAGS ${ASMJIT_CC_OPTIONS}) +- endif() ++# AsmJit - Configuration - Backend ++# ================================ + +- np_detect_options(ASMJIT_CC_OPTIONS +- "-fno-exceptions" +- "-fno-tree-vectorize" +- "-fvisibility=hidden") ++if (NOT DEFINED ASMJIT_NO_X86) ++ set(ASMJIT_NO_X86 FALSE) ++endif() + +- list(APPEND ASMJIT_PRIVATE_CFLAGS ${ASMJIT_CC_OPTIONS}) +- list(APPEND ASMJIT_PRIVATE_CFLAGS_REL -fmerge-all-constants) ++if (NOT DEFINED ASMJIT_NO_AARCH64) ++ set(ASMJIT_NO_AARCH64 FALSE) ++endif() + +- unset(ASMJIT_CC_OPTIONS) ++if (NOT DEFINED ASMJIT_NO_FOREIGN) ++ set(ASMJIT_NO_FOREIGN FALSE) + endif() + +-if(ASMJIT_EMBED) +- list(APPEND ASMJIT_PRIVATE_CFLAGS "${ASMJIT_D}ASMJIT_EMBED") +-elseif(ASMJIT_STATIC) +- list(APPEND ASMJIT_PRIVATE_CFLAGS "${ASMJIT_D}ASMJIT_STATIC") ++# AsmJit - Configuration - Features ++# ================================= ++ ++if (NOT DEFINED ASMJIT_NO_DEPRECATED) ++ set(ASMJIT_NO_DEPRECATED FALSE) + endif() + +-if(ASMJIT_TRACE) +- list(APPEND ASMJIT_PRIVATE_CFLAGS "${ASMJIT_D}ASMJIT_TRACE") ++if (NOT DEFINED ASMJIT_NO_SHM_OPEN) ++ set(ASMJIT_NO_SHM_OPEN FALSE) + endif() + +-if(WIN32) +- list(APPEND ASMJIT_PRIVATE_CFLAGS "${ASMJIT_D}_UNICODE") +-else() +- list(APPEND ASMJIT_DEPS pthread) ++if (NOT DEFINED ASMJIT_NO_JIT) ++ set(ASMJIT_NO_JIT FALSE) + endif() + +-if("${CMAKE_SYSTEM_NAME}" MATCHES "Linux") +- list(APPEND ASMJIT_DEPS rt) ++if (NOT DEFINED ASMJIT_NO_TEXT) ++ set(ASMJIT_NO_TEXT FALSE) + endif() + +-set(ASMJIT_LIBS ${ASMJIT_DEPS}) +-if(NOT ASMJIT_EMBED) +- list(INSERT ASMJIT_LIBS 0 asmjit) ++if (NOT DEFINED ASMJIT_NO_LOGGING) ++ set(ASMJIT_NO_LOGGING ${ASMJIT_NO_TEXT}) + endif() + +-if(ASMJIT_BUILD_ARM32) +- List(APPEND ASMJIT_CFLAGS "${ASMJIT_D}ASMJIT_BUILD_ARM32") ++if (NOT DEFINED ASMJIT_NO_VALIDATION) ++ set(ASMJIT_NO_VALIDATION FALSE) + endif() + +-if(ASMJIT_BUILD_ARM64) +- List(APPEND ASMJIT_CFLAGS "${ASMJIT_D}ASMJIT_BUILD_ARM64") ++if (NOT DEFINED ASMJIT_NO_INTROSPECTION) ++ set(ASMJIT_NO_INTROSPECTION FALSE) + endif() + +-if(ASMJIT_BUILD_X86) +- List(APPEND ASMJIT_CFLAGS "${ASMJIT_D}ASMJIT_BUILD_X86") ++if (NOT DEFINED ASMJIT_NO_BUILDER) ++ set(ASMJIT_NO_BUILDER FALSE) + endif() + +-if(ASMJIT_BUILD_X64) +- List(APPEND ASMJIT_CFLAGS "${ASMJIT_D}ASMJIT_BUILD_X64") ++if (NOT DEFINED ASMJIT_NO_COMPILER) ++ if (ASMJIT_NO_BUILDER OR ASMJIT_NO_INTROSPECTION) ++ set(ASMJIT_NO_COMPILER TRUE) ++ else() ++ set(ASMJIT_NO_COMPILER FALSE) ++ endif() + endif() + +-set(ASMJIT_PRIVATE_CFLAGS_DBG ${ASMJIT_CFLAGS} ${ASMJIT_PRIVATE_CFLAGS} ${ASMJIT_PRIVATE_CFLAGS_DBG}) +-set(ASMJIT_PRIVATE_CFLAGS_REL ${ASMJIT_CFLAGS} ${ASMJIT_PRIVATE_CFLAGS} ${ASMJIT_PRIVATE_CFLAGS_REL}) ++# AsmJit - Configuration - CMake Introspection ++# ============================================ ++ ++set(ASMJIT_DIR "${CMAKE_CURRENT_LIST_DIR}" CACHE PATH "Location of 'asmjit'") ++set(ASMJIT_TEST "${ASMJIT_TEST}" CACHE BOOL "Build 'asmjit' test applications") ++set(ASMJIT_EMBED "${ASMJIT_EMBED}" CACHE BOOL "Embed 'asmjit' library (no targets)") ++set(ASMJIT_STATIC "${ASMJIT_STATIC}" CACHE BOOL "Build 'asmjit' library as static") ++set(ASMJIT_SANITIZE "${ASMJIT_SANITIZE}" CACHE STRING "Build with sanitizers: 'address', 'undefined', etc...") ++set(ASMJIT_NO_NATVIS "${ASMJIT_NO_NATVIS}" CACHE BOOL "Disable natvis support (embedding asmjit.natvis in PDB)") ++set(ASMJIT_NO_CUSTOM_FLAGS "${ASMJIT_NO_CUSTOM_FLAGS}" CACHE BOOL "Disable extra compilation flags added by AsmJit to its targets") ++ ++set(ASMJIT_NO_X86 "${ASMJIT_NO_X86}" CACHE BOOL "Disable X86/X64 backend") ++set(ASMJIT_NO_AARCH64 "${ASMJIT_NO_AARCH64}" CACHE BOOL "Disable AArch64 backend") ++set(ASMJIT_NO_FOREIGN "${ASMJIT_NO_FOREIGN}" CACHE BOOL "Disable all foreign architectures (enables only a target architecture)") ++ ++set(ASMJIT_NO_DEPRECATED "${ASMJIT_NO_DEPRECATED}" CACHE BOOL "Disable deprecated API at build time") ++set(ASMJIT_NO_SHM_OPEN "${ASMJIT_NO_SHM_OPEN}" CACHE BOOL "Disable the use of shm_open() even on platforms where it's supported") ++set(ASMJIT_NO_JIT "${ASMJIT_NO_JIT}" CACHE BOOL "Disable VirtMem, JitAllocator, and JitRuntime at build time") ++set(ASMJIT_NO_TEXT "${ASMJIT_NO_TEXT}" CACHE BOOL "Disable textual representation of instructions, enums, cpu features, ...") ++set(ASMJIT_NO_LOGGING "${ASMJIT_NO_LOGGING}" CACHE BOOL "Disable logging features at build time") ++set(ASMJIT_NO_VALIDATION "${ASMJIT_NO_VALIDATION}" CACHE BOOL "Disable instruction validation API at build time") ++set(ASMJIT_NO_INTROSPECTION "${ASMJIT_NO_INTROSPECTION}" CACHE BOOL "Disable instruction introspection API at build time") ++set(ASMJIT_NO_BUILDER "${ASMJIT_NO_BUILDER}" CACHE BOOL "Disable Builder emitter at build time") ++set(ASMJIT_NO_COMPILER "${ASMJIT_NO_COMPILER}" CACHE BOOL "Disable Compiler emitter at build time") ++ ++# AsmJit - Project ++# ================ ++ ++set(ASMJIT_INCLUDE_DIRS "${ASMJIT_DIR}/src") # Include directory is the same as source dir. ++set(ASMJIT_DEPS "") # AsmJit dependencies (libraries) for the linker. ++set(ASMJIT_LIBS "") # Dependencies of libs/apps that want to use AsmJit. ++set(ASMJIT_CFLAGS "") # Public compiler flags. ++set(ASMJIT_PRIVATE_CFLAGS "") # Private compiler flags independent of build type. ++set(ASMJIT_PRIVATE_CFLAGS_DBG "") # Private compiler flags used by debug builds. ++set(ASMJIT_PRIVATE_CFLAGS_REL "") # Private compiler flags used by release builds. ++set(ASMJIT_SANITIZE_CFLAGS "") # Compiler flags required by currently enabled sanitizers. ++set(ASMJIT_SANITIZE_LFLAGS "") # Linker flags required by currently enabled sanitizers. ++ ++# AsmJit - Utilities ++# ================== ++ ++function(asmjit_detect_cflags out) ++ set(out_array ${${out}}) ++ foreach(flag ${ARGN}) ++ string(REGEX REPLACE "[+]" "x" flag_signature "${flag}") ++ string(REGEX REPLACE "[-=:;/.\]" "_" flag_signature "${flag_signature}") ++ check_cxx_compiler_flag(${flag} "__CxxFlag_${flag_signature}") ++ if (${__CxxFlag_${flag_signature}}) ++ list(APPEND out_array "${flag}") ++ endif() ++ endforeach() ++ set(${out} "${out_array}" PARENT_SCOPE) ++endfunction() + +-message("-- [asmjit] ASMJIT_DEPS=${ASMJIT_DEPS}") +-message("-- [asmjit] ASMJIT_LIBS=${ASMJIT_LIBS}") +-message("-- [asmjit] ASMJIT_CFLAGS=${ASMJIT_CFLAGS}") ++# Support for various sanitizers provided by C/C++ compilers. ++function(asmjit_detect_sanitizers out) ++ set(_out_array ${${out}}) ++ set(_flags "") + +-# ============================================================================= +-# [AsmJit - Macros] +-# ============================================================================= ++ foreach(_arg ${ARGN}) ++ string(REPLACE "," ";" _arg "${_arg}") ++ list(APPEND _flags ${_arg}) ++ endforeach() + +-macro(asmjit_add_source _out_dst _src_dir) +- set(_src_path "${ASMJIT_SOURCE_DIR}/${_src_dir}") +- set(_src_list) ++ foreach(_flag ${_flags}) ++ if (NOT "${_flag}" MATCHES "^-fsanitize=") ++ SET(_flag "-fsanitize=${_flag}") ++ endif() + +- foreach(_arg ${ARGN}) +- set(_src_file "${_src_path}/${_arg}") +- list(APPEND _src_list ${_src_file}) ++ # Sanitizers also require link flags, see CMAKE_REQUIRED_FLAGS. ++ set(CMAKE_REQUIRED_FLAGS "${_flag}") ++ asmjit_detect_cflags(_out_array ${_flag}) ++ unset(CMAKE_REQUIRED_FLAGS) + endforeach() + +- list(APPEND "${_out_dst}" ${_src_list}) +- source_group(${_src_dir} FILES ${_src_list}) +-endmacro() ++ set(${out} "${_out_array}" PARENT_SCOPE) ++endfunction() + +-macro(asmjit_add_library _target _src _deps _cflags _cflags_dbg _cflags_rel) +- if(NOT ASMJIT_STATIC) +- add_library(${_target} SHARED ${_src}) ++function(asmjit_add_target target target_type) ++ set(single_val "") ++ set(multi_val SOURCES LIBRARIES CFLAGS CFLAGS_DBG CFLAGS_REL) ++ cmake_parse_arguments("X" "" "${single_val}" "${multi_val}" ${ARGN}) ++ ++ if ("${target_type}" MATCHES "^(EXECUTABLE|TEST)$") ++ add_executable(${target} ${X_SOURCES}) + else() +- add_library(${_target} STATIC ${_src}) ++ add_library(${target} ${target_type} ${X_SOURCES}) + endif() + +- target_link_libraries(${_target} ${_deps}) +- set_target_properties(${_target} PROPERTIES LINK_FLAGS "${ASMJIT_PRIVATE_LFLAGS}") ++ set_target_properties(${target} PROPERTIES DEFINE_SYMBOL "") ++ target_link_libraries(${target} PRIVATE ${X_LIBRARIES}) ++ ++ # target_link_options was added in cmake v3.13, don't use it for now... ++ foreach(link_flag ${ASMJIT_PRIVATE_LFLAGS}) ++ set_property(TARGET ${target} APPEND_STRING PROPERTY LINK_FLAGS " ${link_flag}") ++ endforeach() ++ ++ target_compile_features(${target} PUBLIC cxx_std_11) ++ set_property(TARGET ${target} PROPERTY CXX_EXTENSIONS NO) ++ set_property(TARGET ${target} PROPERTY CXX_VISIBILITY_PRESET hidden) ++ target_compile_options(${target} PRIVATE ${X_CFLAGS} ${ASMJIT_SANITIZE_CFLAGS} $<$:${X_CFLAGS_DBG}> $<$>:${X_CFLAGS_REL}>) ++ ++ if ("${target_type}" STREQUAL "TEST") ++ add_test(NAME ${target} COMMAND ${target}) ++ endif() ++endfunction() + +- if(CMAKE_BUILD_TYPE) +- if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") +- target_compile_options(${_target} PRIVATE ${_cflags} ${_cflags_dbg}) ++# AsmJit - Compiler Support ++# ========================= ++ ++# We will have to keep this most likely forever as some users may still be using it. ++set(ASMJIT_INCLUDE_DIR "${ASMJIT_INCLUDE_DIRS}") ++ ++if (NOT ASMJIT_NO_CUSTOM_FLAGS) ++ if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" OR "x${CMAKE_CXX_COMPILER_FRONTEND_VARIANT}" STREQUAL "xMSVC") ++ list(APPEND ASMJIT_PRIVATE_CFLAGS ++ -MP # [+] Multi-Process Compilation. ++ -GF # [+] Eliminate duplicate strings. ++ -Zc:__cplusplus # [+] Conforming __cplusplus definition. ++ -Zc:inline # [+] Remove unreferenced COMDAT. ++ -Zc:strictStrings # [+] Strict const qualification of string literals. ++ -Zc:threadSafeInit- # [-] Thread-safe statics. ++ -W4) # [+] Warning level 4. ++ ++ list(APPEND ASMJIT_PRIVATE_CFLAGS_DBG ++ -GS) # [+] Buffer security-check. ++ ++ list(APPEND ASMJIT_PRIVATE_CFLAGS_REL ++ -GS- # [-] Buffer security-check. ++ -O2 # [+] Favor speed over size. ++ -Oi) # [+] Generate intrinsic functions. ++ elseif ("${CMAKE_CXX_COMPILER_ID}" MATCHES "^(GNU|Clang|AppleClang)$") ++ list(APPEND ASMJIT_PRIVATE_CFLAGS -Wall -Wextra -Wconversion) ++ list(APPEND ASMJIT_PRIVATE_CFLAGS -fno-math-errno) ++ list(APPEND ASMJIT_PRIVATE_CFLAGS_REL -O2) ++ ++ # -fno-semantic-interposition is not available on apple - the compiler issues a warning, which is not detected. ++ if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "AppleClang") ++ asmjit_detect_cflags(ASMJIT_PRIVATE_CFLAGS -fno-threadsafe-statics) + else() +- target_compile_options(${_target} PRIVATE ${_cflags} ${_cflags_rel}) ++ asmjit_detect_cflags(ASMJIT_PRIVATE_CFLAGS -fno-threadsafe-statics -fno-semantic-interposition) + endif() +- else() +- target_compile_options(${_target} PRIVATE ${_cflags} +- $<$:${_cflags_dbg}> +- $<$>:${_cflags_rel}>) ++ ++ # The following flags can save few bytes in the resulting binary. ++ asmjit_detect_cflags(ASMJIT_PRIVATE_CFLAGS_REL ++ -fmerge-all-constants # Merge all constants even if it violates ISO C++. ++ -fno-enforce-eh-specs) # Don't enforce termination if noexcept function throws. endif() ++endif() ++ ++# Support for sanitizers. ++if (ASMJIT_SANITIZE) ++ asmjit_detect_sanitizers(ASMJIT_SANITIZE_CFLAGS ${ASMJIT_SANITIZE}) ++ if (ASMJIT_SANITIZE_CFLAGS) ++ message("-- Enabling sanitizers: '${ASMJIT_SANITIZE_CFLAGS}'") ++ ++ # Linker must receive the same flags as the compiler when it comes to sanitizers. ++ set(ASMJIT_SANITIZE_LFLAGS ${ASMJIT_SANITIZE_CFLAGS}) - if(NOT ASMJIT_STATIC) - install(TARGETS ${_target} DESTINATION "lib${LIB_SUFFIX}") -- endif() -+ install(TARGETS ${_target} DESTINATION "lib${LIB_SUFFIX}") - endmacro() ++ # Don't omit frame pointer if sanitizers are enabled. ++ if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" OR "x${CMAKE_CXX_COMPILER_FRONTEND_VARIANT}" STREQUAL "xMSVC") ++ list(APPEND ASMJIT_SANITIZE_CFLAGS -Oy-) ++ else() ++ list(APPEND ASMJIT_SANITIZE_CFLAGS -fno-omit-frame-pointer -g) ++ endif() ++ ++ list(APPEND ASMJIT_PRIVATE_CFLAGS ${ASMJIT_SANITIZE_CFLAGS}) ++ list(APPEND ASMJIT_PRIVATE_LFLAGS ${ASMJIT_SANITIZE_LFLAGS}) + endif() +-endmacro() ++endif() + +-# ============================================================================= +-# [AsmJit - Source] +-# ============================================================================= ++if (WIN32) ++ # Dependency: nothing extra at the moment. ++elseif ("${CMAKE_SYSTEM_NAME}" STREQUAL "Android") ++ # Dependency: libc is the only required library on Android as it also provides libthread. ++ message("-- Dependency: adding libc (Android target detected)") ++ list(APPEND ASMJIT_DEPS c) ++elseif ("${CMAKE_SYSTEM_NAME}" STREQUAL "Haiku") ++ # Dependency: libroot is used by Haiku instead of libc, so link to libroot and libpthread. ++ message("-- Dependency: adding libroot and libpthread (Haiku target detected)") ++ list(APPEND ASMJIT_DEPS root pthread) ++else() ++ # Dependency: libc is always required. ++ message("-- Dependency: adding libc (Linux, BSD, or other UNIX/POSIX environment)") ++ list(APPEND ASMJIT_DEPS c) ++ ++ # Dependency: pthread (required so AsmJit can use pthread_lock). ++ check_cxx_source_compiles(" ++ #include ++ int main() { ++ pthread_mutex_t m; ++ pthread_mutex_init(&m, nullptr); ++ return pthread_mutex_destroy(&m); ++ } ++ " ASMJIT_LIBC_HAS_LIBPTHREAD) ++ if (ASMJIT_LIBC_HAS_LIBPTHREAD) ++ message("-- Dependency: libpthread provided by libc (not linking to libpthread)") ++ else() ++ message("-- Dependency: libpthread not provided by libc, linking to libpthread") ++ list(APPEND ASMJIT_DEPS pthread) ++ endif() + +-set(ASMJIT_SRC "") ++ # Dependency: shm_open (required so AsmJit can use shm_open on supported platforms). ++ if ("${CMAKE_SYSTEM_NAME}" MATCHES "^(Linux|NetBSD)$" AND NOT ASMJIT_NO_SHM_OPEN) ++ check_cxx_source_compiles(" ++ #include ++ int main() { ++ const char file_name[1] {}; ++ return shm_open(file_name, 0, 0); ++ } ++ " ASMJIT_LIBC_HAS_LIBRT) ++ if (ASMJIT_LIBC_HAS_LIBRT) ++ message("-- Dependency: shm_open provided by libc (not linking to librt)") ++ else() ++ message("-- Dependency: shm_open not provided by libc, linking to librt") ++ list(APPEND ASMJIT_DEPS rt) ++ endif() ++ endif() ++endif() + +-asmjit_add_source(ASMJIT_SRC asmjit +- apibegin.h +- apiend.h ++set(ASMJIT_LIBS ${ASMJIT_DEPS}) ++if (NOT ASMJIT_EMBED) ++ list(INSERT ASMJIT_LIBS 0 asmjit) ++endif() + +- asmjit.h +- base.h +- build.h +- host.h ++if (ASMJIT_EMBED) ++ set(ASMJIT_TARGET_TYPE "EMBED") ++elseif (ASMJIT_STATIC) ++ set(ASMJIT_TARGET_TYPE "STATIC") ++else() ++ set(ASMJIT_TARGET_TYPE "SHARED") ++endif() + +- arm.h +- x86.h +-) ++foreach(build_option # AsmJit build options. ++ ASMJIT_STATIC ++ ASMJIT_NO_DEPRECATED ++ # AsmJit backends selection. ++ ASMJIT_NO_X86 ++ ASMJIT_NO_AARCH64 ++ ASMJIT_NO_FOREIGN ++ # AsmJit features selection. ++ ASMJIT_NO_JIT ++ ASMJIT_NO_TEXT ++ ASMJIT_NO_LOGGING ++ ASMJIT_NO_INTROSPECTION ++ ASMJIT_NO_VALIDATION ++ ASMJIT_NO_BUILDER ++ ASMJIT_NO_COMPILER) ++ if (${build_option}) ++ List(APPEND ASMJIT_CFLAGS "-D${build_option}") ++ List(APPEND ASMJIT_PRIVATE_CFLAGS "-D${build_option}") ++ endif() ++endforeach() - # ============================================================================= +-asmjit_add_source(ASMJIT_SRC asmjit/base +- assembler.cpp +- assembler.h +- compiler.cpp +- compiler.h +- compilercontext.cpp +- compilercontext_p.h +- compilerfunc.h +- constpool.cpp +- constpool.h +- containers.cpp +- containers.h +- cpuinfo.cpp +- cpuinfo.h +- globals.cpp +- globals.h +- hlstream.cpp +- hlstream.h +- logger.cpp +- logger.h +- operand.cpp +- operand.h +- podvector.cpp +- podvector.h +- runtime.cpp +- runtime.h +- utils.cpp +- utils.h +- vectypes.h +- vmem.cpp +- vmem.h +- zone.cpp +- zone.h +-) ++# AsmJit - Linker Support ++# ======================= + +-if(0) +-asmjit_add_source(ASMJIT_SRC asmjit/arm +- armassembler.cpp +- armassembler.h +- arminst.cpp +- arminst.h +- armoperand.cpp +- armoperand_regs.cpp +- armoperand.h +-) ++if (WIN32) ++ if (CMAKE_LINKER MATCHES "link\\.exe" OR CMAKE_LINKER MATCHES "lld-link\\.exe") ++ set(ASMJIT_LINKER_SUPPORTS_NATVIS TRUE) ++ endif() + endif() + +-asmjit_add_source(ASMJIT_SRC asmjit/x86 +- x86assembler.cpp +- x86assembler.h +- x86compiler.cpp +- x86compiler.h +- x86compilercontext.cpp +- x86compilercontext_p.h +- x86compilerfunc.cpp +- x86compilerfunc.h +- x86inst.cpp +- x86inst.h +- x86operand.cpp +- x86operand_regs.cpp +- x86operand.h ++# AsmJit - Source ++# =============== ++ ++set(ASMJIT_SRC_LIST ++ asmjit/apibegin.h ++ asmjit/apiend.h ++ asmjit/asmjit.h ++ asmjit/base.h ++ asmjit/build.h ++ asmjit/host.h ++ asmjit/arm.h ++ asmjit/x86.h ++ ++ asmjit/base/assembler.cpp ++ asmjit/base/assembler.h ++ asmjit/base/compiler.cpp ++ asmjit/base/compiler.h ++ asmjit/base/compilercontext.cpp ++ asmjit/base/compilercontext_p.h ++ asmjit/base/compilerfunc.h ++ asmjit/base/constpool.cpp ++ asmjit/base/constpool.h ++ asmjit/base/containers.cpp ++ asmjit/base/containers.h ++ asmjit/base/cpuinfo.cpp ++ asmjit/base/cpuinfo.h ++ asmjit/base/globals.cpp ++ asmjit/base/globals.h ++ asmjit/base/hlstream.cpp ++ asmjit/base/hlstream.h ++ asmjit/base/logger.cpp ++ asmjit/base/logger.h ++ asmjit/base/operand.cpp ++ asmjit/base/operand.h ++ asmjit/base/podvector.cpp ++ asmjit/base/podvector.h ++ asmjit/base/runtime.cpp ++ asmjit/base/runtime.h ++ asmjit/base/utils.cpp ++ asmjit/base/utils.h ++ asmjit/base/vectypes.h ++ asmjit/base/vmem.cpp ++ asmjit/base/vmem.h ++ asmjit/base/zone.cpp ++ asmjit/base/zone.h ++ ++ asmjit/x86/x86assembler.cpp ++ asmjit/x86/x86assembler.h ++ asmjit/x86/x86compiler.cpp ++ asmjit/x86/x86compiler.h ++ asmjit/x86/x86compilercontext.cpp ++ asmjit/x86/x86compilercontext_p.h ++ asmjit/x86/x86compilerfunc.cpp ++ asmjit/x86/x86compilerfunc.h ++ asmjit/x86/x86inst.cpp ++ asmjit/x86/x86inst.h ++ asmjit/x86/x86operand.cpp ++ asmjit/x86/x86operand_regs.cpp ++ asmjit/x86/x86operand.h + ) ++set(ASMJIT_SRC "") ++foreach(src_file ${ASMJIT_SRC_LIST}) ++ set(src_file "${ASMJIT_DIR}/src/${src_file}") ++ list(APPEND ASMJIT_SRC ${src_file}) + +-# ============================================================================= +-# [AsmJit - Targets] +-# ============================================================================= +- +-if(NOT ASMJIT_EMBED) +- # Add `asmjit` library. +- asmjit_add_library(asmjit +- "${ASMJIT_SRC}" +- "${ASMJIT_DEPS}" +- "" +- "${ASMJIT_PRIVATE_CFLAGS_DBG}" +- "${ASMJIT_PRIVATE_CFLAGS_REL}" +- ) +- +- foreach(_src_file ${ASMJIT_SRC}) +- get_filename_component(_src_dir ${_src_file} PATH) +- get_filename_component(_src_name ${_src_file} NAME) +- string(REGEX REPLACE "^${ASMJIT_SOURCE_DIR}/" "" targetpath "${_src_dir}") +- if("${_src_name}" MATCHES ".h$") +- if(NOT "${_src_name}" MATCHES "_p.h$") +- install(FILES ${_src_file} DESTINATION "include/${targetpath}") ++ if ("${src_file}" MATCHES "\\.natvis") ++ if (ASMJIT_LINKER_SUPPORTS_NATVIS) ++ list(APPEND ASMJIT_PRIVATE_LFLAGS "-natvis:${src_file}") ++ endif() ++ endif() ++endforeach() ++ ++source_group(TREE "${ASMJIT_DIR}" FILES ${ASMJIT_SRC}) ++ ++# AsmJit - Summary ++# ================ ++ ++message("** AsmJit Summary **") ++message(" ASMJIT_DIR=${ASMJIT_DIR}") ++message(" ASMJIT_TEST=${ASMJIT_TEST}") ++message(" ASMJIT_TARGET_TYPE=${ASMJIT_TARGET_TYPE}") ++message(" ASMJIT_DEPS=${ASMJIT_DEPS}") ++message(" ASMJIT_LIBS=${ASMJIT_LIBS}") ++message(" ASMJIT_CFLAGS=${ASMJIT_CFLAGS}") ++message(" ASMJIT_PRIVATE_CFLAGS=${ASMJIT_PRIVATE_CFLAGS}") ++message(" ASMJIT_PRIVATE_CFLAGS_DBG=${ASMJIT_PRIVATE_CFLAGS_DBG}") ++message(" ASMJIT_PRIVATE_CFLAGS_REL=${ASMJIT_PRIVATE_CFLAGS_REL}") ++ ++# AsmJit - Targets ++# ================ ++ ++if (NOT ASMJIT_EMBED) ++ # Add AsmJit target. ++ asmjit_add_target(asmjit "${ASMJIT_TARGET_TYPE}" ++ SOURCES ${ASMJIT_SRC} ++ LIBRARIES ${ASMJIT_DEPS} ++ CFLAGS ${ASMJIT_PRIVATE_CFLAGS} ++ CFLAGS_DBG ${ASMJIT_PRIVATE_CFLAGS_DBG} ++ CFLAGS_REL ${ASMJIT_PRIVATE_CFLAGS_REL}) ++ ++ target_compile_options(asmjit INTERFACE ${ASMJIT_CFLAGS}) ++ target_include_directories(asmjit BEFORE INTERFACE ++ $ ++ $) ++ ++ # Add asmjit::asmjit alias. ++ add_library(asmjit::asmjit ALIAS asmjit) ++ # TODO: [CMAKE] Deprecated alias - we use projectname::libraryname convention now. ++ add_library(AsmJit::AsmJit ALIAS asmjit) ++ ++ # Add AsmJit install instructions (library and public headers). ++ if (NOT ASMJIT_NO_INSTALL) ++ install(TARGETS asmjit ++ EXPORT asmjit-config ++ RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" ++ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" ++ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" ++ INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") ++ install(EXPORT asmjit-config ++ NAMESPACE asmjit:: ++ DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/asmjit") ++ ++ foreach(_src_file ${ASMJIT_SRC_LIST}) ++ if ("${_src_file}" MATCHES "\\.h$" AND NOT "${_src_file}" MATCHES "_p\\.h$") ++ get_filename_component(_src_dir ${_src_file} PATH) ++ install(FILES "${ASMJIT_DIR}/src/${_src_file}" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${_src_dir}") + endif() ++ endforeach() ++ endif() ++ ++ # Add AsmJit tests. ++ if (ASMJIT_TEST) ++ enable_testing() ++ ++ # Special target that always uses embedded AsmJit. ++ asmjit_add_target(asmjit_test_unit TEST ++ SOURCES ${ASMJIT_SRC} ++ test/asmjit_test_unit.cpp ++ test/broken.cpp ++ test/broken.h ++ LIBRARIES ${ASMJIT_DEPS} ++ CFLAGS ${ASMJIT_PRIVATE_CFLAGS} ++ -DASMJIT_TEST ++ -DASMJIT_STATIC ++ CFLAGS_DBG ${ASMJIT_PRIVATE_CFLAGS_DBG} ++ CFLAGS_REL ${ASMJIT_PRIVATE_CFLAGS_REL}) ++ target_include_directories(asmjit_test_unit BEFORE PRIVATE ${ASMJIT_INCLUDE_DIRS}) ++ ++ asmjit_add_target(asmjit_test_assembler TEST ++ SOURCES test/asmjit_test_assembler.cpp ++ test/asmjit_test_assembler.h ++ test/asmjit_test_assembler_a64.cpp ++ test/asmjit_test_assembler_x64.cpp ++ test/asmjit_test_assembler_x86.cpp ++ LIBRARIES asmjit::asmjit ++ CFLAGS ${ASMJIT_PRIVATE_CFLAGS} ++ CFLAGS_DBG ${ASMJIT_PRIVATE_CFLAGS_DBG} ++ CFLAGS_REL ${ASMJIT_PRIVATE_CFLAGS_REL}) ++ ++ asmjit_add_target(asmjit_test_perf EXECUTABLE ++ SOURCES test/asmjit_test_perf.cpp ++ test/asmjit_test_perf_a64.cpp ++ test/asmjit_test_perf_x86.cpp ++ SOURCES test/asmjit_test_perf.h ++ LIBRARIES asmjit::asmjit ++ CFLAGS ${ASMJIT_PRIVATE_CFLAGS} ++ CFLAGS_DBG ${ASMJIT_PRIVATE_CFLAGS_DBG} ++ CFLAGS_REL ${ASMJIT_PRIVATE_CFLAGS_REL}) ++ ++ foreach(_target asmjit_test_emitters ++ asmjit_test_execute ++ asmjit_test_x86_sections) ++ asmjit_add_target(${_target} TEST ++ SOURCES test/${_target}.cpp ++ LIBRARIES asmjit::asmjit ++ CFLAGS ${ASMJIT_PRIVATE_CFLAGS} ++ CFLAGS_DBG ${ASMJIT_PRIVATE_CFLAGS_DBG} ++ CFLAGS_REL ${ASMJIT_PRIVATE_CFLAGS_REL}) ++ endforeach() ++ ++ if (NOT ASMJIT_NO_INTROSPECTION) ++ asmjit_add_target(asmjit_test_instinfo TEST ++ SOURCES test/asmjit_test_instinfo.cpp ++ LIBRARIES asmjit::asmjit ++ CFLAGS ${ASMJIT_PRIVATE_CFLAGS} ++ CFLAGS_DBG ${ASMJIT_PRIVATE_CFLAGS_DBG} ++ CFLAGS_REL ${ASMJIT_PRIVATE_CFLAGS_REL}) + endif() +- endforeach() + +- # Add `asmjit` tests and samples. +- if(ASMJIT_BUILD_TEST) +- set(ASMJIT_TEST_SRC "") +- set(ASMJIT_TEST_CFLAGS ${ASMJIT_CFLAGS} ${ASMJIT_D}ASMJIT_TEST ${ASMJIT_D}ASMJIT_EMBED) +- asmjit_add_source(ASMJIT_TEST_SRC test asmjit_test_unit.cpp broken.cpp broken.h) +- +- add_executable(asmjit_test_unit ${ASMJIT_SRC} ${ASMJIT_TEST_SRC}) +- target_link_libraries(asmjit_test_unit ${ASMJIT_DEPS}) +- set_target_properties(asmjit_test_unit PROPERTIES LINK_FLAGS "${ASMJIT_PRIVATE_LFLAGS}") +- +- if(CMAKE_BUILD_TYPE) +- if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") +- target_compile_options(asmjit_test_unit PRIVATE ${ASMJIT_TEST_CFLAGS} ${ASMJIT_PRIVATE_CFLAGS_DBG}) +- else() +- target_compile_options(asmjit_test_unit PRIVATE ${ASMJIT_TEST_CFLAGS} ${ASMJIT_PRIVATE_CFLAGS_REL}) ++ if (NOT (ASMJIT_NO_BUILDER OR ASMJIT_NO_COMPILER)) ++ # Vectorcall tests and XMM tests require at least SSE2 in 32-bit mode (in 64-bit mode it's implicit). ++ # Some compilers don't like passing -msse2 for 64-bit targets, and some compilers targeting non-x86 ++ # would pass "-msse2" compile flag check, but with a warning not detected by CMake. Thus, verify that ++ # our target is really 32-bit X86 and only use -msse2 or -arch:SSE2 flags when necessary. ++ set(ASMJIT_SSE2_CFLAGS "") ++ ++ check_cxx_source_compiles(" ++ #if defined(_M_IX86) || defined(__X86__) || defined(__i386__) ++ int target_is_32_bit_x86() { return 1; } ++ #else ++ // Compile error... ++ #endif ++ ++ int main() { ++ return target_is_32_bit_x86(); ++ } ++ " ASMJIT_TARGET_IS_32_BIT_X86) ++ ++ if (ASMJIT_TARGET_IS_32_BIT_X86) ++ if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" OR "x${CMAKE_CXX_COMPILER_FRONTEND_VARIANT}" STREQUAL "xMSVC") ++ asmjit_detect_cflags(ASMJIT_SSE2_CFLAGS "-arch:SSE2") ++ else() ++ asmjit_detect_cflags(ASMJIT_SSE2_CFLAGS "-msse2") ++ endif() + endif() +- else() +- target_compile_options(asmjit_test_unit PRIVATE ${ASMJIT_TEST_CFLAGS} +- $<$:${ASMJIT_PRIVATE_CFLAGS_DBG}> +- $<$>:${ASMJIT_PRIVATE_CFLAGS_REL}>) ++ asmjit_add_target(asmjit_test_compiler TEST ++ SOURCES test/asmjit_test_compiler.cpp ++ test/asmjit_test_compiler.h ++ test/asmjit_test_compiler_a64.cpp ++ test/asmjit_test_compiler_x86.cpp ++ LIBRARIES asmjit::asmjit ++ CFLAGS ${ASMJIT_PRIVATE_CFLAGS} ${ASMJIT_SSE2_CFLAGS} ++ CFLAGS_DBG ${ASMJIT_PRIVATE_CFLAGS_DBG} ++ CFLAGS_REL ${ASMJIT_PRIVATE_CFLAGS_REL}) + endif() + +- foreach(_target asmjit_bench_x86 asmjit_test_opcode asmjit_test_x86) +- add_executable(${_target} "src/test/${_target}.cpp") +- target_compile_options(${_target} PRIVATE ${ASMJIT_CFLAGS}) +- target_link_libraries(${_target} ${ASMJIT_LIBS}) +- endforeach() + endif() + endif() ++ ++cmake_policy(POP) diff --git a/vcpkg-registry/ports/asmjit/fb9f82c/portfile.cmake b/vcpkg-registry/ports/asmjit/fb9f82c/portfile.cmake index d355c09..17b00cf 100644 --- a/vcpkg-registry/ports/asmjit/fb9f82c/portfile.cmake +++ b/vcpkg-registry/ports/asmjit/fb9f82c/portfile.cmake @@ -23,9 +23,9 @@ vcpkg_cmake_config_fixup(CONFIG_PATH lib/cmake/asmjit) file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/include") -vcpkg_replace_string("${CURRENT_PACKAGES_DIR}/include/asmjit/core/api-config.h" - "#if !defined(ASMJIT_STATIC)" - "#if 0" -) +# vcpkg_replace_string("${CURRENT_PACKAGES_DIR}/include/asmjit/core/api-config.h" +# "#if !defined(ASMJIT_STATIC)" +# "#if 0" +# ) vcpkg_install_copyright(FILE_LIST "${SOURCE_PATH}/LICENSE.md") diff --git a/vcpkg.json b/vcpkg.json index 6fa303c..6be7f63 100644 --- a/vcpkg.json +++ b/vcpkg.json @@ -17,7 +17,8 @@ "boost-headers", "boost-locale", "boost-multi-index", - "boost-thread" + "boost-thread", + "boost-predef" ], "features": { "tests": { From 0e1b9956712a3fec67cb86c3c9c17338b55a57af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mika=C3=ABl=20Capelle?= Date: Wed, 3 Jul 2024 18:04:09 +0200 Subject: [PATCH 03/20] Still working on CMake integration. --- CMakeLists.txt | 3 +++ src/shared/CMakeLists.txt | 6 ++++-- src/thooklib/CMakeLists.txt | 7 +++++-- src/usvfs_dll/CMakeLists.txt | 19 +++++++++++++++++++ src/usvfs_helper/CMakeLists.txt | 1 + src/usvfs_proxy/CMakeLists.txt | 8 ++++++++ vcpkg-triplets/x64-windows.cmake | 10 +--------- vcpkg-triplets/x86-windows.cmake | 10 +--------- 8 files changed, 42 insertions(+), 22 deletions(-) create mode 100644 src/usvfs_dll/CMakeLists.txt create mode 100644 src/usvfs_proxy/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 3c9b06d..1707310 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,3 +10,6 @@ add_subdirectory(src/shared) add_subdirectory(src/thooklib) add_subdirectory(src/tinjectlib) add_subdirectory(src/usvfs_helper) + +add_subdirectory(src/usvfs_dll) +add_subdirectory(src/usvfs_proxy) diff --git a/src/shared/CMakeLists.txt b/src/shared/CMakeLists.txt index 9c00e68..9b23716 100644 --- a/src/shared/CMakeLists.txt +++ b/src/shared/CMakeLists.txt @@ -1,13 +1,15 @@ cmake_minimum_required(VERSION 3.16) -find_package(Boost CONFIG REQUIRED COMPONENTS algorithm interprocess) +find_package(Boost CONFIG REQUIRED COMPONENTS algorithm interprocess filesystem) find_package(spdlog CONFIG REQUIRED) file(GLOB sources "*.cpp" "*.h") source_group("" FILES ${sources}) add_library(shared STATIC ${sources}) -target_link_libraries(shared PUBLIC Boost Boost::algorithm Boost::interprocess spdlog::spdlog) +target_link_libraries(shared + PUBLIC + Boost::algorithm Boost::interprocess Boost::filesystem spdlog::spdlog) target_include_directories(shared PUBLIC ${PROJECT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}) target_precompile_headers(shared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/pch.h) diff --git a/src/thooklib/CMakeLists.txt b/src/thooklib/CMakeLists.txt index 1baab9e..43ae4b1 100644 --- a/src/thooklib/CMakeLists.txt +++ b/src/thooklib/CMakeLists.txt @@ -1,11 +1,14 @@ cmake_minimum_required(VERSION 3.16) find_package(asmjit CONFIG REQUIRED) +find_library(LIBUDIS86_LIBRARY libudis86) -file(GLOB sources "*.cpp" "*.h") +file(GLOB sources CONFIGURE_DEPENDS "*.cpp" "*.h") source_group("" FILES ${sources}) add_library(thooklib STATIC ${sources}) -target_link_libraries(thooklib PRIVATE shared asmjit::asmjit) +message(STATUS "VCPKG_ROOT=${VCPKG_ROOT}") +target_link_libraries(thooklib PRIVATE shared asmjit::asmjit ${LIBUDIS86_LIBRARY}) +target_include_directories(thooklib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) set_target_properties(thooklib PROPERTIES FOLDER injection) target_precompile_headers(shared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../shared/pch.h) diff --git a/src/usvfs_dll/CMakeLists.txt b/src/usvfs_dll/CMakeLists.txt new file mode 100644 index 0000000..0a83406 --- /dev/null +++ b/src/usvfs_dll/CMakeLists.txt @@ -0,0 +1,19 @@ +cmake_minimum_required(VERSION 3.16) + +find_package(Boost CONFIG REQUIRED COMPONENTS thread) +find_package(spdlog CONFIG REQUIRED) + +file(GLOB sources "*.cpp" "*.h") +source_group("" FILES ${sources}) + +file(GLOB hooks "hooks/*.cpp" "hooks/*.h") +source_group("dlls" FILES ${hooks}) + +add_library(usvfs_dll SHARED ${sources} ${hooks}) +target_link_libraries(usvfs_dll + PUBLIC shared thooklib usvfs_helper + Boost::thread spdlog::spdlog) +target_compile_definitions(usvfs_dll PRIVATE BUILDING_USVFS_DLL) +# target_precompile_headers(shared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../pch.h) + +add_library(usvfs ALIAS usvfs_dll) diff --git a/src/usvfs_helper/CMakeLists.txt b/src/usvfs_helper/CMakeLists.txt index 30df5a8..e4458fb 100644 --- a/src/usvfs_helper/CMakeLists.txt +++ b/src/usvfs_helper/CMakeLists.txt @@ -5,5 +5,6 @@ source_group("" FILES ${sources}) add_library(usvfs_helper STATIC ${sources}) target_link_libraries(usvfs_helper PRIVATE shared tinjectlib) +target_include_directories(usvfs_helper PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) set_target_properties(usvfs_helper PROPERTIES FOLDER injection) # target_precompile_headers(shared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../shared/pch.h) diff --git a/src/usvfs_proxy/CMakeLists.txt b/src/usvfs_proxy/CMakeLists.txt new file mode 100644 index 0000000..38c5df0 --- /dev/null +++ b/src/usvfs_proxy/CMakeLists.txt @@ -0,0 +1,8 @@ +cmake_minimum_required(VERSION 3.16) + +find_package(Boost CONFIG REQUIRED COMPONENTS filesystem) + +add_executable(usvfs_proxy main.cpp) +target_link_libraries(usvfs_proxy PRIVATE usvfs_dll shared usvfs_helper) +# set_target_properties(usvfs_helper PROPERTIES FOLDER injection) +# target_precompile_headers(shared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../shared/pch.h) diff --git a/vcpkg-triplets/x64-windows.cmake b/vcpkg-triplets/x64-windows.cmake index ef26fdd..63d6cde 100644 --- a/vcpkg-triplets/x64-windows.cmake +++ b/vcpkg-triplets/x64-windows.cmake @@ -1,11 +1,3 @@ set(VCPKG_TARGET_ARCHITECTURE x64) set(VCPKG_CRT_LINKAGE dynamic) -set(VCPKG_LIBRARY_LINKAGE dynamic) - -if(PORT MATCHES "^boost-") - set(VCPKG_LIBRARY_LINKAGE static) -endif() - -if(PORT MATCHES "asmjit") - set(VCPKG_LIBRARY_LINKAGE static) -endif() +set(VCPKG_LIBRARY_LINKAGE static) diff --git a/vcpkg-triplets/x86-windows.cmake b/vcpkg-triplets/x86-windows.cmake index c323339..2496b16 100644 --- a/vcpkg-triplets/x86-windows.cmake +++ b/vcpkg-triplets/x86-windows.cmake @@ -1,11 +1,3 @@ set(VCPKG_TARGET_ARCHITECTURE x86) set(VCPKG_CRT_LINKAGE dynamic) -set(VCPKG_LIBRARY_LINKAGE dynamic) - -if(PORT MATCHES "^boost-") - set(VCPKG_LIBRARY_LINKAGE static) -endif() - -if(PORT MATCHES "asmjit") - set(VCPKG_LIBRARY_LINKAGE static) -endif() +set(VCPKG_LIBRARY_LINKAGE static) From 1ad9320708282e19183f2c65cbf558c916b7284d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mika=C3=ABl=20Capelle?= Date: Wed, 3 Jul 2024 20:11:52 +0200 Subject: [PATCH 04/20] Finally going somewhere... --- CMakeLists.txt | 20 ++++ src/shared/CMakeLists.txt | 2 +- src/thooklib/CMakeLists.txt | 3 +- src/usvfs_dll/CMakeLists.txt | 13 ++- src/usvfs_proxy/CMakeLists.txt | 8 +- test/test_utils/CMakeLists.txt | 8 ++ .../test_utils}/test_helpers.cpp | 4 - .../shared => test/test_utils}/test_helpers.h | 102 ++++++++++-------- test/tvfs_test/CMakeLists.txt | 16 +++ vcpkg.json | 10 +- 10 files changed, 123 insertions(+), 63 deletions(-) create mode 100644 test/test_utils/CMakeLists.txt rename {src/shared => test/test_utils}/test_helpers.cpp (99%) rename {src/shared => test/test_utils}/test_helpers.h (52%) create mode 100644 test/tvfs_test/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 1707310..2b3964f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,10 +1,23 @@ cmake_minimum_required(VERSION 3.16) +if (BUILD_USVFS_TESTS) + list(APPEND VCPKG_MANIFEST_FEATURES "testing") +endif() + project(usvfs) set_property(GLOBAL PROPERTY USE_FOLDERS ON) set(CMAKE_CXX_STANDARD 20) +set(USVFS_BINDIR ${CMAKE_CURRENT_LIST_DIR}/bin) +set(USVFS_LIBDIR ${CMAKE_CURRENT_LIST_DIR}/lib) + +if(CMAKE_SIZEOF_VOID_P EQUAL 4) + set(ARCH_POSTFIX _x86) +else() + set(ARCH_POSTFIX _x64) +endif() + add_subdirectory(src/shared) add_subdirectory(src/thooklib) @@ -13,3 +26,10 @@ add_subdirectory(src/usvfs_helper) add_subdirectory(src/usvfs_dll) add_subdirectory(src/usvfs_proxy) + +if (BUILD_USVFS_TESTS) + enable_testing() + set(USVFS_TEST_BINDIR ${CMAKE_CURRENT_LIST_DIR}/test/bin) + add_subdirectory(test/test_utils) + add_subdirectory(test/tvfs_test) +endif() diff --git a/src/shared/CMakeLists.txt b/src/shared/CMakeLists.txt index 9b23716..7597c38 100644 --- a/src/shared/CMakeLists.txt +++ b/src/shared/CMakeLists.txt @@ -9,7 +9,7 @@ source_group("" FILES ${sources}) add_library(shared STATIC ${sources}) target_link_libraries(shared PUBLIC - Boost::algorithm Boost::interprocess Boost::filesystem spdlog::spdlog) + Boost::algorithm Boost::interprocess Boost::filesystem spdlog::spdlog_header_only) target_include_directories(shared PUBLIC ${PROJECT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}) target_precompile_headers(shared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/pch.h) diff --git a/src/thooklib/CMakeLists.txt b/src/thooklib/CMakeLists.txt index 43ae4b1..9604f64 100644 --- a/src/thooklib/CMakeLists.txt +++ b/src/thooklib/CMakeLists.txt @@ -2,13 +2,14 @@ cmake_minimum_required(VERSION 3.16) find_package(asmjit CONFIG REQUIRED) find_library(LIBUDIS86_LIBRARY libudis86) +find_package(spdlog CONFIG REQUIRED) file(GLOB sources CONFIGURE_DEPENDS "*.cpp" "*.h") source_group("" FILES ${sources}) add_library(thooklib STATIC ${sources}) message(STATUS "VCPKG_ROOT=${VCPKG_ROOT}") -target_link_libraries(thooklib PRIVATE shared asmjit::asmjit ${LIBUDIS86_LIBRARY}) +target_link_libraries(thooklib PRIVATE shared asmjit::asmjit ${LIBUDIS86_LIBRARY} spdlog::spdlog_header_only) target_include_directories(thooklib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) set_target_properties(thooklib PROPERTIES FOLDER injection) target_precompile_headers(shared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../shared/pch.h) diff --git a/src/usvfs_dll/CMakeLists.txt b/src/usvfs_dll/CMakeLists.txt index 0a83406..1a1943d 100644 --- a/src/usvfs_dll/CMakeLists.txt +++ b/src/usvfs_dll/CMakeLists.txt @@ -12,8 +12,15 @@ source_group("dlls" FILES ${hooks}) add_library(usvfs_dll SHARED ${sources} ${hooks}) target_link_libraries(usvfs_dll PUBLIC shared thooklib usvfs_helper - Boost::thread spdlog::spdlog) + Boost::thread spdlog::spdlog_header_only + Shlwapi comsuppw) +target_include_directories(usvfs_dll PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) target_compile_definitions(usvfs_dll PRIVATE BUILDING_USVFS_DLL) -# target_precompile_headers(shared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../pch.h) +set_target_properties(usvfs_dll + PROPERTIES + RUNTIME_OUTPUT_NAME usvfs${ARCH_POSTFIX} + RUNTIME_OUTPUT_DIRECTORY_DEBUG ${USVFS_LIBDIR} + RUNTIME_OUTPUT_DIRECTORY_RELEASE ${USVFS_LIBDIR} +) -add_library(usvfs ALIAS usvfs_dll) +add_library(usvfs_dll ALIAS usvfs_dll) diff --git a/src/usvfs_proxy/CMakeLists.txt b/src/usvfs_proxy/CMakeLists.txt index 38c5df0..eaac78f 100644 --- a/src/usvfs_proxy/CMakeLists.txt +++ b/src/usvfs_proxy/CMakeLists.txt @@ -4,5 +4,9 @@ find_package(Boost CONFIG REQUIRED COMPONENTS filesystem) add_executable(usvfs_proxy main.cpp) target_link_libraries(usvfs_proxy PRIVATE usvfs_dll shared usvfs_helper) -# set_target_properties(usvfs_helper PROPERTIES FOLDER injection) -# target_precompile_headers(shared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../shared/pch.h) +set_target_properties(usvfs_proxy + PROPERTIES + RUNTIME_OUTPUT_NAME usvfs_proxy${ARCH_POSTFIX} + RUNTIME_OUTPUT_DIRECTORY_DEBUG ${USVFS_BINDIR} + RUNTIME_OUTPUT_DIRECTORY_RELEASE ${USVFS_BINDIR} +) diff --git a/test/test_utils/CMakeLists.txt b/test/test_utils/CMakeLists.txt new file mode 100644 index 0000000..b19e1af --- /dev/null +++ b/test/test_utils/CMakeLists.txt @@ -0,0 +1,8 @@ +cmake_minimum_required(VERSION 3.16) + +find_package(GTest CONFIG REQUIRED) + +add_library(test_utils STATIC test_helpers.cpp test_helpers.h) +target_link_libraries(test_utils PRIVATE shared) +target_include_directories(test_utils PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +set_target_properties(test_utils PROPERTIES FOLDER tests) diff --git a/src/shared/test_helpers.cpp b/test/test_utils/test_helpers.cpp similarity index 99% rename from src/shared/test_helpers.cpp rename to test/test_utils/test_helpers.cpp index 923b9e6..ef008e9 100644 --- a/src/shared/test_helpers.cpp +++ b/test/test_utils/test_helpers.cpp @@ -1,7 +1,5 @@ #pragma once -#if USVFS_BUILD_TESTS - #include #include "test_helpers.h" @@ -222,5 +220,3 @@ namespace test { } }; - -#endif diff --git a/src/shared/test_helpers.h b/test/test_utils/test_helpers.h similarity index 52% rename from src/shared/test_helpers.h rename to test/test_utils/test_helpers.h index cfe86ed..ad69f22 100644 --- a/src/shared/test_helpers.h +++ b/test/test_utils/test_helpers.h @@ -1,31 +1,30 @@ #pragma once -#if USVFS_BUILD_TESTS - #include "windows_sane.h" #include -namespace test { +namespace test +{ class FuncFailed : public std::runtime_error { public: - FuncFailed(const char* func) - : std::runtime_error(msg(func)) {} - FuncFailed(const char* func, unsigned long res) - : std::runtime_error(msg(func, nullptr, &res)) {} - FuncFailed(const char* func, const char* arg1) - : std::runtime_error(msg(func, arg1)) {} - FuncFailed(const char* func, const char* arg1, unsigned long res) - : std::runtime_error(msg(func, arg1, &res)) {} - FuncFailed(const char* func, const char* what, const char* arg1) - : std::runtime_error(msg(func, arg1, nullptr, what)) {} - FuncFailed(const char* func, const char* what, const char* arg1, unsigned long res) - : std::runtime_error(msg(func, arg1, &res, what)) {} + FuncFailed(const char *func) + : std::runtime_error(msg(func)) {} + FuncFailed(const char *func, unsigned long res) + : std::runtime_error(msg(func, nullptr, &res)) {} + FuncFailed(const char *func, const char *arg1) + : std::runtime_error(msg(func, arg1)) {} + FuncFailed(const char *func, const char *arg1, unsigned long res) + : std::runtime_error(msg(func, arg1, &res)) {} + FuncFailed(const char *func, const char *what, const char *arg1) + : std::runtime_error(msg(func, arg1, nullptr, what)) {} + FuncFailed(const char *func, const char *what, const char *arg1, unsigned long res) + : std::runtime_error(msg(func, arg1, &res, what)) {} private: - std::string msg(const char* func, const char* arg1 = nullptr, const unsigned long* res = nullptr, const char* what = nullptr); + std::string msg(const char *func, const char *arg1 = nullptr, const unsigned long *res = nullptr, const char *what = nullptr); }; class WinFuncFailed : public std::runtime_error @@ -38,7 +37,7 @@ namespace test { { public: WinFuncFailedGenerator(DWORD gle = GetLastError()) : m_gle(gle) {} - WinFuncFailedGenerator(const WinFuncFailedGenerator&) = delete; + WinFuncFailedGenerator(const WinFuncFailedGenerator &) = delete; DWORD lastError() const { return m_gle; } @@ -68,25 +67,39 @@ namespace test { // trick to guarantee the evalutation of GetLastError() before the evalution of the parameters to the WinFuncFailed message generation template - [[noreturn]] void throw_testWinFuncFailed(std::basic_string_view func, Args&&... args) { - ::test::WinFuncFailedGenerator exceptionGenerator; - throw exceptionGenerator(func, std::forward(args)... ); + [[noreturn]] void throw_testWinFuncFailed(std::basic_string_view func, Args &&...args) + { + ::test::WinFuncFailedGenerator exceptionGenerator; + throw exceptionGenerator(func, std::forward(args)...); } - class ScopedFILE { + class ScopedFILE + { public: - ScopedFILE(FILE* f = nullptr) : m_f(f) {} - ScopedFILE(const ScopedFILE&) = delete; - ScopedFILE(ScopedFILE&& other) noexcept : m_f(other.m_f) { other.m_f = nullptr; } - ~ScopedFILE() { if (m_f) fclose(m_f); } + ScopedFILE(FILE *f = nullptr) : m_f(f) {} + ScopedFILE(const ScopedFILE &) = delete; + ScopedFILE(ScopedFILE &&other) noexcept : m_f(other.m_f) { other.m_f = nullptr; } + ~ScopedFILE() + { + if (m_f) + fclose(m_f); + } - void close() { if (m_f) { fclose(m_f); m_f = nullptr; } } + void close() + { + if (m_f) + { + fclose(m_f); + m_f = nullptr; + } + } operator bool() const { return m_f; } - operator FILE*() const { return m_f; } - operator FILE**() { return &m_f; } + operator FILE *() const { return m_f; } + operator FILE **() { return &m_f; } + private: - FILE* m_f; + FILE *m_f; }; using std::filesystem::path; @@ -94,38 +107,39 @@ namespace test { // path functions assume they are called by a test executable // (calculate the requested path relative to the current executable path) - path path_of_test_bin(const path& relative = path()); - path path_of_test_temp(const path& relative = path()); - path path_of_test_fixtures(const path& relative = path()); - path path_of_usvfs_lib(const path& relative = path()); + path path_of_test_bin(const path &relative = path()); + path path_of_test_temp(const path &relative = path()); + path path_of_test_fixtures(const path &relative = path()); + path path_of_usvfs_lib(const path &relative = path()); - std::string platform_dependant_executable(const char* name, const char* ext = "exe", const char* platform = nullptr); + std::string platform_dependant_executable(const char *name, const char *ext = "exe", const char *platform = nullptr); // if full_path is a subfolder of base returns only the relative path, // if full_path and base are the same folder "." is returned, // otherwise full_path is returned unchanged - path path_as_relative(const path& base, const path& full_path); + path path_as_relative(const path &base, const path &full_path); - std::vector read_small_file(const path& file, bool binary = true); + std::vector read_small_file(const path &file, bool binary = true); // true iff the the contents of the two files is exactly the same - bool compare_files(const path& file1, const path& file2, bool binary = true); + bool compare_files(const path &file1, const path &file2, bool binary = true); // return true iff the given path is an empty (optionally true also if path doesn't exist) - bool is_empty_folder(const path& dpath, bool or_doesnt_exist = false); + bool is_empty_folder(const path &dpath, bool or_doesnt_exist = false); - void delete_file(const path& file); + void delete_file(const path &file); // Recursively deletes the given path and all the files and directories under it // Use with care!!! - void recursive_delete_files(const path& dpath); + void recursive_delete_files(const path &dpath); // Recursively copies all files and directories from srcPath to destPath - void recursive_copy_files(const path& src_path, const path& dest_path, bool overwrite); + void recursive_copy_files(const path &src_path, const path &dest_path, bool overwrite); - class ScopedLoadLibrary { + class ScopedLoadLibrary + { public: - ScopedLoadLibrary(const wchar_t* dll_path); + ScopedLoadLibrary(const wchar_t *dll_path); ~ScopedLoadLibrary(); // returns zero if load library failed @@ -135,5 +149,3 @@ namespace test { HMODULE m_mod; }; }; - -#endif diff --git a/test/tvfs_test/CMakeLists.txt b/test/tvfs_test/CMakeLists.txt new file mode 100644 index 0000000..4dfcf5b --- /dev/null +++ b/test/tvfs_test/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 3.16) + +find_package(GTest CONFIG REQUIRED) + +add_executable(tvfs_test main.cpp) +target_link_libraries(tvfs_test + PRIVATE test_utils usvfs_dll shared + GTest::gtest GTest::gtest_main) +target_link_options(tvfs_test PRIVATE "/DELAYLOAD:usvfs${ARCH_POSTFIX}.dll") +set_target_properties(tvfs_test + PROPERTIES + FOLDER tests + RUNTIME_OUTPUT_NAME tvfs_test${ARCH_POSTFIX} + RUNTIME_OUTPUT_DIRECTORY_DEBUG ${USVFS_TEST_BINDIR} + RUNTIME_OUTPUT_DIRECTORY_RELEASE ${USVFS_TEST_BINDIR} +) diff --git a/vcpkg.json b/vcpkg.json index 6be7f63..ac154a8 100644 --- a/vcpkg.json +++ b/vcpkg.json @@ -3,9 +3,7 @@ "asmjit", { "name": "spdlog", - "features": [ - "wchar" - ] + "features": ["wchar"] }, "libudis86", "boost-algorithm", @@ -21,11 +19,9 @@ "boost-predef" ], "features": { - "tests": { + "testing": { "description": "Build USVFS tests.", - "dependencies": [ - "gtest" - ] + "dependencies": ["gtest"] } } } From 010b6d6e90602e994b942481d4f60066c093b395 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mika=C3=ABl=20Capelle?= Date: Wed, 3 Jul 2024 20:48:21 +0200 Subject: [PATCH 05/20] Everything working? Maybe. --- CMakeLists.txt | 4 ++ src/shared/CMakeLists.txt | 3 +- src/usvfs_dll/CMakeLists.txt | 2 +- test/shared_test/CMakeLists.txt | 15 ++++++ test/test_utils/CMakeLists.txt | 2 +- test/thooklib_test/CMakeLists.txt | 17 ++++++ test/tinjectlib_test/CMakeLists.txt | 35 ++++++++++++ .../testinject_bin/main.cpp | 0 .../testinject_dll/main.cpp | 0 .../testinject_dll/main.h | 0 test/usvfs_test_runner/CMakeLists.txt | 53 +++++++++++++++++++ .../test_file_operations.cpp | 0 .../test_file_operations/test_filesystem.cpp | 0 .../test_file_operations/test_filesystem.h | 0 .../test_file_operations/test_ntapi.cpp | 0 .../test_file_operations/test_ntapi.h | 0 .../test_ntdll_declarations.h | 0 .../test_file_operations/test_w32api.cpp | 0 .../test_file_operations/test_w32api.h | 0 .../usvfs_test/usvfs_basic_test.cpp | 0 .../usvfs_test/usvfs_basic_test.h | 0 .../usvfs_test/usvfs_test.cpp | 0 .../usvfs_test/usvfs_test_base.cpp | 0 .../usvfs_test/usvfs_test_base.h | 0 24 files changed, 128 insertions(+), 3 deletions(-) create mode 100644 test/shared_test/CMakeLists.txt create mode 100644 test/thooklib_test/CMakeLists.txt create mode 100644 test/tinjectlib_test/CMakeLists.txt rename test/{ => tinjectlib_test}/testinject_bin/main.cpp (100%) rename test/{ => tinjectlib_test}/testinject_dll/main.cpp (100%) rename test/{ => tinjectlib_test}/testinject_dll/main.h (100%) create mode 100644 test/usvfs_test_runner/CMakeLists.txt rename test/{ => usvfs_test_runner}/test_file_operations/test_file_operations.cpp (100%) rename test/{ => usvfs_test_runner}/test_file_operations/test_filesystem.cpp (100%) rename test/{ => usvfs_test_runner}/test_file_operations/test_filesystem.h (100%) rename test/{ => usvfs_test_runner}/test_file_operations/test_ntapi.cpp (100%) rename test/{ => usvfs_test_runner}/test_file_operations/test_ntapi.h (100%) rename test/{ => usvfs_test_runner}/test_file_operations/test_ntdll_declarations.h (100%) rename test/{ => usvfs_test_runner}/test_file_operations/test_w32api.cpp (100%) rename test/{ => usvfs_test_runner}/test_file_operations/test_w32api.h (100%) rename test/{ => usvfs_test_runner}/usvfs_test/usvfs_basic_test.cpp (100%) rename test/{ => usvfs_test_runner}/usvfs_test/usvfs_basic_test.h (100%) rename test/{ => usvfs_test_runner}/usvfs_test/usvfs_test.cpp (100%) rename test/{ => usvfs_test_runner}/usvfs_test/usvfs_test_base.cpp (100%) rename test/{ => usvfs_test_runner}/usvfs_test/usvfs_test_base.h (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2b3964f..02e573c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,5 +31,9 @@ if (BUILD_USVFS_TESTS) enable_testing() set(USVFS_TEST_BINDIR ${CMAKE_CURRENT_LIST_DIR}/test/bin) add_subdirectory(test/test_utils) + add_subdirectory(test/shared_test) + add_subdirectory(test/thooklib_test) + add_subdirectory(test/tinjectlib_test) add_subdirectory(test/tvfs_test) + add_subdirectory(test/usvfs_test_runner) endif() diff --git a/src/shared/CMakeLists.txt b/src/shared/CMakeLists.txt index 7597c38..46dfa30 100644 --- a/src/shared/CMakeLists.txt +++ b/src/shared/CMakeLists.txt @@ -9,7 +9,8 @@ source_group("" FILES ${sources}) add_library(shared STATIC ${sources}) target_link_libraries(shared PUBLIC - Boost::algorithm Boost::interprocess Boost::filesystem spdlog::spdlog_header_only) + Boost::algorithm Boost::interprocess comsuppw + Boost::filesystem spdlog::spdlog_header_only) target_include_directories(shared PUBLIC ${PROJECT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}) target_precompile_headers(shared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/pch.h) diff --git a/src/usvfs_dll/CMakeLists.txt b/src/usvfs_dll/CMakeLists.txt index 1a1943d..62289ac 100644 --- a/src/usvfs_dll/CMakeLists.txt +++ b/src/usvfs_dll/CMakeLists.txt @@ -13,7 +13,7 @@ add_library(usvfs_dll SHARED ${sources} ${hooks}) target_link_libraries(usvfs_dll PUBLIC shared thooklib usvfs_helper Boost::thread spdlog::spdlog_header_only - Shlwapi comsuppw) + Shlwapi) target_include_directories(usvfs_dll PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) target_compile_definitions(usvfs_dll PRIVATE BUILDING_USVFS_DLL) set_target_properties(usvfs_dll diff --git a/test/shared_test/CMakeLists.txt b/test/shared_test/CMakeLists.txt new file mode 100644 index 0000000..ee35fa1 --- /dev/null +++ b/test/shared_test/CMakeLists.txt @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 3.16) + +find_package(GTest CONFIG REQUIRED) + +add_executable(shared_test main.cpp) +target_link_libraries(shared_test + PRIVATE test_utils shared + GTest::gtest GTest::gtest_main) +set_target_properties(shared_test + PROPERTIES + FOLDER tests + RUNTIME_OUTPUT_NAME shared_test${ARCH_POSTFIX} + RUNTIME_OUTPUT_DIRECTORY_DEBUG ${USVFS_TEST_BINDIR} + RUNTIME_OUTPUT_DIRECTORY_RELEASE ${USVFS_TEST_BINDIR} +) diff --git a/test/test_utils/CMakeLists.txt b/test/test_utils/CMakeLists.txt index b19e1af..95c605a 100644 --- a/test/test_utils/CMakeLists.txt +++ b/test/test_utils/CMakeLists.txt @@ -3,6 +3,6 @@ cmake_minimum_required(VERSION 3.16) find_package(GTest CONFIG REQUIRED) add_library(test_utils STATIC test_helpers.cpp test_helpers.h) -target_link_libraries(test_utils PRIVATE shared) +target_link_libraries(test_utils PUBLIC shared) target_include_directories(test_utils PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) set_target_properties(test_utils PROPERTIES FOLDER tests) diff --git a/test/thooklib_test/CMakeLists.txt b/test/thooklib_test/CMakeLists.txt new file mode 100644 index 0000000..39117c2 --- /dev/null +++ b/test/thooklib_test/CMakeLists.txt @@ -0,0 +1,17 @@ +cmake_minimum_required(VERSION 3.16) + +find_package(GTest CONFIG REQUIRED) +find_package(Boost CONFIG REQUIRED COMPONENTS thread) + +# not sure why there is a test_hooks.cpp here? +add_executable(thooklib_test main.cpp) +target_link_libraries(thooklib_test + PRIVATE test_utils shared thooklib Boost::thread + GTest::gtest GTest::gtest_main) +set_target_properties(thooklib_test + PROPERTIES + FOLDER tests + RUNTIME_OUTPUT_NAME thooklib_test${ARCH_POSTFIX} + RUNTIME_OUTPUT_DIRECTORY_DEBUG ${USVFS_TEST_BINDIR} + RUNTIME_OUTPUT_DIRECTORY_RELEASE ${USVFS_TEST_BINDIR} +) diff --git a/test/tinjectlib_test/CMakeLists.txt b/test/tinjectlib_test/CMakeLists.txt new file mode 100644 index 0000000..0e8bc30 --- /dev/null +++ b/test/tinjectlib_test/CMakeLists.txt @@ -0,0 +1,35 @@ +cmake_minimum_required(VERSION 3.16) + +find_package(GTest CONFIG REQUIRED) + +# binary and binary injected +add_executable(testinject_bin testinject_bin/main.cpp) +set_target_properties(testinject_bin + PROPERTIES + FOLDER tests/tinjectlib + RUNTIME_OUTPUT_NAME testinject_bin${ARCH_POSTFIX} + RUNTIME_OUTPUT_DIRECTORY_DEBUG ${USVFS_TEST_BINDIR} + RUNTIME_OUTPUT_DIRECTORY_RELEASE ${USVFS_TEST_BINDIR} +) + +add_library(testinject_dll SHARED testinject_dll/main.cpp testinject_dll/main.h) +set_target_properties(testinject_dll + PROPERTIES + FOLDER tests/tinjectlib + RUNTIME_OUTPUT_NAME testinject_dll${ARCH_POSTFIX} + RUNTIME_OUTPUT_DIRECTORY_DEBUG ${USVFS_TEST_BINDIR} + RUNTIME_OUTPUT_DIRECTORY_RELEASE ${USVFS_TEST_BINDIR} +) + +# actual test executable +add_executable(tinjectlib_test main.cpp) +target_link_libraries(tinjectlib_test + PRIVATE tinjectlib shared GTest::gtest GTest::gtest_main) +set_target_properties(tinjectlib_test + PROPERTIES + FOLDER tests/tinjectlib + RUNTIME_OUTPUT_NAME tinjectlib_test${ARCH_POSTFIX} + RUNTIME_OUTPUT_DIRECTORY_DEBUG ${USVFS_TEST_BINDIR} + RUNTIME_OUTPUT_DIRECTORY_RELEASE ${USVFS_TEST_BINDIR} +) +add_dependencies(tinjectlib_test testinject_bin testinject_dll) diff --git a/test/testinject_bin/main.cpp b/test/tinjectlib_test/testinject_bin/main.cpp similarity index 100% rename from test/testinject_bin/main.cpp rename to test/tinjectlib_test/testinject_bin/main.cpp diff --git a/test/testinject_dll/main.cpp b/test/tinjectlib_test/testinject_dll/main.cpp similarity index 100% rename from test/testinject_dll/main.cpp rename to test/tinjectlib_test/testinject_dll/main.cpp diff --git a/test/testinject_dll/main.h b/test/tinjectlib_test/testinject_dll/main.h similarity index 100% rename from test/testinject_dll/main.h rename to test/tinjectlib_test/testinject_dll/main.h diff --git a/test/usvfs_test_runner/CMakeLists.txt b/test/usvfs_test_runner/CMakeLists.txt new file mode 100644 index 0000000..ecd647a --- /dev/null +++ b/test/usvfs_test_runner/CMakeLists.txt @@ -0,0 +1,53 @@ +cmake_minimum_required(VERSION 3.16) + +find_package(GTest CONFIG REQUIRED) + +# other executables +add_executable(test_file_operations + test_file_operations/test_file_operations.cpp + test_file_operations/test_filesystem.cpp + test_file_operations/test_filesystem.h + test_file_operations/test_ntapi.cpp + test_file_operations/test_ntapi.h + test_file_operations/test_ntdll_declarations.h + test_file_operations/test_w32api.cpp + test_file_operations/test_w32api.h +) +target_link_libraries(test_file_operations PRIVATE test_utils ntdll) +set_target_properties(test_file_operations + PROPERTIES + FOLDER tests/usvfs_test_runner + RUNTIME_OUTPUT_NAME test_file_operations${ARCH_POSTFIX} + RUNTIME_OUTPUT_DIRECTORY_DEBUG ${USVFS_TEST_BINDIR} + RUNTIME_OUTPUT_DIRECTORY_RELEASE ${USVFS_TEST_BINDIR} +) + +add_executable(usvfs_test + usvfs_test/usvfs_basic_test.cpp + usvfs_test/usvfs_basic_test.h + usvfs_test/usvfs_test_base.cpp + usvfs_test/usvfs_test_base.h + usvfs_test/usvfs_test.cpp +) +target_link_libraries(usvfs_test PRIVATE test_utils usvfs_dll) +target_link_options(usvfs_test PRIVATE "/DELAYLOAD:usvfs${ARCH_POSTFIX}.dll") +set_target_properties(usvfs_test + PROPERTIES + FOLDER tests/usvfs_test_runner + RUNTIME_OUTPUT_NAME usvfs_test${ARCH_POSTFIX} + RUNTIME_OUTPUT_DIRECTORY_DEBUG ${USVFS_TEST_BINDIR} + RUNTIME_OUTPUT_DIRECTORY_RELEASE ${USVFS_TEST_BINDIR} +) + +# actual test executable +add_executable(usvfs_test_runner usvfs_test_runner.cpp) +target_link_libraries(usvfs_test_runner + PRIVATE test_utils GTest::gtest GTest::gtest_main) +set_target_properties(usvfs_test_runner + PROPERTIES + FOLDER tests/usvfs_test_runner + RUNTIME_OUTPUT_NAME usvfs_test_runner${ARCH_POSTFIX} + RUNTIME_OUTPUT_DIRECTORY_DEBUG ${USVFS_TEST_BINDIR} + RUNTIME_OUTPUT_DIRECTORY_RELEASE ${USVFS_TEST_BINDIR} +) +add_dependencies(usvfs_test_runner usvfs_test test_file_operations) diff --git a/test/test_file_operations/test_file_operations.cpp b/test/usvfs_test_runner/test_file_operations/test_file_operations.cpp similarity index 100% rename from test/test_file_operations/test_file_operations.cpp rename to test/usvfs_test_runner/test_file_operations/test_file_operations.cpp diff --git a/test/test_file_operations/test_filesystem.cpp b/test/usvfs_test_runner/test_file_operations/test_filesystem.cpp similarity index 100% rename from test/test_file_operations/test_filesystem.cpp rename to test/usvfs_test_runner/test_file_operations/test_filesystem.cpp diff --git a/test/test_file_operations/test_filesystem.h b/test/usvfs_test_runner/test_file_operations/test_filesystem.h similarity index 100% rename from test/test_file_operations/test_filesystem.h rename to test/usvfs_test_runner/test_file_operations/test_filesystem.h diff --git a/test/test_file_operations/test_ntapi.cpp b/test/usvfs_test_runner/test_file_operations/test_ntapi.cpp similarity index 100% rename from test/test_file_operations/test_ntapi.cpp rename to test/usvfs_test_runner/test_file_operations/test_ntapi.cpp diff --git a/test/test_file_operations/test_ntapi.h b/test/usvfs_test_runner/test_file_operations/test_ntapi.h similarity index 100% rename from test/test_file_operations/test_ntapi.h rename to test/usvfs_test_runner/test_file_operations/test_ntapi.h diff --git a/test/test_file_operations/test_ntdll_declarations.h b/test/usvfs_test_runner/test_file_operations/test_ntdll_declarations.h similarity index 100% rename from test/test_file_operations/test_ntdll_declarations.h rename to test/usvfs_test_runner/test_file_operations/test_ntdll_declarations.h diff --git a/test/test_file_operations/test_w32api.cpp b/test/usvfs_test_runner/test_file_operations/test_w32api.cpp similarity index 100% rename from test/test_file_operations/test_w32api.cpp rename to test/usvfs_test_runner/test_file_operations/test_w32api.cpp diff --git a/test/test_file_operations/test_w32api.h b/test/usvfs_test_runner/test_file_operations/test_w32api.h similarity index 100% rename from test/test_file_operations/test_w32api.h rename to test/usvfs_test_runner/test_file_operations/test_w32api.h diff --git a/test/usvfs_test/usvfs_basic_test.cpp b/test/usvfs_test_runner/usvfs_test/usvfs_basic_test.cpp similarity index 100% rename from test/usvfs_test/usvfs_basic_test.cpp rename to test/usvfs_test_runner/usvfs_test/usvfs_basic_test.cpp diff --git a/test/usvfs_test/usvfs_basic_test.h b/test/usvfs_test_runner/usvfs_test/usvfs_basic_test.h similarity index 100% rename from test/usvfs_test/usvfs_basic_test.h rename to test/usvfs_test_runner/usvfs_test/usvfs_basic_test.h diff --git a/test/usvfs_test/usvfs_test.cpp b/test/usvfs_test_runner/usvfs_test/usvfs_test.cpp similarity index 100% rename from test/usvfs_test/usvfs_test.cpp rename to test/usvfs_test_runner/usvfs_test/usvfs_test.cpp diff --git a/test/usvfs_test/usvfs_test_base.cpp b/test/usvfs_test_runner/usvfs_test/usvfs_test_base.cpp similarity index 100% rename from test/usvfs_test/usvfs_test_base.cpp rename to test/usvfs_test_runner/usvfs_test/usvfs_test_base.cpp diff --git a/test/usvfs_test/usvfs_test_base.h b/test/usvfs_test_runner/usvfs_test/usvfs_test_base.h similarity index 100% rename from test/usvfs_test/usvfs_test_base.h rename to test/usvfs_test_runner/usvfs_test/usvfs_test_base.h From 601450b123a0d01901a74f108a181da4aa2973bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mika=C3=ABl=20Capelle?= Date: Wed, 3 Jul 2024 20:51:54 +0200 Subject: [PATCH 06/20] Slight update to README (WIP). --- README.md | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index b23376c..16cca30 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,13 @@ # usvfs [![License](http://img.shields.io/:license-gpl-blue.svg)](http://www.gnu.org/licenses/gpl-3.0.en.html) -[![Build status](https://ci.appveyor.com/api/projects/status/rfc2xe8mo9775smo?svg=true)](https://ci.appveyor.com/project/Modorganizer2/usvfs) -[![Coverity Scan Build Status](https://scan.coverity.com/projects/8941/badge.svg)](https://scan.coverity.com/projects/8941) +[![Build status](https://github.com/github/docs/actions/workflows/build.yml/badge.svg)](https://github.com/ModOrganizer2/usvfs/actions) USVFS (short for User Space Virtual File System) aims to allow windows applications to create file or directory links that are visible to only a select set of processes. It does so by using api hooking to fool file access functions into discovering/opening files that are in fact somewhere else -# Comparison to symbolic links +## Comparison to symbolic links The following is based on the final goal for usvfs and doesn't necessary reflect the current development state. @@ -27,16 +26,29 @@ There are of course drawbacks - introduces a new source of bugs that can cause hard to diagnose problems in affected processes - may rub antivirus software the wrong way as the used techniques are similar to what some malware does. -# Current state +## Current state usvfs is work in progress and should be considered in alpha state. -It is a core component of Mod Organizer v2 and thus receives serious real world testing +It is a core component of Mod Organizer v2 +and thus receives serious real world testing -# License +## Building + +You will `cmake`, Python 3+ and `vcpkg` to build USVFS: + +```pwsh +cmake -B build32 -A Win32 "-DCMAKE_TOOLCHAIN_FILE=path\to\vcpkg\scripts\buildsystems\vcpkg.cmake" -DBUILD_USVFS_TESTS=TRUE +cmake --build build32 --config Release + +cmake -B build64 -A Win64 "-DCMAKE_TOOLCHAIN_FILE=path\to\vcpkg\scripts\buildsystems\vcpkg.cmake" -DBUILD_USVFS_TESTS=TRUE +cmake --build build64 --config Release +``` + +## License usvfs is currently licensed under the GPLv3 but this may change in the future. -# Contributing +## Contributing -Contributions are very welcome but please notice that since I'm still undecided on licensing I have to ask all contributors to agree -to future licensing changes. +Contributions are very welcome but please notice that since I'm still undecided on +licensing I have to ask all contributors to agree to future licensing changes. From a7f91b30bc25be19e0f14a54a0dbc762d85ecea1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mika=C3=ABl=20Capelle?= Date: Wed, 3 Jul 2024 21:05:15 +0200 Subject: [PATCH 07/20] Add tests for CTest. --- CMakeLists.txt | 7 +------ test/CMakeLists.txt | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 6 deletions(-) create mode 100644 test/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 02e573c..4d205d8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,10 +30,5 @@ add_subdirectory(src/usvfs_proxy) if (BUILD_USVFS_TESTS) enable_testing() set(USVFS_TEST_BINDIR ${CMAKE_CURRENT_LIST_DIR}/test/bin) - add_subdirectory(test/test_utils) - add_subdirectory(test/shared_test) - add_subdirectory(test/thooklib_test) - add_subdirectory(test/tinjectlib_test) - add_subdirectory(test/tvfs_test) - add_subdirectory(test/usvfs_test_runner) + add_subdirectory(test) endif() diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt new file mode 100644 index 0000000..9b3ecad --- /dev/null +++ b/test/CMakeLists.txt @@ -0,0 +1,34 @@ +cmake_minimum_required(VERSION 3.16) + +file(GLOB directories LIST_DIRECTORIES true "*") + +# this goes through all the directories and +# +# 1. add them if there is a CMakeLists.txt inside +# 2. add correspondings tests (for CTest) for BOTH x86 and x64 when possible +# +foreach(directory ${directories}) + if(NOT(IS_DIRECTORY ${directory})) + continue() + endif() + + if(NOT(EXISTS ${directory}/CMakeLists.txt)) + continue() + endif() + + add_subdirectory(${directory}) + + get_filename_component(dirname ${directory} NAME) + if(dirname STREQUAL "test_utils") + continue() + endif() + + add_test(NAME ${dirname}_x64 + COMMAND ${USVFS_TEST_BINDIR}/${dirname}_x64.exe + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + ) + add_test(NAME ${dirname}_x86 + COMMAND ${USVFS_TEST_BINDIR}/${dirname}_x86.exe + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + ) +endforeach() From 1d220339734128da42c5742d636475fda217845c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mika=C3=ABl=20Capelle?= Date: Thu, 4 Jul 2024 09:00:25 +0200 Subject: [PATCH 08/20] Fix targets for proper install. --- .gitignore | 2 + CMakeLists.txt | 9 +++++ include/{ => usvfs}/dllimport.h | 0 include/{ => usvfs}/logging.h | 0 include/{ => usvfs}/sharedparameters.h | 0 include/{ => usvfs}/usvfs.h | 0 include/{ => usvfs}/usvfs_version.h | 0 include/{ => usvfs}/usvfsparameters.h | 0 include/{ => usvfs}/usvfsparametersprivate.h | 0 src/shared/CMakeLists.txt | 3 +- src/thooklib/CMakeLists.txt | 2 +- src/tinjectlib/CMakeLists.txt | 6 +-- src/usvfs_dll/CMakeLists.txt | 40 +++++++++++++++++--- src/usvfs_dll/version.rc | 2 +- src/usvfs_helper/CMakeLists.txt | 9 ++--- src/usvfs_proxy/CMakeLists.txt | 5 ++- src/usvfs_proxy/version.rc | 2 +- test/CMakeLists.txt | 39 +++++++++++++++++++ test/shared_test/CMakeLists.txt | 13 ++----- test/test_utils/CMakeLists.txt | 3 +- test/thooklib_test/CMakeLists.txt | 9 +---- test/tinjectlib_test/CMakeLists.txt | 30 ++++----------- test/tvfs_test/CMakeLists.txt | 19 ++++------ test/usvfs_test_runner/CMakeLists.txt | 31 ++++----------- 24 files changed, 128 insertions(+), 96 deletions(-) rename include/{ => usvfs}/dllimport.h (100%) rename include/{ => usvfs}/logging.h (100%) rename include/{ => usvfs}/sharedparameters.h (100%) rename include/{ => usvfs}/usvfs.h (100%) rename include/{ => usvfs}/usvfs_version.h (100%) rename include/{ => usvfs}/usvfsparameters.h (100%) rename include/{ => usvfs}/usvfsparametersprivate.h (100%) diff --git a/.gitignore b/.gitignore index e9c54f6..20752e8 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,8 @@ /bin /lib /test/bin +/build* +/install # local overides /vsbuild/external_dependencies_local.props diff --git a/CMakeLists.txt b/CMakeLists.txt index 4d205d8..b2fc483 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,6 +18,15 @@ else() set(ARCH_POSTFIX _x64) endif() +#! usvfs_configure_target +# +# common configuration for all targets +# +function(usvfs_configure_target TARGET) + # TODO: wrap this in if() block + target_compile_options(${TARGET} PRIVATE "/MP") +endfunction() + add_subdirectory(src/shared) add_subdirectory(src/thooklib) diff --git a/include/dllimport.h b/include/usvfs/dllimport.h similarity index 100% rename from include/dllimport.h rename to include/usvfs/dllimport.h diff --git a/include/logging.h b/include/usvfs/logging.h similarity index 100% rename from include/logging.h rename to include/usvfs/logging.h diff --git a/include/sharedparameters.h b/include/usvfs/sharedparameters.h similarity index 100% rename from include/sharedparameters.h rename to include/usvfs/sharedparameters.h diff --git a/include/usvfs.h b/include/usvfs/usvfs.h similarity index 100% rename from include/usvfs.h rename to include/usvfs/usvfs.h diff --git a/include/usvfs_version.h b/include/usvfs/usvfs_version.h similarity index 100% rename from include/usvfs_version.h rename to include/usvfs/usvfs_version.h diff --git a/include/usvfsparameters.h b/include/usvfs/usvfsparameters.h similarity index 100% rename from include/usvfsparameters.h rename to include/usvfs/usvfsparameters.h diff --git a/include/usvfsparametersprivate.h b/include/usvfs/usvfsparametersprivate.h similarity index 100% rename from include/usvfsparametersprivate.h rename to include/usvfs/usvfsparametersprivate.h diff --git a/src/shared/CMakeLists.txt b/src/shared/CMakeLists.txt index 46dfa30..280befa 100644 --- a/src/shared/CMakeLists.txt +++ b/src/shared/CMakeLists.txt @@ -7,12 +7,13 @@ file(GLOB sources "*.cpp" "*.h") source_group("" FILES ${sources}) add_library(shared STATIC ${sources}) +usvfs_configure_target(shared) target_link_libraries(shared PUBLIC Boost::algorithm Boost::interprocess comsuppw Boost::filesystem spdlog::spdlog_header_only) target_include_directories(shared - PUBLIC ${PROJECT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}) + PUBLIC ${PROJECT_SOURCE_DIR}/include/usvfs ${CMAKE_CURRENT_SOURCE_DIR}) target_precompile_headers(shared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/pch.h) target_compile_options(shared PUBLIC /FI"pch.h") target_compile_definitions(shared PUBLIC diff --git a/src/thooklib/CMakeLists.txt b/src/thooklib/CMakeLists.txt index 9604f64..84d1e50 100644 --- a/src/thooklib/CMakeLists.txt +++ b/src/thooklib/CMakeLists.txt @@ -8,7 +8,7 @@ file(GLOB sources CONFIGURE_DEPENDS "*.cpp" "*.h") source_group("" FILES ${sources}) add_library(thooklib STATIC ${sources}) -message(STATUS "VCPKG_ROOT=${VCPKG_ROOT}") +usvfs_configure_target(thooklib) target_link_libraries(thooklib PRIVATE shared asmjit::asmjit ${LIBUDIS86_LIBRARY} spdlog::spdlog_header_only) target_include_directories(thooklib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) set_target_properties(thooklib PROPERTIES FOLDER injection) diff --git a/src/tinjectlib/CMakeLists.txt b/src/tinjectlib/CMakeLists.txt index 936f832..43ef79e 100644 --- a/src/tinjectlib/CMakeLists.txt +++ b/src/tinjectlib/CMakeLists.txt @@ -2,10 +2,8 @@ cmake_minimum_required(VERSION 3.16) find_package(asmjit CONFIG REQUIRED) -file(GLOB sources "*.cpp" "*.h") -source_group("" FILES ${sources}) - -add_library(tinjectlib STATIC ${sources}) +add_library(tinjectlib STATIC asmjit_sane.h injectlib.cpp injectlib.h) +usvfs_configure_target(tinjectlib) target_link_libraries(tinjectlib PRIVATE shared asmjit::asmjit) target_include_directories(tinjectlib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) set_target_properties(tinjectlib PROPERTIES FOLDER injection) diff --git a/src/usvfs_dll/CMakeLists.txt b/src/usvfs_dll/CMakeLists.txt index 62289ac..907510b 100644 --- a/src/usvfs_dll/CMakeLists.txt +++ b/src/usvfs_dll/CMakeLists.txt @@ -1,5 +1,7 @@ cmake_minimum_required(VERSION 3.16) +include(GNUInstallDirs) + find_package(Boost CONFIG REQUIRED COMPONENTS thread) find_package(spdlog CONFIG REQUIRED) @@ -9,18 +11,44 @@ source_group("" FILES ${sources}) file(GLOB hooks "hooks/*.cpp" "hooks/*.h") source_group("dlls" FILES ${hooks}) -add_library(usvfs_dll SHARED ${sources} ${hooks}) +add_library(usvfs_dll SHARED) +target_sources(usvfs_dll + PRIVATE + ${PROJECT_SOURCE_DIR}/include/usvfs/usvfsparametersprivate.h + ${sources} + ${hooks} + version.rc + PUBLIC + FILE_SET HEADERS + BASE_DIRS ${PROJECT_SOURCE_DIR}/include + FILES + ${PROJECT_SOURCE_DIR}/include/usvfs/dllimport.h + ${PROJECT_SOURCE_DIR}/include/usvfs/logging.h + ${PROJECT_SOURCE_DIR}/include/usvfs/sharedparameters.h + ${PROJECT_SOURCE_DIR}/include/usvfs/usvfs_version.h + ${PROJECT_SOURCE_DIR}/include/usvfs/usvfs.h + ${PROJECT_SOURCE_DIR}/include/usvfs/usvfsparameters.h +) +usvfs_configure_target(usvfs_dll) target_link_libraries(usvfs_dll - PUBLIC shared thooklib usvfs_helper + PRIVATE shared thooklib usvfs_helper Boost::thread spdlog::spdlog_header_only Shlwapi) -target_include_directories(usvfs_dll PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) target_compile_definitions(usvfs_dll PRIVATE BUILDING_USVFS_DLL) set_target_properties(usvfs_dll PROPERTIES + ARCHIVE_OUTPUT_NAME usvfs${ARCH_POSTFIX} + ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${USVFS_LIBDIR} + ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${USVFS_LIBDIR} + LIBRARY_OUTPUT_NAME usvfs${ARCH_POSTFIX} + LIBRARY_OUTPUT_DIRECTORY_DEBUG ${USVFS_LIBDIR} + LIBRARY_OUTPUT_DIRECTORY_RELEASE ${USVFS_LIBDIR} RUNTIME_OUTPUT_NAME usvfs${ARCH_POSTFIX} RUNTIME_OUTPUT_DIRECTORY_DEBUG ${USVFS_LIBDIR} - RUNTIME_OUTPUT_DIRECTORY_RELEASE ${USVFS_LIBDIR} -) + RUNTIME_OUTPUT_DIRECTORY_RELEASE ${USVFS_LIBDIR}) -add_library(usvfs_dll ALIAS usvfs_dll) +install(TARGETS usvfs_dll EXPORT usvfsTargets FILE_SET HEADERS) +install(EXPORT usvfsTargets + FILE usvfsTargets.cmake + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/usvfs +) diff --git a/src/usvfs_dll/version.rc b/src/usvfs_dll/version.rc index b06dd06..7dbf8e3 100644 --- a/src/usvfs_dll/version.rc +++ b/src/usvfs_dll/version.rc @@ -1,5 +1,5 @@ #include "Winver.h" -#include "..\..\include\usvfs_version.h" +#include "..\..\include\usvfs\usvfs_version.h" #define VER_FILEVERSION USVFS_VERSION_MAJOR,USVFS_VERSION_MINOR,USVFS_VERSION_BUILD,USVFS_VERSION_REVISION #define VER_FILEVERSION_STR USVFS_VERSION_STRING diff --git a/src/usvfs_helper/CMakeLists.txt b/src/usvfs_helper/CMakeLists.txt index e4458fb..28a43f2 100644 --- a/src/usvfs_helper/CMakeLists.txt +++ b/src/usvfs_helper/CMakeLists.txt @@ -1,10 +1,7 @@ cmake_minimum_required(VERSION 3.16) -file(GLOB sources "*.cpp" "*.h") -source_group("" FILES ${sources}) - -add_library(usvfs_helper STATIC ${sources}) -target_link_libraries(usvfs_helper PRIVATE shared tinjectlib) +add_library(usvfs_helper STATIC inject.h inject.cpp) +usvfs_configure_target(usvfs_helper) +target_link_libraries(usvfs_helper PUBLIC shared PRIVATE tinjectlib) target_include_directories(usvfs_helper PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) set_target_properties(usvfs_helper PROPERTIES FOLDER injection) -# target_precompile_headers(shared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../shared/pch.h) diff --git a/src/usvfs_proxy/CMakeLists.txt b/src/usvfs_proxy/CMakeLists.txt index eaac78f..6ce21c9 100644 --- a/src/usvfs_proxy/CMakeLists.txt +++ b/src/usvfs_proxy/CMakeLists.txt @@ -2,7 +2,8 @@ cmake_minimum_required(VERSION 3.16) find_package(Boost CONFIG REQUIRED COMPONENTS filesystem) -add_executable(usvfs_proxy main.cpp) +add_executable(usvfs_proxy main.cpp version.rc) +usvfs_configure_target(usvfs_proxy main.cpp) target_link_libraries(usvfs_proxy PRIVATE usvfs_dll shared usvfs_helper) set_target_properties(usvfs_proxy PROPERTIES @@ -10,3 +11,5 @@ set_target_properties(usvfs_proxy RUNTIME_OUTPUT_DIRECTORY_DEBUG ${USVFS_BINDIR} RUNTIME_OUTPUT_DIRECTORY_RELEASE ${USVFS_BINDIR} ) + +install(TARGETS usvfs_proxy) diff --git a/src/usvfs_proxy/version.rc b/src/usvfs_proxy/version.rc index e95c58c..03652c2 100644 --- a/src/usvfs_proxy/version.rc +++ b/src/usvfs_proxy/version.rc @@ -1,5 +1,5 @@ #include "Winver.h" -#include "..\..\include\usvfs_version.h" +#include "..\..\include\usvfs\usvfs_version.h" #define VER_FILEVERSION USVFS_VERSION_MAJOR,USVFS_VERSION_MINOR,USVFS_VERSION_BUILD,USVFS_VERSION_REVISION #define VER_FILEVERSION_STR USVFS_VERSION_STRING diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 9b3ecad..4314802 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,5 +1,44 @@ cmake_minimum_required(VERSION 3.16) +include(CMakeParseArguments) + +#! usvfs_set_test_properties +# +# this function sets the following properties on the given executable or shared +# library test target: +# - OUTPUT_NAME to add arch-specific prefix +# - OUTPUT_DIRECTORY to put the test executable or shared library in the right location +# - FOLDER to organize the VS solution layout +# +# \param:FOLDER if present, specifies the subfolder to use in the solution +# +function(usvfs_set_test_properties TARGET) + cmake_parse_arguments(USVFS_TEST "" "FOLDER" "" ${ARGN}) + if (NOT DEFINED USVFS_TEST_FOLDER) + set(folder "tests") + else() + set(folder "tests/${USVFS_TEST_FOLDER}") + endif() + set_target_properties(${TARGET} + PROPERTIES + FOLDER ${folder} + RUNTIME_OUTPUT_NAME ${TARGET}${ARCH_POSTFIX} + RUNTIME_OUTPUT_DIRECTORY_DEBUG ${USVFS_TEST_BINDIR} + RUNTIME_OUTPUT_DIRECTORY_RELEASE ${USVFS_TEST_BINDIR} + ) +endfunction() + +#! usvfs_target_link_usvfs +# +# add a target link between the given target and the usvfs shared library with delay +# loading +# +function(usvfs_target_link_usvfs TARGET) + target_link_libraries(${TARGET} PRIVATE usvfs_dll) + target_link_options(${TARGET} PRIVATE "/DELAYLOAD:usvfs${ARCH_POSTFIX}.dll") +endfunction() + + file(GLOB directories LIST_DIRECTORIES true "*") # this goes through all the directories and diff --git a/test/shared_test/CMakeLists.txt b/test/shared_test/CMakeLists.txt index ee35fa1..285c413 100644 --- a/test/shared_test/CMakeLists.txt +++ b/test/shared_test/CMakeLists.txt @@ -3,13 +3,6 @@ cmake_minimum_required(VERSION 3.16) find_package(GTest CONFIG REQUIRED) add_executable(shared_test main.cpp) -target_link_libraries(shared_test - PRIVATE test_utils shared - GTest::gtest GTest::gtest_main) -set_target_properties(shared_test - PROPERTIES - FOLDER tests - RUNTIME_OUTPUT_NAME shared_test${ARCH_POSTFIX} - RUNTIME_OUTPUT_DIRECTORY_DEBUG ${USVFS_TEST_BINDIR} - RUNTIME_OUTPUT_DIRECTORY_RELEASE ${USVFS_TEST_BINDIR} -) +usvfs_configure_target(shared_test) +usvfs_set_test_properties(shared_test) +target_link_libraries(shared_test PRIVATE test_utils GTest::gtest GTest::gtest_main) diff --git a/test/test_utils/CMakeLists.txt b/test/test_utils/CMakeLists.txt index 95c605a..b88b2b7 100644 --- a/test/test_utils/CMakeLists.txt +++ b/test/test_utils/CMakeLists.txt @@ -3,6 +3,7 @@ cmake_minimum_required(VERSION 3.16) find_package(GTest CONFIG REQUIRED) add_library(test_utils STATIC test_helpers.cpp test_helpers.h) +usvfs_configure_target(test_utils) +set_target_properties(test_utils PROPERTIES FOLDER tests) target_link_libraries(test_utils PUBLIC shared) target_include_directories(test_utils PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -set_target_properties(test_utils PROPERTIES FOLDER tests) diff --git a/test/thooklib_test/CMakeLists.txt b/test/thooklib_test/CMakeLists.txt index 39117c2..7b93c92 100644 --- a/test/thooklib_test/CMakeLists.txt +++ b/test/thooklib_test/CMakeLists.txt @@ -5,13 +5,8 @@ find_package(Boost CONFIG REQUIRED COMPONENTS thread) # not sure why there is a test_hooks.cpp here? add_executable(thooklib_test main.cpp) +usvfs_configure_target(thooklib_test) +usvfs_set_test_properties(thooklib_test) target_link_libraries(thooklib_test PRIVATE test_utils shared thooklib Boost::thread GTest::gtest GTest::gtest_main) -set_target_properties(thooklib_test - PROPERTIES - FOLDER tests - RUNTIME_OUTPUT_NAME thooklib_test${ARCH_POSTFIX} - RUNTIME_OUTPUT_DIRECTORY_DEBUG ${USVFS_TEST_BINDIR} - RUNTIME_OUTPUT_DIRECTORY_RELEASE ${USVFS_TEST_BINDIR} -) diff --git a/test/tinjectlib_test/CMakeLists.txt b/test/tinjectlib_test/CMakeLists.txt index 0e8bc30..586127e 100644 --- a/test/tinjectlib_test/CMakeLists.txt +++ b/test/tinjectlib_test/CMakeLists.txt @@ -4,32 +4,16 @@ find_package(GTest CONFIG REQUIRED) # binary and binary injected add_executable(testinject_bin testinject_bin/main.cpp) -set_target_properties(testinject_bin - PROPERTIES - FOLDER tests/tinjectlib - RUNTIME_OUTPUT_NAME testinject_bin${ARCH_POSTFIX} - RUNTIME_OUTPUT_DIRECTORY_DEBUG ${USVFS_TEST_BINDIR} - RUNTIME_OUTPUT_DIRECTORY_RELEASE ${USVFS_TEST_BINDIR} -) +usvfs_configure_target(testinject_bin) +usvfs_set_test_properties(testinject_bin FOLDER tinjectlib) add_library(testinject_dll SHARED testinject_dll/main.cpp testinject_dll/main.h) -set_target_properties(testinject_dll - PROPERTIES - FOLDER tests/tinjectlib - RUNTIME_OUTPUT_NAME testinject_dll${ARCH_POSTFIX} - RUNTIME_OUTPUT_DIRECTORY_DEBUG ${USVFS_TEST_BINDIR} - RUNTIME_OUTPUT_DIRECTORY_RELEASE ${USVFS_TEST_BINDIR} -) +usvfs_configure_target(testinject_dll) +usvfs_set_test_properties(testinject_dll FOLDER tinjectlib) # actual test executable add_executable(tinjectlib_test main.cpp) -target_link_libraries(tinjectlib_test - PRIVATE tinjectlib shared GTest::gtest GTest::gtest_main) -set_target_properties(tinjectlib_test - PROPERTIES - FOLDER tests/tinjectlib - RUNTIME_OUTPUT_NAME tinjectlib_test${ARCH_POSTFIX} - RUNTIME_OUTPUT_DIRECTORY_DEBUG ${USVFS_TEST_BINDIR} - RUNTIME_OUTPUT_DIRECTORY_RELEASE ${USVFS_TEST_BINDIR} -) +usvfs_configure_target(tinjectlib_test) +usvfs_set_test_properties(tinjectlib_test FOLDER tinjectlib) +target_link_libraries(tinjectlib_test PRIVATE tinjectlib shared GTest::gtest GTest::gtest_main) add_dependencies(tinjectlib_test testinject_bin testinject_dll) diff --git a/test/tvfs_test/CMakeLists.txt b/test/tvfs_test/CMakeLists.txt index 4dfcf5b..2e94c7f 100644 --- a/test/tvfs_test/CMakeLists.txt +++ b/test/tvfs_test/CMakeLists.txt @@ -3,14 +3,11 @@ cmake_minimum_required(VERSION 3.16) find_package(GTest CONFIG REQUIRED) add_executable(tvfs_test main.cpp) -target_link_libraries(tvfs_test - PRIVATE test_utils usvfs_dll shared - GTest::gtest GTest::gtest_main) -target_link_options(tvfs_test PRIVATE "/DELAYLOAD:usvfs${ARCH_POSTFIX}.dll") -set_target_properties(tvfs_test - PROPERTIES - FOLDER tests - RUNTIME_OUTPUT_NAME tvfs_test${ARCH_POSTFIX} - RUNTIME_OUTPUT_DIRECTORY_DEBUG ${USVFS_TEST_BINDIR} - RUNTIME_OUTPUT_DIRECTORY_RELEASE ${USVFS_TEST_BINDIR} -) +usvfs_configure_target(tvfs_test) +usvfs_set_test_properties(tvfs_test) +target_link_libraries(tvfs_test PRIVATE test_utils usvfs_helper GTest::gtest GTest::gtest_main) +usvfs_target_link_usvfs(tvfs_test) + +# tvfs_test uses a private USVFS header so we need to include it manually +get_target_property(USVFS_SOURCE_DIR usvfs_dll SOURCE_DIR) +target_include_directories(tvfs_test PRIVATE ${USVFS_SOURCE_DIR}) diff --git a/test/usvfs_test_runner/CMakeLists.txt b/test/usvfs_test_runner/CMakeLists.txt index ecd647a..38d60d5 100644 --- a/test/usvfs_test_runner/CMakeLists.txt +++ b/test/usvfs_test_runner/CMakeLists.txt @@ -13,14 +13,9 @@ add_executable(test_file_operations test_file_operations/test_w32api.cpp test_file_operations/test_w32api.h ) +usvfs_configure_target(test_file_operations) +usvfs_set_test_properties(test_file_operations FOLDER usvfs_test_runner) target_link_libraries(test_file_operations PRIVATE test_utils ntdll) -set_target_properties(test_file_operations - PROPERTIES - FOLDER tests/usvfs_test_runner - RUNTIME_OUTPUT_NAME test_file_operations${ARCH_POSTFIX} - RUNTIME_OUTPUT_DIRECTORY_DEBUG ${USVFS_TEST_BINDIR} - RUNTIME_OUTPUT_DIRECTORY_RELEASE ${USVFS_TEST_BINDIR} -) add_executable(usvfs_test usvfs_test/usvfs_basic_test.cpp @@ -29,25 +24,15 @@ add_executable(usvfs_test usvfs_test/usvfs_test_base.h usvfs_test/usvfs_test.cpp ) -target_link_libraries(usvfs_test PRIVATE test_utils usvfs_dll) -target_link_options(usvfs_test PRIVATE "/DELAYLOAD:usvfs${ARCH_POSTFIX}.dll") -set_target_properties(usvfs_test - PROPERTIES - FOLDER tests/usvfs_test_runner - RUNTIME_OUTPUT_NAME usvfs_test${ARCH_POSTFIX} - RUNTIME_OUTPUT_DIRECTORY_DEBUG ${USVFS_TEST_BINDIR} - RUNTIME_OUTPUT_DIRECTORY_RELEASE ${USVFS_TEST_BINDIR} -) +usvfs_configure_target(usvfs_test) +usvfs_set_test_properties(usvfs_test FOLDER usvfs_test_runner) +usvfs_target_link_usvfs(usvfs_test) +target_link_libraries(usvfs_test PRIVATE test_utils) # actual test executable add_executable(usvfs_test_runner usvfs_test_runner.cpp) +usvfs_configure_target(usvfs_test_runner) +usvfs_set_test_properties(usvfs_test_runner FOLDER usvfs_test_runner) target_link_libraries(usvfs_test_runner PRIVATE test_utils GTest::gtest GTest::gtest_main) -set_target_properties(usvfs_test_runner - PROPERTIES - FOLDER tests/usvfs_test_runner - RUNTIME_OUTPUT_NAME usvfs_test_runner${ARCH_POSTFIX} - RUNTIME_OUTPUT_DIRECTORY_DEBUG ${USVFS_TEST_BINDIR} - RUNTIME_OUTPUT_DIRECTORY_RELEASE ${USVFS_TEST_BINDIR} -) add_dependencies(usvfs_test_runner usvfs_test test_file_operations) From 3b9420f950f128eb25599ae33ba3163f7c9129fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mika=C3=ABl=20Capelle?= Date: Thu, 4 Jul 2024 09:59:34 +0200 Subject: [PATCH 09/20] Differentiate x86 and x64 targets for USVFS. --- src/usvfs_dll/CMakeLists.txt | 7 ++++--- src/usvfs_proxy/CMakeLists.txt | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/usvfs_dll/CMakeLists.txt b/src/usvfs_dll/CMakeLists.txt index 907510b..8a0ff4f 100644 --- a/src/usvfs_dll/CMakeLists.txt +++ b/src/usvfs_dll/CMakeLists.txt @@ -47,8 +47,9 @@ set_target_properties(usvfs_dll RUNTIME_OUTPUT_DIRECTORY_DEBUG ${USVFS_LIBDIR} RUNTIME_OUTPUT_DIRECTORY_RELEASE ${USVFS_LIBDIR}) -install(TARGETS usvfs_dll EXPORT usvfsTargets FILE_SET HEADERS) -install(EXPORT usvfsTargets - FILE usvfsTargets.cmake +install(TARGETS usvfs_dll EXPORT usvfs${ARCH_POSTFIX}Targets FILE_SET HEADERS) +install(EXPORT usvfs${ARCH_POSTFIX}Targets + FILE usvfs${ARCH_POSTFIX}Targets.cmake + NAMESPACE usvfs${ARCH_POSTFIX}:: DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/usvfs ) diff --git a/src/usvfs_proxy/CMakeLists.txt b/src/usvfs_proxy/CMakeLists.txt index 6ce21c9..d7abf22 100644 --- a/src/usvfs_proxy/CMakeLists.txt +++ b/src/usvfs_proxy/CMakeLists.txt @@ -12,4 +12,4 @@ set_target_properties(usvfs_proxy RUNTIME_OUTPUT_DIRECTORY_RELEASE ${USVFS_BINDIR} ) -install(TARGETS usvfs_proxy) +install(TARGETS usvfs_proxy EXPORT usvfs${ARCH_POSTFIX}Targets) From d63150487226f38561a567689b6fd88e1c9075e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mika=C3=ABl=20Capelle?= Date: Thu, 4 Jul 2024 13:01:43 +0200 Subject: [PATCH 10/20] Add CMake preset. --- .gitignore | 1 + CMakeLists.txt | 15 +-- CMakePresets.json | 117 ++++++++++++++++++ .../ports/asmjit}/asmjit.patch | 0 .../ports/asmjit}/portfile.cmake | 0 .../fb9f82c => cmake/ports/asmjit}/vcpkg.json | 0 src/shared/CMakeLists.txt | 1 - src/thooklib/CMakeLists.txt | 1 - src/tinjectlib/CMakeLists.txt | 1 - src/usvfs_dll/CMakeLists.txt | 1 - src/usvfs_helper/CMakeLists.txt | 1 - src/usvfs_proxy/CMakeLists.txt | 1 - test/shared_test/CMakeLists.txt | 1 - test/test_utils/CMakeLists.txt | 1 - test/thooklib_test/CMakeLists.txt | 1 - test/tinjectlib_test/CMakeLists.txt | 3 - test/tvfs_test/CMakeLists.txt | 1 - test/usvfs_test_runner/CMakeLists.txt | 3 - vcpkg-configuration.json | 27 ---- vcpkg-registry/versions/a-/asmjit.json | 8 -- vcpkg-registry/versions/baseline.json | 8 -- vcpkg-triplets/x64-windows.cmake | 3 - vcpkg-triplets/x86-windows.cmake | 3 - vcpkg.json | 1 + 24 files changed, 120 insertions(+), 79 deletions(-) create mode 100644 CMakePresets.json rename {vcpkg-registry/ports/asmjit/fb9f82c => cmake/ports/asmjit}/asmjit.patch (100%) rename {vcpkg-registry/ports/asmjit/fb9f82c => cmake/ports/asmjit}/portfile.cmake (100%) rename {vcpkg-registry/ports/asmjit/fb9f82c => cmake/ports/asmjit}/vcpkg.json (100%) delete mode 100644 vcpkg-configuration.json delete mode 100644 vcpkg-registry/versions/a-/asmjit.json delete mode 100644 vcpkg-registry/versions/baseline.json delete mode 100644 vcpkg-triplets/x64-windows.cmake delete mode 100644 vcpkg-triplets/x86-windows.cmake diff --git a/.gitignore b/.gitignore index 20752e8..3d8da0b 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ /vsbuild/ReleaseTest /vsbuild/Debug /vsbuild/DebugTest +CMakeUserPresets.json # test "side effects" /test/temp diff --git a/CMakeLists.txt b/CMakeLists.txt index b2fc483..7a03764 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,9 +1,5 @@ cmake_minimum_required(VERSION 3.16) -if (BUILD_USVFS_TESTS) - list(APPEND VCPKG_MANIFEST_FEATURES "testing") -endif() - project(usvfs) set_property(GLOBAL PROPERTY USE_FOLDERS ON) @@ -18,15 +14,6 @@ else() set(ARCH_POSTFIX _x64) endif() -#! usvfs_configure_target -# -# common configuration for all targets -# -function(usvfs_configure_target TARGET) - # TODO: wrap this in if() block - target_compile_options(${TARGET} PRIVATE "/MP") -endfunction() - add_subdirectory(src/shared) add_subdirectory(src/thooklib) @@ -36,7 +23,7 @@ add_subdirectory(src/usvfs_helper) add_subdirectory(src/usvfs_dll) add_subdirectory(src/usvfs_proxy) -if (BUILD_USVFS_TESTS) +if (BUILD_TESTING) enable_testing() set(USVFS_TEST_BINDIR ${CMAKE_CURRENT_LIST_DIR}/test/bin) add_subdirectory(test) diff --git a/CMakePresets.json b/CMakePresets.json new file mode 100644 index 0000000..0829c08 --- /dev/null +++ b/CMakePresets.json @@ -0,0 +1,117 @@ +{ + "configurePresets": [ + { + "cacheVariables": { + "BUILD_TESTING": { + "type": "BOOL", + "value": "ON" + } + }, + "errors": { + "deprecated": true + }, + "hidden": true, + "name": "cmake-dev", + "warnings": { + "deprecated": true, + "dev": true + } + }, + { + "cacheVariables": { + "VCPKG_MANIFEST_NO_DEFAULT_FEATURES": { + "type": "BOOL", + "value": "ON" + }, + "VCPKG_OVERLAY_PORTS": { + "type": "STRING", + "value": "${sourceDir}/cmake/ports" + } + }, + "toolchainFile": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake", + "hidden": true, + "name": "vcpkg" + }, + { + "cacheVariables": { + "VCPKG_MANIFEST_FEATURES": { + "type": "STRING", + "value": "testing" + } + }, + "hidden": true, + "inherits": [ + "vcpkg" + ], + "name": "vcpkg-dev" + }, + { + "binaryDir": "${sourceDir}/cbuild64", + "architecture": { + "strategy": "set", + "value": "x64" + }, + "cacheVariables": { + "VCPKG_TARGET_TRIPLET": { + "type": "STRING", + "value": "x64-windows-static-md" + } + }, + "hidden": true, + "name": "windows-x64" + }, + { + "binaryDir": "${sourceDir}/cbuild32", + "architecture": { + "strategy": "set", + "value": "Win32" + }, + "cacheVariables": { + "VCPKG_TARGET_TRIPLET": { + "type": "STRING", + "value": "x86-windows-static-md" + } + }, + "hidden": true, + "name": "windows-x86" + }, + { + "cacheVariables": { + "CMAKE_CXX_FLAGS": "/EHsc /MP /W4" + }, + "generator": "Visual Studio 17 2022", + "inherits": [ + "cmake-dev", + "vcpkg-dev" + ], + "hidden": true, + "name": "vs2022-windows", + "toolset": "v143" + }, + { + "inherits": [ + "vs2022-windows", + "windows-x64" + ], + "name": "vs2022-windows-x64" + }, + { + "inherits": [ + "vs2022-windows", + "windows-x86" + ], + "name": "vs2022-windows-x86" + } + ], + "buildPresets": [ + { + "name": "vs2022-windows-x64", + "configurePreset": "vs2022-windows-x64" + }, + { + "name": "vs2022-windows-x86", + "configurePreset": "vs2022-windows-x86" + } + ], + "version": 3 +} diff --git a/vcpkg-registry/ports/asmjit/fb9f82c/asmjit.patch b/cmake/ports/asmjit/asmjit.patch similarity index 100% rename from vcpkg-registry/ports/asmjit/fb9f82c/asmjit.patch rename to cmake/ports/asmjit/asmjit.patch diff --git a/vcpkg-registry/ports/asmjit/fb9f82c/portfile.cmake b/cmake/ports/asmjit/portfile.cmake similarity index 100% rename from vcpkg-registry/ports/asmjit/fb9f82c/portfile.cmake rename to cmake/ports/asmjit/portfile.cmake diff --git a/vcpkg-registry/ports/asmjit/fb9f82c/vcpkg.json b/cmake/ports/asmjit/vcpkg.json similarity index 100% rename from vcpkg-registry/ports/asmjit/fb9f82c/vcpkg.json rename to cmake/ports/asmjit/vcpkg.json diff --git a/src/shared/CMakeLists.txt b/src/shared/CMakeLists.txt index 280befa..c62a0d4 100644 --- a/src/shared/CMakeLists.txt +++ b/src/shared/CMakeLists.txt @@ -7,7 +7,6 @@ file(GLOB sources "*.cpp" "*.h") source_group("" FILES ${sources}) add_library(shared STATIC ${sources}) -usvfs_configure_target(shared) target_link_libraries(shared PUBLIC Boost::algorithm Boost::interprocess comsuppw diff --git a/src/thooklib/CMakeLists.txt b/src/thooklib/CMakeLists.txt index 84d1e50..48426db 100644 --- a/src/thooklib/CMakeLists.txt +++ b/src/thooklib/CMakeLists.txt @@ -8,7 +8,6 @@ file(GLOB sources CONFIGURE_DEPENDS "*.cpp" "*.h") source_group("" FILES ${sources}) add_library(thooklib STATIC ${sources}) -usvfs_configure_target(thooklib) target_link_libraries(thooklib PRIVATE shared asmjit::asmjit ${LIBUDIS86_LIBRARY} spdlog::spdlog_header_only) target_include_directories(thooklib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) set_target_properties(thooklib PROPERTIES FOLDER injection) diff --git a/src/tinjectlib/CMakeLists.txt b/src/tinjectlib/CMakeLists.txt index 43ef79e..096608e 100644 --- a/src/tinjectlib/CMakeLists.txt +++ b/src/tinjectlib/CMakeLists.txt @@ -3,7 +3,6 @@ cmake_minimum_required(VERSION 3.16) find_package(asmjit CONFIG REQUIRED) add_library(tinjectlib STATIC asmjit_sane.h injectlib.cpp injectlib.h) -usvfs_configure_target(tinjectlib) target_link_libraries(tinjectlib PRIVATE shared asmjit::asmjit) target_include_directories(tinjectlib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) set_target_properties(tinjectlib PROPERTIES FOLDER injection) diff --git a/src/usvfs_dll/CMakeLists.txt b/src/usvfs_dll/CMakeLists.txt index 8a0ff4f..624874f 100644 --- a/src/usvfs_dll/CMakeLists.txt +++ b/src/usvfs_dll/CMakeLists.txt @@ -29,7 +29,6 @@ target_sources(usvfs_dll ${PROJECT_SOURCE_DIR}/include/usvfs/usvfs.h ${PROJECT_SOURCE_DIR}/include/usvfs/usvfsparameters.h ) -usvfs_configure_target(usvfs_dll) target_link_libraries(usvfs_dll PRIVATE shared thooklib usvfs_helper Boost::thread spdlog::spdlog_header_only diff --git a/src/usvfs_helper/CMakeLists.txt b/src/usvfs_helper/CMakeLists.txt index 28a43f2..5e083d9 100644 --- a/src/usvfs_helper/CMakeLists.txt +++ b/src/usvfs_helper/CMakeLists.txt @@ -1,7 +1,6 @@ cmake_minimum_required(VERSION 3.16) add_library(usvfs_helper STATIC inject.h inject.cpp) -usvfs_configure_target(usvfs_helper) target_link_libraries(usvfs_helper PUBLIC shared PRIVATE tinjectlib) target_include_directories(usvfs_helper PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) set_target_properties(usvfs_helper PROPERTIES FOLDER injection) diff --git a/src/usvfs_proxy/CMakeLists.txt b/src/usvfs_proxy/CMakeLists.txt index d7abf22..ffa9058 100644 --- a/src/usvfs_proxy/CMakeLists.txt +++ b/src/usvfs_proxy/CMakeLists.txt @@ -3,7 +3,6 @@ cmake_minimum_required(VERSION 3.16) find_package(Boost CONFIG REQUIRED COMPONENTS filesystem) add_executable(usvfs_proxy main.cpp version.rc) -usvfs_configure_target(usvfs_proxy main.cpp) target_link_libraries(usvfs_proxy PRIVATE usvfs_dll shared usvfs_helper) set_target_properties(usvfs_proxy PROPERTIES diff --git a/test/shared_test/CMakeLists.txt b/test/shared_test/CMakeLists.txt index 285c413..c5a42ea 100644 --- a/test/shared_test/CMakeLists.txt +++ b/test/shared_test/CMakeLists.txt @@ -3,6 +3,5 @@ cmake_minimum_required(VERSION 3.16) find_package(GTest CONFIG REQUIRED) add_executable(shared_test main.cpp) -usvfs_configure_target(shared_test) usvfs_set_test_properties(shared_test) target_link_libraries(shared_test PRIVATE test_utils GTest::gtest GTest::gtest_main) diff --git a/test/test_utils/CMakeLists.txt b/test/test_utils/CMakeLists.txt index b88b2b7..cdb86d9 100644 --- a/test/test_utils/CMakeLists.txt +++ b/test/test_utils/CMakeLists.txt @@ -3,7 +3,6 @@ cmake_minimum_required(VERSION 3.16) find_package(GTest CONFIG REQUIRED) add_library(test_utils STATIC test_helpers.cpp test_helpers.h) -usvfs_configure_target(test_utils) set_target_properties(test_utils PROPERTIES FOLDER tests) target_link_libraries(test_utils PUBLIC shared) target_include_directories(test_utils PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/test/thooklib_test/CMakeLists.txt b/test/thooklib_test/CMakeLists.txt index 7b93c92..cca9e10 100644 --- a/test/thooklib_test/CMakeLists.txt +++ b/test/thooklib_test/CMakeLists.txt @@ -5,7 +5,6 @@ find_package(Boost CONFIG REQUIRED COMPONENTS thread) # not sure why there is a test_hooks.cpp here? add_executable(thooklib_test main.cpp) -usvfs_configure_target(thooklib_test) usvfs_set_test_properties(thooklib_test) target_link_libraries(thooklib_test PRIVATE test_utils shared thooklib Boost::thread diff --git a/test/tinjectlib_test/CMakeLists.txt b/test/tinjectlib_test/CMakeLists.txt index 586127e..9bd3f7b 100644 --- a/test/tinjectlib_test/CMakeLists.txt +++ b/test/tinjectlib_test/CMakeLists.txt @@ -4,16 +4,13 @@ find_package(GTest CONFIG REQUIRED) # binary and binary injected add_executable(testinject_bin testinject_bin/main.cpp) -usvfs_configure_target(testinject_bin) usvfs_set_test_properties(testinject_bin FOLDER tinjectlib) add_library(testinject_dll SHARED testinject_dll/main.cpp testinject_dll/main.h) -usvfs_configure_target(testinject_dll) usvfs_set_test_properties(testinject_dll FOLDER tinjectlib) # actual test executable add_executable(tinjectlib_test main.cpp) -usvfs_configure_target(tinjectlib_test) usvfs_set_test_properties(tinjectlib_test FOLDER tinjectlib) target_link_libraries(tinjectlib_test PRIVATE tinjectlib shared GTest::gtest GTest::gtest_main) add_dependencies(tinjectlib_test testinject_bin testinject_dll) diff --git a/test/tvfs_test/CMakeLists.txt b/test/tvfs_test/CMakeLists.txt index 2e94c7f..76a5306 100644 --- a/test/tvfs_test/CMakeLists.txt +++ b/test/tvfs_test/CMakeLists.txt @@ -3,7 +3,6 @@ cmake_minimum_required(VERSION 3.16) find_package(GTest CONFIG REQUIRED) add_executable(tvfs_test main.cpp) -usvfs_configure_target(tvfs_test) usvfs_set_test_properties(tvfs_test) target_link_libraries(tvfs_test PRIVATE test_utils usvfs_helper GTest::gtest GTest::gtest_main) usvfs_target_link_usvfs(tvfs_test) diff --git a/test/usvfs_test_runner/CMakeLists.txt b/test/usvfs_test_runner/CMakeLists.txt index 38d60d5..a0a7ca9 100644 --- a/test/usvfs_test_runner/CMakeLists.txt +++ b/test/usvfs_test_runner/CMakeLists.txt @@ -13,7 +13,6 @@ add_executable(test_file_operations test_file_operations/test_w32api.cpp test_file_operations/test_w32api.h ) -usvfs_configure_target(test_file_operations) usvfs_set_test_properties(test_file_operations FOLDER usvfs_test_runner) target_link_libraries(test_file_operations PRIVATE test_utils ntdll) @@ -24,14 +23,12 @@ add_executable(usvfs_test usvfs_test/usvfs_test_base.h usvfs_test/usvfs_test.cpp ) -usvfs_configure_target(usvfs_test) usvfs_set_test_properties(usvfs_test FOLDER usvfs_test_runner) usvfs_target_link_usvfs(usvfs_test) target_link_libraries(usvfs_test PRIVATE test_utils) # actual test executable add_executable(usvfs_test_runner usvfs_test_runner.cpp) -usvfs_configure_target(usvfs_test_runner) usvfs_set_test_properties(usvfs_test_runner FOLDER usvfs_test_runner) target_link_libraries(usvfs_test_runner PRIVATE test_utils GTest::gtest GTest::gtest_main) diff --git a/vcpkg-configuration.json b/vcpkg-configuration.json deleted file mode 100644 index 50bc428..0000000 --- a/vcpkg-configuration.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "default-registry": { - "kind": "git", - "repository": "https://github.com/Microsoft/vcpkg", - "baseline": "f61a294e765b257926ae9e9d85f96468a0af74e7" - }, - "registries": [ - { - "kind": "git", - "repository": "https://github.com/Microsoft/vcpkg", - "baseline": "f61a294e765b257926ae9e9d85f96468a0af74e7", - "packages": [ - "boost*", - "boost-*" - ] - }, - { - "kind": "filesystem", - "baseline": "asmjit-fb9f82c", - "path": "./vcpkg-registry", - "packages": [ "asmjit" ] - } - ], - "overlay-triplets": [ - "./vcpkg-triplets" - ] -} diff --git a/vcpkg-registry/versions/a-/asmjit.json b/vcpkg-registry/versions/a-/asmjit.json deleted file mode 100644 index 7dbaf92..0000000 --- a/vcpkg-registry/versions/a-/asmjit.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "versions": [ - { - "version-string": "fb9f82c", - "path": "$/ports/asmjit/fb9f82c" - } - ] -} diff --git a/vcpkg-registry/versions/baseline.json b/vcpkg-registry/versions/baseline.json deleted file mode 100644 index f5cd36a..0000000 --- a/vcpkg-registry/versions/baseline.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "asmjit-fb9f82c": { - "asmjit": { - "baseline": "fb9f82c", - "port-version": 0 - } - } -} diff --git a/vcpkg-triplets/x64-windows.cmake b/vcpkg-triplets/x64-windows.cmake deleted file mode 100644 index 63d6cde..0000000 --- a/vcpkg-triplets/x64-windows.cmake +++ /dev/null @@ -1,3 +0,0 @@ -set(VCPKG_TARGET_ARCHITECTURE x64) -set(VCPKG_CRT_LINKAGE dynamic) -set(VCPKG_LIBRARY_LINKAGE static) diff --git a/vcpkg-triplets/x86-windows.cmake b/vcpkg-triplets/x86-windows.cmake deleted file mode 100644 index 2496b16..0000000 --- a/vcpkg-triplets/x86-windows.cmake +++ /dev/null @@ -1,3 +0,0 @@ -set(VCPKG_TARGET_ARCHITECTURE x86) -set(VCPKG_CRT_LINKAGE dynamic) -set(VCPKG_LIBRARY_LINKAGE static) diff --git a/vcpkg.json b/vcpkg.json index ac154a8..ba611cc 100644 --- a/vcpkg.json +++ b/vcpkg.json @@ -18,6 +18,7 @@ "boost-thread", "boost-predef" ], + "builtin-baseline": "f61a294e765b257926ae9e9d85f96468a0af74e7", "features": { "testing": { "description": "Build USVFS tests.", From 91682dda8990570ce037614f127276ace3fb1c97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mika=C3=ABl=20Capelle?= Date: Thu, 4 Jul 2024 15:09:13 +0200 Subject: [PATCH 11/20] Tentative update github action. --- .github/workflows/build.yml | 67 +++++++++++++++---------------------- CMakePresets.json | 23 ++++--------- 2 files changed, 33 insertions(+), 57 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 239f223..2cd7206 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -2,12 +2,12 @@ name: Build USVFS on: push: - branches: master + branches: [master, dev/cmake] pull_request: types: [opened, synchronize, reopened] env: - BOOST_PREBUILT_URL: "https://github.com/ModOrganizer2/mob/releases/download/2.5-dependencies/boost_prebuilt_1_85_0.7z" + VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite" jobs: build: @@ -16,57 +16,44 @@ jobs: matrix: arch: [x86, x64] config: [Debug, Release] - tests: ["", "Test"] runs-on: windows-2022 steps: - - uses: actions/checkout@v4 - with: - submodules: true - - name: Fetch Boost prebuilt - run: | - Invoke-WebRequest -Uri ${env:BOOST_PREBUILT_URL} -OutFile boost.7z - Expand-7ZipArchive -Path boost.7z -Destination .\boost - - name: Add msbuild to PATH - uses: microsoft/setup-msbuild@v2 + # https://learn.microsoft.com/en-us/vcpkg/consume/binary-caching-github-actions-cache + - name: Export GitHub Actions cache environment variables + uses: actions/github-script@v7 with: - msbuild-architecture: ${{ matrix.arch }} - - if: matrix.tests == 'Test' - name: Fetch googletest - uses: actions/checkout@v4 + script: | + core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); + core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); + + # checkout USVFS and vcpkg + - uses: actions/checkout@v4 + - uses: lukka/run-vcpkg@v11 with: - repository: google/googletest - path: ./googletest - - if: matrix.tests == 'Test' - name: Build googletest - run: | - cmake -B googletest/build_${{ matrix.arch }} ` - -A ${{ matrix.arch == 'x86' && 'Win32' || 'x64' }} ` - -Dgtest_force_shared_crt=ON ` - googletest - cmake --build googletest/build_${{ matrix.arch }} --config ${{ matrix.config }} - - name: Build - run: | - msbuild -nologo ` - -maxCpuCount "-property:UseMultiToolTask=true" "-property:EnforceProcessCountAcrossBuilds=true" ` - "-property:Configuration=${{ matrix.config }}${{ matrix.tests }}" ` - "-property:Platform=${{ matrix.arch }}" ` - "-property:BOOST_PATH=..\boost" ` - "-property:GTEST_PATH=..\googletest" ` - "-property:GTEST_LIBDIR=..\googletest\build_${{ matrix.arch }}\lib\${{ matrix.config }}" ` - "-property:RunCodeAnalysis=false" ` - .\vsbuild\usvfs.sln + vcpkgGitCommitId: f61a294e765b257926ae9e9d85f96468a0af74e7 + vcpkgJsonGlob: ${{ github.workspace }}/usvfs/vcpkg.json + + # configure + - run: cmake --preset vs2022-windows-${{ matrix.arch }} -B build_${{ matrix.arch }} + env: + VCPKG_ROOT: ${{ github.workspace }}/vcpkg + + # build + - run: cmake --build build_${{ matrix.arch }} --config ${{ matrix.config }} + env: + VCPKG_ROOT: ${{ github.workspace }}/vcpkg - - if: matrix.tests == 'Test' && matrix.config == 'Debug' + - if: matrix.config == 'Debug' uses: actions/upload-artifact@master with: name: usvfs-libs_${{ matrix.arch }} path: ./lib - - if: matrix.tests == 'Test' && matrix.config == 'Debug' + - if: matrix.config == 'Debug' uses: actions/upload-artifact@master with: name: usvfs-bins_${{ matrix.arch }} path: ./bin - - if: matrix.tests == 'Test' && matrix.config == 'Debug' + - if: matrix.config == 'Debug' uses: actions/upload-artifact@master with: name: usvfs-tests_${{ matrix.arch }} diff --git a/CMakePresets.json b/CMakePresets.json index 0829c08..c235b4a 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -40,13 +40,11 @@ } }, "hidden": true, - "inherits": [ - "vcpkg" - ], + "inherits": ["vcpkg"], "name": "vcpkg-dev" }, { - "binaryDir": "${sourceDir}/cbuild64", + "binaryDir": "${sourceDir}/vsbuild64", "architecture": { "strategy": "set", "value": "x64" @@ -61,7 +59,7 @@ "name": "windows-x64" }, { - "binaryDir": "${sourceDir}/cbuild32", + "binaryDir": "${sourceDir}/vsbuild32", "architecture": { "strategy": "set", "value": "Win32" @@ -80,26 +78,17 @@ "CMAKE_CXX_FLAGS": "/EHsc /MP /W4" }, "generator": "Visual Studio 17 2022", - "inherits": [ - "cmake-dev", - "vcpkg-dev" - ], + "inherits": ["cmake-dev", "vcpkg-dev"], "hidden": true, "name": "vs2022-windows", "toolset": "v143" }, { - "inherits": [ - "vs2022-windows", - "windows-x64" - ], + "inherits": ["vs2022-windows", "windows-x64"], "name": "vs2022-windows-x64" }, { - "inherits": [ - "vs2022-windows", - "windows-x86" - ], + "inherits": ["vs2022-windows", "windows-x86"], "name": "vs2022-windows-x86" } ], From 9e2509c3c0f5ce5ea15a9941dcf2503947677a4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mika=C3=ABl=20Capelle?= Date: Thu, 4 Jul 2024 15:53:35 +0200 Subject: [PATCH 12/20] Update license. --- LICENSE | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/LICENSE b/LICENSE index 3f5aed8..c0000a0 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (C) 2015-2017 Sebastian Herbord +Copyright (C) 2015-2024 Sebastian Herbord, ModOrganizer2 Team This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. @@ -697,4 +697,3 @@ may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . - From 63bd9727c05c5ef1d6319b96f1a55c58cd88fcd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mika=C3=ABl=20Capelle?= Date: Thu, 4 Jul 2024 19:04:14 +0200 Subject: [PATCH 13/20] Generate proper config and configVersion file. --- CMakeLists.txt | 31 +++++++++++++++++++++++++++++++ cmake/config.cmake.in | 6 ++++++ 2 files changed, 37 insertions(+) create mode 100644 cmake/config.cmake.in diff --git a/CMakeLists.txt b/CMakeLists.txt index 7a03764..6d9fc38 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,7 @@ cmake_minimum_required(VERSION 3.16) +include(CMakePackageConfigHelpers) + project(usvfs) set_property(GLOBAL PROPERTY USE_FOLDERS ON) @@ -23,6 +25,35 @@ add_subdirectory(src/usvfs_helper) add_subdirectory(src/usvfs_dll) add_subdirectory(src/usvfs_proxy) +configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/config.cmake.in + "${CMAKE_CURRENT_BINARY_DIR}/usvfsConfig.cmake" + INSTALL_DESTINATION "lib/cmake/usvfs" + NO_SET_AND_CHECK_MACRO + NO_CHECK_REQUIRED_COMPONENTS_MACRO +) + +file(READ "${CMAKE_CURRENT_SOURCE_DIR}/include/usvfs/usvfs_version.h" usvfs_version) +string(REGEX MATCH "USVFS_VERSION_MAJOR ([0-9]*)" _ ${usvfs_version}) +set(usvfs_version_major ${CMAKE_MATCH_1}) +string(REGEX MATCH "USVFS_VERSION_MINOR ([0-9]*)" _ ${usvfs_version}) +set(usvfs_version_minor ${CMAKE_MATCH_1}) +string(REGEX MATCH "USVFS_VERSION_BUILD ([0-9]*)" _ ${usvfs_version}) +set(usvfs_version_build ${CMAKE_MATCH_1}) +string(REGEX MATCH "USVFS_VERSION_REVISION ([0-9]*)" _ ${usvfs_version}) +set(usvfs_version_revision ${CMAKE_MATCH_1}) + +write_basic_package_version_file( + "${CMAKE_CURRENT_BINARY_DIR}/usvfsConfigVersion.cmake" + VERSION "${usvfs_version_major}.${usvfs_version_minor}.${usvfs_version_build}.${usvfs_version_revision}" + COMPATIBILITY AnyNewerVersion +) + +install(FILES + ${CMAKE_CURRENT_BINARY_DIR}/usvfsConfig.cmake + ${CMAKE_CURRENT_BINARY_DIR}/usvfsConfigVersion.cmake + DESTINATION lib/cmake/usvfs +) + if (BUILD_TESTING) enable_testing() set(USVFS_TEST_BINDIR ${CMAKE_CURRENT_LIST_DIR}/test/bin) diff --git a/cmake/config.cmake.in b/cmake/config.cmake.in new file mode 100644 index 0000000..b5e85ee --- /dev/null +++ b/cmake/config.cmake.in @@ -0,0 +1,6 @@ +@PACKAGE_INIT@ + +include ( "${CMAKE_CURRENT_LIST_DIR}/usvfs_x86Targets.cmake" ) +include ( "${CMAKE_CURRENT_LIST_DIR}/usvfs_x64Targets.cmake" ) + +add_library(usvfs::usvfs ALIAS usvfs_x64::usvfs_dll) From 0088b2ed9ba383408fd0cc81dca3dbc24f2f6511 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mika=C3=ABl=20Capelle?= Date: Thu, 4 Jul 2024 21:22:47 +0200 Subject: [PATCH 14/20] Ignore default build directory from CMakePresets. --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 3d8da0b..c9837dd 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,8 @@ /vsbuild/ReleaseTest /vsbuild/Debug /vsbuild/DebugTest +/vsbuild32 +/vsbuild64 CMakeUserPresets.json # test "side effects" From 6e71988884f52a867e7b68cd1a5521ae6c4f1ce6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mika=C3=ABl=20Capelle?= Date: Sun, 7 Jul 2024 12:12:22 +0200 Subject: [PATCH 15/20] Generate and install PDBs for DLL and Proxy. --- CMakeLists.txt | 12 ++++++++++++ src/usvfs_dll/CMakeLists.txt | 3 +++ src/usvfs_proxy/CMakeLists.txt | 1 + 3 files changed, 16 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6d9fc38..7288f8e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,6 +10,18 @@ set(CMAKE_CXX_STANDARD 20) set(USVFS_BINDIR ${CMAKE_CURRENT_LIST_DIR}/bin) set(USVFS_LIBDIR ${CMAKE_CURRENT_LIST_DIR}/lib) +if (MSVC) + # /Zi generate PDBs + # /Gy enable function-level linking + # /Oi enable intrinsic function + add_compile_options("$<$>:/Zi;/Gy;/Oi>") + + # /OPT:ICF enable COMDAT folding + # /DEBUG:FULL generate debug info (PDB) + # /OPT:REF enable references (PDB) + add_link_options("$<$>:/OPT:ICF;/DEBUG:FULL;/OPT:REF>") +endif() + if(CMAKE_SIZEOF_VOID_P EQUAL 4) set(ARCH_POSTFIX _x86) else() diff --git a/src/usvfs_dll/CMakeLists.txt b/src/usvfs_dll/CMakeLists.txt index 624874f..c5fdef0 100644 --- a/src/usvfs_dll/CMakeLists.txt +++ b/src/usvfs_dll/CMakeLists.txt @@ -42,11 +42,14 @@ set_target_properties(usvfs_dll LIBRARY_OUTPUT_NAME usvfs${ARCH_POSTFIX} LIBRARY_OUTPUT_DIRECTORY_DEBUG ${USVFS_LIBDIR} LIBRARY_OUTPUT_DIRECTORY_RELEASE ${USVFS_LIBDIR} + PDB_OUTPUT_DIRECTORY_DEBUG ${USVFS_LIBDIR} + PDB_OUTPUT_DIRECTORY_RELEASE ${USVFS_LIBDIR} RUNTIME_OUTPUT_NAME usvfs${ARCH_POSTFIX} RUNTIME_OUTPUT_DIRECTORY_DEBUG ${USVFS_LIBDIR} RUNTIME_OUTPUT_DIRECTORY_RELEASE ${USVFS_LIBDIR}) install(TARGETS usvfs_dll EXPORT usvfs${ARCH_POSTFIX}Targets FILE_SET HEADERS) +install(FILES $ DESTINATION lib OPTIONAL) install(EXPORT usvfs${ARCH_POSTFIX}Targets FILE usvfs${ARCH_POSTFIX}Targets.cmake NAMESPACE usvfs${ARCH_POSTFIX}:: diff --git a/src/usvfs_proxy/CMakeLists.txt b/src/usvfs_proxy/CMakeLists.txt index ffa9058..b67d913 100644 --- a/src/usvfs_proxy/CMakeLists.txt +++ b/src/usvfs_proxy/CMakeLists.txt @@ -12,3 +12,4 @@ set_target_properties(usvfs_proxy ) install(TARGETS usvfs_proxy EXPORT usvfs${ARCH_POSTFIX}Targets) +install(FILES $ DESTINATION lib OPTIONAL) From 9e36e270701c709eb60b497ed64de0b3f047edde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mika=C3=ABl=20Capelle?= Date: Sun, 7 Jul 2024 12:25:01 +0200 Subject: [PATCH 16/20] Make CMake generated version config arch independent. --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7288f8e..d203f23 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -58,6 +58,7 @@ write_basic_package_version_file( "${CMAKE_CURRENT_BINARY_DIR}/usvfsConfigVersion.cmake" VERSION "${usvfs_version_major}.${usvfs_version_minor}.${usvfs_version_build}.${usvfs_version_revision}" COMPATIBILITY AnyNewerVersion + ARCH_INDEPENDENT ) install(FILES From 28cb1eabd186823e189ce7400a33a9e309798149 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mika=C3=ABl=20Capelle?= Date: Sun, 7 Jul 2024 15:33:18 +0200 Subject: [PATCH 17/20] Update CI. --- .github/workflows/build.yml | 58 +++++++++++++++++++++++-------------- 1 file changed, 36 insertions(+), 22 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2cd7206..19781be 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -34,52 +34,65 @@ jobs: vcpkgJsonGlob: ${{ github.workspace }}/usvfs/vcpkg.json # configure - - run: cmake --preset vs2022-windows-${{ matrix.arch }} -B build_${{ matrix.arch }} + - run: cmake --preset vs2022-windows-${{ matrix.arch }} -B build_${{ matrix.arch }} "-DCMAKE_INSTALL_PREFIX=install" env: VCPKG_ROOT: ${{ github.workspace }}/vcpkg # build - - run: cmake --build build_${{ matrix.arch }} --config ${{ matrix.config }} + - run: cmake --build build_${{ matrix.arch }} --config ${{ matrix.config }} --target INSTALL env: VCPKG_ROOT: ${{ github.workspace }}/vcpkg - - if: matrix.config == 'Debug' - uses: actions/upload-artifact@master + # package install + - uses: actions/upload-artifact@master with: - name: usvfs-libs_${{ matrix.arch }} + name: usvfs_${{ matrix.config }}_${{ matrix.arch }} + path: ./install + + # package test/dlls/etc. for tests + + - uses: actions/upload-artifact@master + with: + name: usvfs-libs_${{ matrix.config }}_${{ matrix.arch }} path: ./lib - - if: matrix.config == 'Debug' - uses: actions/upload-artifact@master + - uses: actions/upload-artifact@master with: - name: usvfs-bins_${{ matrix.arch }} + name: usvfs-bins_${{ matrix.config }}_${{ matrix.arch }} path: ./bin - - if: matrix.config == 'Debug' - uses: actions/upload-artifact@master + - uses: actions/upload-artifact@master with: - name: usvfs-tests_${{ matrix.arch }} + name: usvfs-tests_${{ matrix.config }}_${{ matrix.arch }} path: ./test/bin # merge x86 / x64 artifacts merge-artifacts: runs-on: ubuntu-latest - name: Merge Artifacts for Tests + name: Merge Artifacts needs: build + strategy: + matrix: + config: [Debug, Release] steps: + - name: Merge USVFS install + uses: actions/upload-artifact/merge@v4 + with: + name: usvfs_${{ matrix.config }} + pattern: usvfs_${{ matrix.config }}_* - name: Merge USVFS libs uses: actions/upload-artifact/merge@v4 with: - name: usvfs-libs - pattern: usvfs-libs_* + name: usvfs-libs_${{ matrix.config }} + pattern: usvfs-libs_${{ matrix.config }}_* - name: Merge USVFS bins uses: actions/upload-artifact/merge@v4 with: - name: usvfs-bins - pattern: usvfs-bins_* + name: usvfs-bins_${{ matrix.config }} + pattern: usvfs-bins_${{ matrix.config }}_* - name: Merge USVFS tests uses: actions/upload-artifact/merge@v4 with: - name: usvfs-tests - pattern: usvfs-tests_* + name: usvfs-tests_${{ matrix.config }} + pattern: usvfs-tests_${{ matrix.config }}_* test: name: Test USVFS @@ -87,20 +100,21 @@ jobs: runs-on: windows-2022 strategy: matrix: + config: [Debug, Release] arch: [x86, x64] steps: - uses: actions/checkout@v4 - uses: actions/download-artifact@master with: - name: usvfs-libs + name: usvfs-libs_${{ matrix.config }} path: ./lib - uses: actions/download-artifact@master with: - name: usvfs-bins + name: usvfs-bins_${{ matrix.config }} path: ./bin - uses: actions/download-artifact@master with: - name: usvfs-tests + name: usvfs-tests_${{ matrix.config }} path: ./test/bin - run: ./test/bin/shared_test_${{ matrix.arch }}.exe if: always() @@ -117,7 +131,7 @@ jobs: - uses: actions/upload-artifact@master if: always() with: - name: tests-outputs_${{ matrix.arch }} + name: tests-outputs_${{ matrix.config }}_${{ matrix.arch }} path: ./test/temp if-no-files-found: ignore retention-days: 7 From b80c98baa3d1ec05e70d6f57ca51fadc28ec527d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mika=C3=ABl=20Capelle?= Date: Mon, 8 Jul 2024 20:41:41 +0200 Subject: [PATCH 18/20] Add INSTALL target to default VS. Change pdb output directory. --- CMakeLists.txt | 1 + src/usvfs_dll/CMakeLists.txt | 2 +- src/usvfs_proxy/CMakeLists.txt | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d203f23..e0deb42 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,6 +5,7 @@ include(CMakePackageConfigHelpers) project(usvfs) set_property(GLOBAL PROPERTY USE_FOLDERS ON) +set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1) set(CMAKE_CXX_STANDARD 20) set(USVFS_BINDIR ${CMAKE_CURRENT_LIST_DIR}/bin) diff --git a/src/usvfs_dll/CMakeLists.txt b/src/usvfs_dll/CMakeLists.txt index c5fdef0..2520b50 100644 --- a/src/usvfs_dll/CMakeLists.txt +++ b/src/usvfs_dll/CMakeLists.txt @@ -49,7 +49,7 @@ set_target_properties(usvfs_dll RUNTIME_OUTPUT_DIRECTORY_RELEASE ${USVFS_LIBDIR}) install(TARGETS usvfs_dll EXPORT usvfs${ARCH_POSTFIX}Targets FILE_SET HEADERS) -install(FILES $ DESTINATION lib OPTIONAL) +install(FILES $ DESTINATION pdb OPTIONAL) install(EXPORT usvfs${ARCH_POSTFIX}Targets FILE usvfs${ARCH_POSTFIX}Targets.cmake NAMESPACE usvfs${ARCH_POSTFIX}:: diff --git a/src/usvfs_proxy/CMakeLists.txt b/src/usvfs_proxy/CMakeLists.txt index b67d913..47614ee 100644 --- a/src/usvfs_proxy/CMakeLists.txt +++ b/src/usvfs_proxy/CMakeLists.txt @@ -12,4 +12,4 @@ set_target_properties(usvfs_proxy ) install(TARGETS usvfs_proxy EXPORT usvfs${ARCH_POSTFIX}Targets) -install(FILES $ DESTINATION lib OPTIONAL) +install(FILES $ DESTINATION pdb OPTIONAL) From 0d03716c05938bde3e89ee5823b52c694d72fcb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mika=C3=ABl=20Capelle?= Date: Tue, 9 Jul 2024 19:00:33 +0200 Subject: [PATCH 19/20] Use MO2 registry for asmjit and spdlog. --- CMakePresets.json | 4 - cmake/ports/asmjit/asmjit.patch | 906 ------------------------------ cmake/ports/asmjit/portfile.cmake | 31 - cmake/ports/asmjit/vcpkg.json | 17 - vcpkg-configuration.json | 21 + vcpkg.json | 5 +- 6 files changed, 22 insertions(+), 962 deletions(-) delete mode 100644 cmake/ports/asmjit/asmjit.patch delete mode 100644 cmake/ports/asmjit/portfile.cmake delete mode 100644 cmake/ports/asmjit/vcpkg.json create mode 100644 vcpkg-configuration.json diff --git a/CMakePresets.json b/CMakePresets.json index c235b4a..156ccfe 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -22,10 +22,6 @@ "VCPKG_MANIFEST_NO_DEFAULT_FEATURES": { "type": "BOOL", "value": "ON" - }, - "VCPKG_OVERLAY_PORTS": { - "type": "STRING", - "value": "${sourceDir}/cmake/ports" } }, "toolchainFile": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake", diff --git a/cmake/ports/asmjit/asmjit.patch b/cmake/ports/asmjit/asmjit.patch deleted file mode 100644 index 35f90ca..0000000 --- a/cmake/ports/asmjit/asmjit.patch +++ /dev/null @@ -1,906 +0,0 @@ -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 37061c9..a211ae1 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -1,363 +1,618 @@ --cmake_minimum_required(VERSION 3.1) --include(CheckCXXCompilerFlag) -- --# ============================================================================= --# [AsmJit - Configuration] --# ============================================================================= -+cmake_minimum_required(VERSION 3.8 FATAL_ERROR) - --# Embedding mode, asmjit will not create any targets (default FALSE). --# set(ASMJIT_EMBED FALSE) -+cmake_policy(PUSH) - --# Whether to build a static library (default FALSE). --# set(ASMJIT_STATIC FALSE) -+if (POLICY CMP0063) -+ cmake_policy(SET CMP0063 NEW) # Honor visibility properties. -+endif() - --# Used for debugging asmjit itself (default FALSE). --# set(ASMJIT_TRACE FALSE) -+if (POLICY CMP0092) -+ cmake_policy(SET CMP0092 NEW) # Don't add -W3 warning level by default. -+endif() - --# Whether to build ARM32 backend (TRUE if building for ARM32). --# set(ASMJIT_BUILD_ARM32 FALSE) -+# Don't create a project if it was already created by another CMakeLists.txt. -+# This allows one library to embed another library without making a collision. -+if (NOT CMAKE_PROJECT_NAME OR "${CMAKE_PROJECT_NAME}" STREQUAL "asmjit") -+ project(asmjit CXX) -+endif() - --# Whether to build ARM64 backend (TRUE if building for ARM64). --# set(ASMJIT_BUILD_ARM64 FALSE) -+include(CheckCXXCompilerFlag) -+INCLUDE(CheckCXXSourceCompiles) -+include(GNUInstallDirs) - --# Whether to build X86 backend (TRUE if building for X86). --# set(ASMJIT_BUILD_X86 FALSE) -+# AsmJit - Deprecated -+# =================== - --# Whether to build X64 backend (TRUE if building for X64). --# set(ASMJIT_BUILD_X64 FALSE) -+if (DEFINED ASMJIT_BUILD_EMBED) -+ message(DEPRECATION "ASMJIT_BUILD_EMBED is deprecated, use ASMJIT_EMBED") -+ set(ASMJIT_EMBED "${ASMJIT_BUILD_EMBED}") -+endif() - --# Whether to build tests and samples (default FALSE). --# set(ASMJIT_BUILD_TEST FALSE) -+if (DEFINED ASMJIT_BUILD_STATIC) -+ message(DEPRECATION "ASMJIT_BUILD_STATIC is deprecated, use ASMJIT_STATIC") -+ set(ASMJIT_STATIC "${ASMJIT_BUILD_STATIC}") -+endif() - --# ============================================================================= --# [AsmJit - Build / Embed] --# ============================================================================= -+# AsmJit - Configuration - Build -+# ============================== - --# Do not create a project if this CMakeLists.txt is included from another --# project. This makes it easy to embed or create a static library. --if(NOT CMAKE_PROJECT_NAME OR "${CMAKE_PROJECT_NAME}" MATCHES "^asmjit$") -- project(asmjit C CXX) -- set(ASMJIT_SIGNATURE "Standalone") --else() -- set(ASMJIT_SIGNATURE "Included") -+if (NOT DEFINED ASMJIT_TEST) -+ set(ASMJIT_TEST FALSE) - endif() - --if(ASMJIT_EMBED) -- set(ASMJIT_SIGNATURE "${ASMJIT_SIGNATURE} | Mode=Embed") -- set(ASMJIT_STATIC TRUE) # Implies ASMJIT_STATIC. --elseif(ASMJIT_STATIC) -- set(ASMJIT_SIGNATURE "${ASMJIT_SIGNATURE} | Mode=Static") --else() -- set(ASMJIT_SIGNATURE "${ASMJIT_SIGNATURE} | Mode=Shared") -+if (NOT DEFINED ASMJIT_EMBED) -+ set(ASMJIT_EMBED FALSE) - endif() - --if(ASMJIT_BUILD_TEST) -- set(ASMJIT_SIGNATURE "${ASMJIT_SIGNATURE} | Test=On") --else() -- set(ASMJIT_SIGNATURE "${ASMJIT_SIGNATURE} | Test=Off") -+if (NOT DEFINED ASMJIT_STATIC) -+ set(ASMJIT_STATIC ${ASMJIT_EMBED}) - endif() - --if(NOT ASMJIT_DIR) -- set(ASMJIT_DIR ${CMAKE_CURRENT_LIST_DIR}) -+if (NOT DEFINED ASMJIT_SANITIZE) -+ set(ASMJIT_SANITIZE FALSE) - endif() - --message("-- [asmjit] ${ASMJIT_SIGNATURE}") --message("-- [asmjit] ASMJIT_DIR=${ASMJIT_DIR}") -- --# ============================================================================= --# [NP-Utilities] --# ============================================================================= -- --function(np_detect_options out) -- set(out_array) -- foreach(flag ${ARGN}) -- check_cxx_compiler_flag("${flag}" ok) -- if(ok) -- list(APPEND out_array "${flag}") -- endif() -- unset(ok) -- endforeach() -- set(${out} "${out_array}" PARENT_SCOPE) --endfunction() -- --# ============================================================================= --# [AsmJit - Flags / Deps] --# ============================================================================= -- --set(ASMJIT_SOURCE_DIR "${ASMJIT_DIR}/src") # Asmjit source directory. --set(ASMJIT_INCLUDE_DIR "${ASMJIT_SOURCE_DIR}") # Asmjit include directory. -- --set(ASMJIT_CFLAGS) # Asmjit CFLAGS / CXXFLAGS. --set(ASMJIT_DEPS) # Asmjit dependencies (list of libraries) for the linker. --set(ASMJIT_LIBS) # Asmjit dependencies with asmjit included, for consumers. -- --# Internal, never use. --set(ASMJIT_D "-D") # Used to define a C/C++ preprocessor parameter (-D or /D). --set(ASMJIT_PRIVATE_CFLAGS) # Compiler flags independent of build type. --set(ASMJIT_PRIVATE_LFLAGS "") # Linker flags used by the library and tests. -- --set(ASMJIT_PRIVATE_CFLAGS_DBG) # Compiler flags used only by debug build. --set(ASMJIT_PRIVATE_CFLAGS_REL) # Compiler flags used only by release build. -+if (NOT DEFINED ASMJIT_NO_CUSTOM_FLAGS) -+ set(ASMJIT_NO_CUSTOM_FLAGS FALSE) -+endif() - --if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") -- set(ASMJIT_D "/D") -- set(ASMJIT_PRIVATE_LFLAGS "/OPT:REF /OPT:ICF") -+if (NOT DEFINED ASMJIT_NO_NATVIS) -+ set(ASMJIT_NO_NATVIS FALSE) -+endif() - -- list(APPEND ASMJIT_PRIVATE_CFLAGS /GF) -- list(APPEND ASMJIT_PRIVATE_CFLAGS_DBG /GS /GR-) -- list(APPEND ASMJIT_PRIVATE_CFLAGS_REL /Oi /Oy /GS- /GR-) -- if(NOT MSVC60 AND NOT MSVC70 AND NOT MSVC71) -- list(APPEND ASMJIT_PRIVATE_CFLAGS /MP) # Enable multi-process compilation. -- endif() -+# EMBED implies STATIC. -+if (ASMJIT_EMBED AND NOT ASMJIT_STATIC) -+ set(ASMJIT_STATIC TRUE) - endif() - --if("${CMAKE_CXX_COMPILER_ID}" MATCHES "^(GNU|Clang)$") -- # Keep only the first option detected. -- np_detect_options(ASMJIT_CC_OPTIONS -- "-std=c++14" -- "-std=c++11" -- "-std=c++0x") -- if(ASMJIT_CC_OPTIONS) -- list(GET ASMJIT_CC_OPTIONS 0 ASMJIT_CC_OPTIONS) -- list(APPEND ASMJIT_PRIVATE_CFLAGS ${ASMJIT_CC_OPTIONS}) -- endif() -+# AsmJit - Configuration - Backend -+# ================================ - -- np_detect_options(ASMJIT_CC_OPTIONS -- "-fno-exceptions" -- "-fno-tree-vectorize" -- "-fvisibility=hidden") -+if (NOT DEFINED ASMJIT_NO_X86) -+ set(ASMJIT_NO_X86 FALSE) -+endif() - -- list(APPEND ASMJIT_PRIVATE_CFLAGS ${ASMJIT_CC_OPTIONS}) -- list(APPEND ASMJIT_PRIVATE_CFLAGS_REL -fmerge-all-constants) -+if (NOT DEFINED ASMJIT_NO_AARCH64) -+ set(ASMJIT_NO_AARCH64 FALSE) -+endif() - -- unset(ASMJIT_CC_OPTIONS) -+if (NOT DEFINED ASMJIT_NO_FOREIGN) -+ set(ASMJIT_NO_FOREIGN FALSE) - endif() - --if(ASMJIT_EMBED) -- list(APPEND ASMJIT_PRIVATE_CFLAGS "${ASMJIT_D}ASMJIT_EMBED") --elseif(ASMJIT_STATIC) -- list(APPEND ASMJIT_PRIVATE_CFLAGS "${ASMJIT_D}ASMJIT_STATIC") -+# AsmJit - Configuration - Features -+# ================================= -+ -+if (NOT DEFINED ASMJIT_NO_DEPRECATED) -+ set(ASMJIT_NO_DEPRECATED FALSE) - endif() - --if(ASMJIT_TRACE) -- list(APPEND ASMJIT_PRIVATE_CFLAGS "${ASMJIT_D}ASMJIT_TRACE") -+if (NOT DEFINED ASMJIT_NO_SHM_OPEN) -+ set(ASMJIT_NO_SHM_OPEN FALSE) - endif() - --if(WIN32) -- list(APPEND ASMJIT_PRIVATE_CFLAGS "${ASMJIT_D}_UNICODE") --else() -- list(APPEND ASMJIT_DEPS pthread) -+if (NOT DEFINED ASMJIT_NO_JIT) -+ set(ASMJIT_NO_JIT FALSE) - endif() - --if("${CMAKE_SYSTEM_NAME}" MATCHES "Linux") -- list(APPEND ASMJIT_DEPS rt) -+if (NOT DEFINED ASMJIT_NO_TEXT) -+ set(ASMJIT_NO_TEXT FALSE) - endif() - --set(ASMJIT_LIBS ${ASMJIT_DEPS}) --if(NOT ASMJIT_EMBED) -- list(INSERT ASMJIT_LIBS 0 asmjit) -+if (NOT DEFINED ASMJIT_NO_LOGGING) -+ set(ASMJIT_NO_LOGGING ${ASMJIT_NO_TEXT}) - endif() - --if(ASMJIT_BUILD_ARM32) -- List(APPEND ASMJIT_CFLAGS "${ASMJIT_D}ASMJIT_BUILD_ARM32") -+if (NOT DEFINED ASMJIT_NO_VALIDATION) -+ set(ASMJIT_NO_VALIDATION FALSE) - endif() - --if(ASMJIT_BUILD_ARM64) -- List(APPEND ASMJIT_CFLAGS "${ASMJIT_D}ASMJIT_BUILD_ARM64") -+if (NOT DEFINED ASMJIT_NO_INTROSPECTION) -+ set(ASMJIT_NO_INTROSPECTION FALSE) - endif() - --if(ASMJIT_BUILD_X86) -- List(APPEND ASMJIT_CFLAGS "${ASMJIT_D}ASMJIT_BUILD_X86") -+if (NOT DEFINED ASMJIT_NO_BUILDER) -+ set(ASMJIT_NO_BUILDER FALSE) - endif() - --if(ASMJIT_BUILD_X64) -- List(APPEND ASMJIT_CFLAGS "${ASMJIT_D}ASMJIT_BUILD_X64") -+if (NOT DEFINED ASMJIT_NO_COMPILER) -+ if (ASMJIT_NO_BUILDER OR ASMJIT_NO_INTROSPECTION) -+ set(ASMJIT_NO_COMPILER TRUE) -+ else() -+ set(ASMJIT_NO_COMPILER FALSE) -+ endif() - endif() - --set(ASMJIT_PRIVATE_CFLAGS_DBG ${ASMJIT_CFLAGS} ${ASMJIT_PRIVATE_CFLAGS} ${ASMJIT_PRIVATE_CFLAGS_DBG}) --set(ASMJIT_PRIVATE_CFLAGS_REL ${ASMJIT_CFLAGS} ${ASMJIT_PRIVATE_CFLAGS} ${ASMJIT_PRIVATE_CFLAGS_REL}) -+# AsmJit - Configuration - CMake Introspection -+# ============================================ -+ -+set(ASMJIT_DIR "${CMAKE_CURRENT_LIST_DIR}" CACHE PATH "Location of 'asmjit'") -+set(ASMJIT_TEST "${ASMJIT_TEST}" CACHE BOOL "Build 'asmjit' test applications") -+set(ASMJIT_EMBED "${ASMJIT_EMBED}" CACHE BOOL "Embed 'asmjit' library (no targets)") -+set(ASMJIT_STATIC "${ASMJIT_STATIC}" CACHE BOOL "Build 'asmjit' library as static") -+set(ASMJIT_SANITIZE "${ASMJIT_SANITIZE}" CACHE STRING "Build with sanitizers: 'address', 'undefined', etc...") -+set(ASMJIT_NO_NATVIS "${ASMJIT_NO_NATVIS}" CACHE BOOL "Disable natvis support (embedding asmjit.natvis in PDB)") -+set(ASMJIT_NO_CUSTOM_FLAGS "${ASMJIT_NO_CUSTOM_FLAGS}" CACHE BOOL "Disable extra compilation flags added by AsmJit to its targets") -+ -+set(ASMJIT_NO_X86 "${ASMJIT_NO_X86}" CACHE BOOL "Disable X86/X64 backend") -+set(ASMJIT_NO_AARCH64 "${ASMJIT_NO_AARCH64}" CACHE BOOL "Disable AArch64 backend") -+set(ASMJIT_NO_FOREIGN "${ASMJIT_NO_FOREIGN}" CACHE BOOL "Disable all foreign architectures (enables only a target architecture)") -+ -+set(ASMJIT_NO_DEPRECATED "${ASMJIT_NO_DEPRECATED}" CACHE BOOL "Disable deprecated API at build time") -+set(ASMJIT_NO_SHM_OPEN "${ASMJIT_NO_SHM_OPEN}" CACHE BOOL "Disable the use of shm_open() even on platforms where it's supported") -+set(ASMJIT_NO_JIT "${ASMJIT_NO_JIT}" CACHE BOOL "Disable VirtMem, JitAllocator, and JitRuntime at build time") -+set(ASMJIT_NO_TEXT "${ASMJIT_NO_TEXT}" CACHE BOOL "Disable textual representation of instructions, enums, cpu features, ...") -+set(ASMJIT_NO_LOGGING "${ASMJIT_NO_LOGGING}" CACHE BOOL "Disable logging features at build time") -+set(ASMJIT_NO_VALIDATION "${ASMJIT_NO_VALIDATION}" CACHE BOOL "Disable instruction validation API at build time") -+set(ASMJIT_NO_INTROSPECTION "${ASMJIT_NO_INTROSPECTION}" CACHE BOOL "Disable instruction introspection API at build time") -+set(ASMJIT_NO_BUILDER "${ASMJIT_NO_BUILDER}" CACHE BOOL "Disable Builder emitter at build time") -+set(ASMJIT_NO_COMPILER "${ASMJIT_NO_COMPILER}" CACHE BOOL "Disable Compiler emitter at build time") -+ -+# AsmJit - Project -+# ================ -+ -+set(ASMJIT_INCLUDE_DIRS "${ASMJIT_DIR}/src") # Include directory is the same as source dir. -+set(ASMJIT_DEPS "") # AsmJit dependencies (libraries) for the linker. -+set(ASMJIT_LIBS "") # Dependencies of libs/apps that want to use AsmJit. -+set(ASMJIT_CFLAGS "") # Public compiler flags. -+set(ASMJIT_PRIVATE_CFLAGS "") # Private compiler flags independent of build type. -+set(ASMJIT_PRIVATE_CFLAGS_DBG "") # Private compiler flags used by debug builds. -+set(ASMJIT_PRIVATE_CFLAGS_REL "") # Private compiler flags used by release builds. -+set(ASMJIT_SANITIZE_CFLAGS "") # Compiler flags required by currently enabled sanitizers. -+set(ASMJIT_SANITIZE_LFLAGS "") # Linker flags required by currently enabled sanitizers. -+ -+# AsmJit - Utilities -+# ================== -+ -+function(asmjit_detect_cflags out) -+ set(out_array ${${out}}) -+ foreach(flag ${ARGN}) -+ string(REGEX REPLACE "[+]" "x" flag_signature "${flag}") -+ string(REGEX REPLACE "[-=:;/.\]" "_" flag_signature "${flag_signature}") -+ check_cxx_compiler_flag(${flag} "__CxxFlag_${flag_signature}") -+ if (${__CxxFlag_${flag_signature}}) -+ list(APPEND out_array "${flag}") -+ endif() -+ endforeach() -+ set(${out} "${out_array}" PARENT_SCOPE) -+endfunction() - --message("-- [asmjit] ASMJIT_DEPS=${ASMJIT_DEPS}") --message("-- [asmjit] ASMJIT_LIBS=${ASMJIT_LIBS}") --message("-- [asmjit] ASMJIT_CFLAGS=${ASMJIT_CFLAGS}") -+# Support for various sanitizers provided by C/C++ compilers. -+function(asmjit_detect_sanitizers out) -+ set(_out_array ${${out}}) -+ set(_flags "") - --# ============================================================================= --# [AsmJit - Macros] --# ============================================================================= -+ foreach(_arg ${ARGN}) -+ string(REPLACE "," ";" _arg "${_arg}") -+ list(APPEND _flags ${_arg}) -+ endforeach() - --macro(asmjit_add_source _out_dst _src_dir) -- set(_src_path "${ASMJIT_SOURCE_DIR}/${_src_dir}") -- set(_src_list) -+ foreach(_flag ${_flags}) -+ if (NOT "${_flag}" MATCHES "^-fsanitize=") -+ SET(_flag "-fsanitize=${_flag}") -+ endif() - -- foreach(_arg ${ARGN}) -- set(_src_file "${_src_path}/${_arg}") -- list(APPEND _src_list ${_src_file}) -+ # Sanitizers also require link flags, see CMAKE_REQUIRED_FLAGS. -+ set(CMAKE_REQUIRED_FLAGS "${_flag}") -+ asmjit_detect_cflags(_out_array ${_flag}) -+ unset(CMAKE_REQUIRED_FLAGS) - endforeach() - -- list(APPEND "${_out_dst}" ${_src_list}) -- source_group(${_src_dir} FILES ${_src_list}) --endmacro() -+ set(${out} "${_out_array}" PARENT_SCOPE) -+endfunction() - --macro(asmjit_add_library _target _src _deps _cflags _cflags_dbg _cflags_rel) -- if(NOT ASMJIT_STATIC) -- add_library(${_target} SHARED ${_src}) -+function(asmjit_add_target target target_type) -+ set(single_val "") -+ set(multi_val SOURCES LIBRARIES CFLAGS CFLAGS_DBG CFLAGS_REL) -+ cmake_parse_arguments("X" "" "${single_val}" "${multi_val}" ${ARGN}) -+ -+ if ("${target_type}" MATCHES "^(EXECUTABLE|TEST)$") -+ add_executable(${target} ${X_SOURCES}) - else() -- add_library(${_target} STATIC ${_src}) -+ add_library(${target} ${target_type} ${X_SOURCES}) - endif() - -- target_link_libraries(${_target} ${_deps}) -- set_target_properties(${_target} PROPERTIES LINK_FLAGS "${ASMJIT_PRIVATE_LFLAGS}") -+ set_target_properties(${target} PROPERTIES DEFINE_SYMBOL "") -+ target_link_libraries(${target} PRIVATE ${X_LIBRARIES}) -+ -+ # target_link_options was added in cmake v3.13, don't use it for now... -+ foreach(link_flag ${ASMJIT_PRIVATE_LFLAGS}) -+ set_property(TARGET ${target} APPEND_STRING PROPERTY LINK_FLAGS " ${link_flag}") -+ endforeach() -+ -+ target_compile_features(${target} PUBLIC cxx_std_11) -+ set_property(TARGET ${target} PROPERTY CXX_EXTENSIONS NO) -+ set_property(TARGET ${target} PROPERTY CXX_VISIBILITY_PRESET hidden) -+ target_compile_options(${target} PRIVATE ${X_CFLAGS} ${ASMJIT_SANITIZE_CFLAGS} $<$:${X_CFLAGS_DBG}> $<$>:${X_CFLAGS_REL}>) -+ -+ if ("${target_type}" STREQUAL "TEST") -+ add_test(NAME ${target} COMMAND ${target}) -+ endif() -+endfunction() - -- if(CMAKE_BUILD_TYPE) -- if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") -- target_compile_options(${_target} PRIVATE ${_cflags} ${_cflags_dbg}) -+# AsmJit - Compiler Support -+# ========================= -+ -+# We will have to keep this most likely forever as some users may still be using it. -+set(ASMJIT_INCLUDE_DIR "${ASMJIT_INCLUDE_DIRS}") -+ -+if (NOT ASMJIT_NO_CUSTOM_FLAGS) -+ if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" OR "x${CMAKE_CXX_COMPILER_FRONTEND_VARIANT}" STREQUAL "xMSVC") -+ list(APPEND ASMJIT_PRIVATE_CFLAGS -+ -MP # [+] Multi-Process Compilation. -+ -GF # [+] Eliminate duplicate strings. -+ -Zc:__cplusplus # [+] Conforming __cplusplus definition. -+ -Zc:inline # [+] Remove unreferenced COMDAT. -+ -Zc:strictStrings # [+] Strict const qualification of string literals. -+ -Zc:threadSafeInit- # [-] Thread-safe statics. -+ -W4) # [+] Warning level 4. -+ -+ list(APPEND ASMJIT_PRIVATE_CFLAGS_DBG -+ -GS) # [+] Buffer security-check. -+ -+ list(APPEND ASMJIT_PRIVATE_CFLAGS_REL -+ -GS- # [-] Buffer security-check. -+ -O2 # [+] Favor speed over size. -+ -Oi) # [+] Generate intrinsic functions. -+ elseif ("${CMAKE_CXX_COMPILER_ID}" MATCHES "^(GNU|Clang|AppleClang)$") -+ list(APPEND ASMJIT_PRIVATE_CFLAGS -Wall -Wextra -Wconversion) -+ list(APPEND ASMJIT_PRIVATE_CFLAGS -fno-math-errno) -+ list(APPEND ASMJIT_PRIVATE_CFLAGS_REL -O2) -+ -+ # -fno-semantic-interposition is not available on apple - the compiler issues a warning, which is not detected. -+ if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "AppleClang") -+ asmjit_detect_cflags(ASMJIT_PRIVATE_CFLAGS -fno-threadsafe-statics) - else() -- target_compile_options(${_target} PRIVATE ${_cflags} ${_cflags_rel}) -+ asmjit_detect_cflags(ASMJIT_PRIVATE_CFLAGS -fno-threadsafe-statics -fno-semantic-interposition) - endif() -- else() -- target_compile_options(${_target} PRIVATE ${_cflags} -- $<$:${_cflags_dbg}> -- $<$>:${_cflags_rel}>) -+ -+ # The following flags can save few bytes in the resulting binary. -+ asmjit_detect_cflags(ASMJIT_PRIVATE_CFLAGS_REL -+ -fmerge-all-constants # Merge all constants even if it violates ISO C++. -+ -fno-enforce-eh-specs) # Don't enforce termination if noexcept function throws. - endif() -+endif() -+ -+# Support for sanitizers. -+if (ASMJIT_SANITIZE) -+ asmjit_detect_sanitizers(ASMJIT_SANITIZE_CFLAGS ${ASMJIT_SANITIZE}) -+ if (ASMJIT_SANITIZE_CFLAGS) -+ message("-- Enabling sanitizers: '${ASMJIT_SANITIZE_CFLAGS}'") -+ -+ # Linker must receive the same flags as the compiler when it comes to sanitizers. -+ set(ASMJIT_SANITIZE_LFLAGS ${ASMJIT_SANITIZE_CFLAGS}) - -- if(NOT ASMJIT_STATIC) -- install(TARGETS ${_target} DESTINATION "lib${LIB_SUFFIX}") -+ # Don't omit frame pointer if sanitizers are enabled. -+ if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" OR "x${CMAKE_CXX_COMPILER_FRONTEND_VARIANT}" STREQUAL "xMSVC") -+ list(APPEND ASMJIT_SANITIZE_CFLAGS -Oy-) -+ else() -+ list(APPEND ASMJIT_SANITIZE_CFLAGS -fno-omit-frame-pointer -g) -+ endif() -+ -+ list(APPEND ASMJIT_PRIVATE_CFLAGS ${ASMJIT_SANITIZE_CFLAGS}) -+ list(APPEND ASMJIT_PRIVATE_LFLAGS ${ASMJIT_SANITIZE_LFLAGS}) - endif() --endmacro() -+endif() - --# ============================================================================= --# [AsmJit - Source] --# ============================================================================= -+if (WIN32) -+ # Dependency: nothing extra at the moment. -+elseif ("${CMAKE_SYSTEM_NAME}" STREQUAL "Android") -+ # Dependency: libc is the only required library on Android as it also provides libthread. -+ message("-- Dependency: adding libc (Android target detected)") -+ list(APPEND ASMJIT_DEPS c) -+elseif ("${CMAKE_SYSTEM_NAME}" STREQUAL "Haiku") -+ # Dependency: libroot is used by Haiku instead of libc, so link to libroot and libpthread. -+ message("-- Dependency: adding libroot and libpthread (Haiku target detected)") -+ list(APPEND ASMJIT_DEPS root pthread) -+else() -+ # Dependency: libc is always required. -+ message("-- Dependency: adding libc (Linux, BSD, or other UNIX/POSIX environment)") -+ list(APPEND ASMJIT_DEPS c) -+ -+ # Dependency: pthread (required so AsmJit can use pthread_lock). -+ check_cxx_source_compiles(" -+ #include -+ int main() { -+ pthread_mutex_t m; -+ pthread_mutex_init(&m, nullptr); -+ return pthread_mutex_destroy(&m); -+ } -+ " ASMJIT_LIBC_HAS_LIBPTHREAD) -+ if (ASMJIT_LIBC_HAS_LIBPTHREAD) -+ message("-- Dependency: libpthread provided by libc (not linking to libpthread)") -+ else() -+ message("-- Dependency: libpthread not provided by libc, linking to libpthread") -+ list(APPEND ASMJIT_DEPS pthread) -+ endif() - --set(ASMJIT_SRC "") -+ # Dependency: shm_open (required so AsmJit can use shm_open on supported platforms). -+ if ("${CMAKE_SYSTEM_NAME}" MATCHES "^(Linux|NetBSD)$" AND NOT ASMJIT_NO_SHM_OPEN) -+ check_cxx_source_compiles(" -+ #include -+ int main() { -+ const char file_name[1] {}; -+ return shm_open(file_name, 0, 0); -+ } -+ " ASMJIT_LIBC_HAS_LIBRT) -+ if (ASMJIT_LIBC_HAS_LIBRT) -+ message("-- Dependency: shm_open provided by libc (not linking to librt)") -+ else() -+ message("-- Dependency: shm_open not provided by libc, linking to librt") -+ list(APPEND ASMJIT_DEPS rt) -+ endif() -+ endif() -+endif() - --asmjit_add_source(ASMJIT_SRC asmjit -- apibegin.h -- apiend.h -+set(ASMJIT_LIBS ${ASMJIT_DEPS}) -+if (NOT ASMJIT_EMBED) -+ list(INSERT ASMJIT_LIBS 0 asmjit) -+endif() - -- asmjit.h -- base.h -- build.h -- host.h -+if (ASMJIT_EMBED) -+ set(ASMJIT_TARGET_TYPE "EMBED") -+elseif (ASMJIT_STATIC) -+ set(ASMJIT_TARGET_TYPE "STATIC") -+else() -+ set(ASMJIT_TARGET_TYPE "SHARED") -+endif() - -- arm.h -- x86.h --) -+foreach(build_option # AsmJit build options. -+ ASMJIT_STATIC -+ ASMJIT_NO_DEPRECATED -+ # AsmJit backends selection. -+ ASMJIT_NO_X86 -+ ASMJIT_NO_AARCH64 -+ ASMJIT_NO_FOREIGN -+ # AsmJit features selection. -+ ASMJIT_NO_JIT -+ ASMJIT_NO_TEXT -+ ASMJIT_NO_LOGGING -+ ASMJIT_NO_INTROSPECTION -+ ASMJIT_NO_VALIDATION -+ ASMJIT_NO_BUILDER -+ ASMJIT_NO_COMPILER) -+ if (${build_option}) -+ List(APPEND ASMJIT_CFLAGS "-D${build_option}") -+ List(APPEND ASMJIT_PRIVATE_CFLAGS "-D${build_option}") -+ endif() -+endforeach() - --asmjit_add_source(ASMJIT_SRC asmjit/base -- assembler.cpp -- assembler.h -- compiler.cpp -- compiler.h -- compilercontext.cpp -- compilercontext_p.h -- compilerfunc.h -- constpool.cpp -- constpool.h -- containers.cpp -- containers.h -- cpuinfo.cpp -- cpuinfo.h -- globals.cpp -- globals.h -- hlstream.cpp -- hlstream.h -- logger.cpp -- logger.h -- operand.cpp -- operand.h -- podvector.cpp -- podvector.h -- runtime.cpp -- runtime.h -- utils.cpp -- utils.h -- vectypes.h -- vmem.cpp -- vmem.h -- zone.cpp -- zone.h --) -+# AsmJit - Linker Support -+# ======================= - --if(0) --asmjit_add_source(ASMJIT_SRC asmjit/arm -- armassembler.cpp -- armassembler.h -- arminst.cpp -- arminst.h -- armoperand.cpp -- armoperand_regs.cpp -- armoperand.h --) -+if (WIN32) -+ if (CMAKE_LINKER MATCHES "link\\.exe" OR CMAKE_LINKER MATCHES "lld-link\\.exe") -+ set(ASMJIT_LINKER_SUPPORTS_NATVIS TRUE) -+ endif() - endif() - --asmjit_add_source(ASMJIT_SRC asmjit/x86 -- x86assembler.cpp -- x86assembler.h -- x86compiler.cpp -- x86compiler.h -- x86compilercontext.cpp -- x86compilercontext_p.h -- x86compilerfunc.cpp -- x86compilerfunc.h -- x86inst.cpp -- x86inst.h -- x86operand.cpp -- x86operand_regs.cpp -- x86operand.h -+# AsmJit - Source -+# =============== -+ -+set(ASMJIT_SRC_LIST -+ asmjit/apibegin.h -+ asmjit/apiend.h -+ asmjit/asmjit.h -+ asmjit/base.h -+ asmjit/build.h -+ asmjit/host.h -+ asmjit/arm.h -+ asmjit/x86.h -+ -+ asmjit/base/assembler.cpp -+ asmjit/base/assembler.h -+ asmjit/base/compiler.cpp -+ asmjit/base/compiler.h -+ asmjit/base/compilercontext.cpp -+ asmjit/base/compilercontext_p.h -+ asmjit/base/compilerfunc.h -+ asmjit/base/constpool.cpp -+ asmjit/base/constpool.h -+ asmjit/base/containers.cpp -+ asmjit/base/containers.h -+ asmjit/base/cpuinfo.cpp -+ asmjit/base/cpuinfo.h -+ asmjit/base/globals.cpp -+ asmjit/base/globals.h -+ asmjit/base/hlstream.cpp -+ asmjit/base/hlstream.h -+ asmjit/base/logger.cpp -+ asmjit/base/logger.h -+ asmjit/base/operand.cpp -+ asmjit/base/operand.h -+ asmjit/base/podvector.cpp -+ asmjit/base/podvector.h -+ asmjit/base/runtime.cpp -+ asmjit/base/runtime.h -+ asmjit/base/utils.cpp -+ asmjit/base/utils.h -+ asmjit/base/vectypes.h -+ asmjit/base/vmem.cpp -+ asmjit/base/vmem.h -+ asmjit/base/zone.cpp -+ asmjit/base/zone.h -+ -+ asmjit/x86/x86assembler.cpp -+ asmjit/x86/x86assembler.h -+ asmjit/x86/x86compiler.cpp -+ asmjit/x86/x86compiler.h -+ asmjit/x86/x86compilercontext.cpp -+ asmjit/x86/x86compilercontext_p.h -+ asmjit/x86/x86compilerfunc.cpp -+ asmjit/x86/x86compilerfunc.h -+ asmjit/x86/x86inst.cpp -+ asmjit/x86/x86inst.h -+ asmjit/x86/x86operand.cpp -+ asmjit/x86/x86operand_regs.cpp -+ asmjit/x86/x86operand.h - ) -+set(ASMJIT_SRC "") -+foreach(src_file ${ASMJIT_SRC_LIST}) -+ set(src_file "${ASMJIT_DIR}/src/${src_file}") -+ list(APPEND ASMJIT_SRC ${src_file}) - --# ============================================================================= --# [AsmJit - Targets] --# ============================================================================= -- --if(NOT ASMJIT_EMBED) -- # Add `asmjit` library. -- asmjit_add_library(asmjit -- "${ASMJIT_SRC}" -- "${ASMJIT_DEPS}" -- "" -- "${ASMJIT_PRIVATE_CFLAGS_DBG}" -- "${ASMJIT_PRIVATE_CFLAGS_REL}" -- ) -- -- foreach(_src_file ${ASMJIT_SRC}) -- get_filename_component(_src_dir ${_src_file} PATH) -- get_filename_component(_src_name ${_src_file} NAME) -- string(REGEX REPLACE "^${ASMJIT_SOURCE_DIR}/" "" targetpath "${_src_dir}") -- if("${_src_name}" MATCHES ".h$") -- if(NOT "${_src_name}" MATCHES "_p.h$") -- install(FILES ${_src_file} DESTINATION "include/${targetpath}") -+ if ("${src_file}" MATCHES "\\.natvis") -+ if (ASMJIT_LINKER_SUPPORTS_NATVIS) -+ list(APPEND ASMJIT_PRIVATE_LFLAGS "-natvis:${src_file}") -+ endif() -+ endif() -+endforeach() -+ -+source_group(TREE "${ASMJIT_DIR}" FILES ${ASMJIT_SRC}) -+ -+# AsmJit - Summary -+# ================ -+ -+message("** AsmJit Summary **") -+message(" ASMJIT_DIR=${ASMJIT_DIR}") -+message(" ASMJIT_TEST=${ASMJIT_TEST}") -+message(" ASMJIT_TARGET_TYPE=${ASMJIT_TARGET_TYPE}") -+message(" ASMJIT_DEPS=${ASMJIT_DEPS}") -+message(" ASMJIT_LIBS=${ASMJIT_LIBS}") -+message(" ASMJIT_CFLAGS=${ASMJIT_CFLAGS}") -+message(" ASMJIT_PRIVATE_CFLAGS=${ASMJIT_PRIVATE_CFLAGS}") -+message(" ASMJIT_PRIVATE_CFLAGS_DBG=${ASMJIT_PRIVATE_CFLAGS_DBG}") -+message(" ASMJIT_PRIVATE_CFLAGS_REL=${ASMJIT_PRIVATE_CFLAGS_REL}") -+ -+# AsmJit - Targets -+# ================ -+ -+if (NOT ASMJIT_EMBED) -+ # Add AsmJit target. -+ asmjit_add_target(asmjit "${ASMJIT_TARGET_TYPE}" -+ SOURCES ${ASMJIT_SRC} -+ LIBRARIES ${ASMJIT_DEPS} -+ CFLAGS ${ASMJIT_PRIVATE_CFLAGS} -+ CFLAGS_DBG ${ASMJIT_PRIVATE_CFLAGS_DBG} -+ CFLAGS_REL ${ASMJIT_PRIVATE_CFLAGS_REL}) -+ -+ target_compile_options(asmjit INTERFACE ${ASMJIT_CFLAGS}) -+ target_include_directories(asmjit BEFORE INTERFACE -+ $ -+ $) -+ -+ # Add asmjit::asmjit alias. -+ add_library(asmjit::asmjit ALIAS asmjit) -+ # TODO: [CMAKE] Deprecated alias - we use projectname::libraryname convention now. -+ add_library(AsmJit::AsmJit ALIAS asmjit) -+ -+ # Add AsmJit install instructions (library and public headers). -+ if (NOT ASMJIT_NO_INSTALL) -+ install(TARGETS asmjit -+ EXPORT asmjit-config -+ RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" -+ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" -+ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" -+ INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") -+ install(EXPORT asmjit-config -+ NAMESPACE asmjit:: -+ DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/asmjit") -+ -+ foreach(_src_file ${ASMJIT_SRC_LIST}) -+ if ("${_src_file}" MATCHES "\\.h$" AND NOT "${_src_file}" MATCHES "_p\\.h$") -+ get_filename_component(_src_dir ${_src_file} PATH) -+ install(FILES "${ASMJIT_DIR}/src/${_src_file}" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${_src_dir}") - endif() -+ endforeach() -+ endif() -+ -+ # Add AsmJit tests. -+ if (ASMJIT_TEST) -+ enable_testing() -+ -+ # Special target that always uses embedded AsmJit. -+ asmjit_add_target(asmjit_test_unit TEST -+ SOURCES ${ASMJIT_SRC} -+ test/asmjit_test_unit.cpp -+ test/broken.cpp -+ test/broken.h -+ LIBRARIES ${ASMJIT_DEPS} -+ CFLAGS ${ASMJIT_PRIVATE_CFLAGS} -+ -DASMJIT_TEST -+ -DASMJIT_STATIC -+ CFLAGS_DBG ${ASMJIT_PRIVATE_CFLAGS_DBG} -+ CFLAGS_REL ${ASMJIT_PRIVATE_CFLAGS_REL}) -+ target_include_directories(asmjit_test_unit BEFORE PRIVATE ${ASMJIT_INCLUDE_DIRS}) -+ -+ asmjit_add_target(asmjit_test_assembler TEST -+ SOURCES test/asmjit_test_assembler.cpp -+ test/asmjit_test_assembler.h -+ test/asmjit_test_assembler_a64.cpp -+ test/asmjit_test_assembler_x64.cpp -+ test/asmjit_test_assembler_x86.cpp -+ LIBRARIES asmjit::asmjit -+ CFLAGS ${ASMJIT_PRIVATE_CFLAGS} -+ CFLAGS_DBG ${ASMJIT_PRIVATE_CFLAGS_DBG} -+ CFLAGS_REL ${ASMJIT_PRIVATE_CFLAGS_REL}) -+ -+ asmjit_add_target(asmjit_test_perf EXECUTABLE -+ SOURCES test/asmjit_test_perf.cpp -+ test/asmjit_test_perf_a64.cpp -+ test/asmjit_test_perf_x86.cpp -+ SOURCES test/asmjit_test_perf.h -+ LIBRARIES asmjit::asmjit -+ CFLAGS ${ASMJIT_PRIVATE_CFLAGS} -+ CFLAGS_DBG ${ASMJIT_PRIVATE_CFLAGS_DBG} -+ CFLAGS_REL ${ASMJIT_PRIVATE_CFLAGS_REL}) -+ -+ foreach(_target asmjit_test_emitters -+ asmjit_test_execute -+ asmjit_test_x86_sections) -+ asmjit_add_target(${_target} TEST -+ SOURCES test/${_target}.cpp -+ LIBRARIES asmjit::asmjit -+ CFLAGS ${ASMJIT_PRIVATE_CFLAGS} -+ CFLAGS_DBG ${ASMJIT_PRIVATE_CFLAGS_DBG} -+ CFLAGS_REL ${ASMJIT_PRIVATE_CFLAGS_REL}) -+ endforeach() -+ -+ if (NOT ASMJIT_NO_INTROSPECTION) -+ asmjit_add_target(asmjit_test_instinfo TEST -+ SOURCES test/asmjit_test_instinfo.cpp -+ LIBRARIES asmjit::asmjit -+ CFLAGS ${ASMJIT_PRIVATE_CFLAGS} -+ CFLAGS_DBG ${ASMJIT_PRIVATE_CFLAGS_DBG} -+ CFLAGS_REL ${ASMJIT_PRIVATE_CFLAGS_REL}) - endif() -- endforeach() - -- # Add `asmjit` tests and samples. -- if(ASMJIT_BUILD_TEST) -- set(ASMJIT_TEST_SRC "") -- set(ASMJIT_TEST_CFLAGS ${ASMJIT_CFLAGS} ${ASMJIT_D}ASMJIT_TEST ${ASMJIT_D}ASMJIT_EMBED) -- asmjit_add_source(ASMJIT_TEST_SRC test asmjit_test_unit.cpp broken.cpp broken.h) -- -- add_executable(asmjit_test_unit ${ASMJIT_SRC} ${ASMJIT_TEST_SRC}) -- target_link_libraries(asmjit_test_unit ${ASMJIT_DEPS}) -- set_target_properties(asmjit_test_unit PROPERTIES LINK_FLAGS "${ASMJIT_PRIVATE_LFLAGS}") -- -- if(CMAKE_BUILD_TYPE) -- if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") -- target_compile_options(asmjit_test_unit PRIVATE ${ASMJIT_TEST_CFLAGS} ${ASMJIT_PRIVATE_CFLAGS_DBG}) -- else() -- target_compile_options(asmjit_test_unit PRIVATE ${ASMJIT_TEST_CFLAGS} ${ASMJIT_PRIVATE_CFLAGS_REL}) -+ if (NOT (ASMJIT_NO_BUILDER OR ASMJIT_NO_COMPILER)) -+ # Vectorcall tests and XMM tests require at least SSE2 in 32-bit mode (in 64-bit mode it's implicit). -+ # Some compilers don't like passing -msse2 for 64-bit targets, and some compilers targeting non-x86 -+ # would pass "-msse2" compile flag check, but with a warning not detected by CMake. Thus, verify that -+ # our target is really 32-bit X86 and only use -msse2 or -arch:SSE2 flags when necessary. -+ set(ASMJIT_SSE2_CFLAGS "") -+ -+ check_cxx_source_compiles(" -+ #if defined(_M_IX86) || defined(__X86__) || defined(__i386__) -+ int target_is_32_bit_x86() { return 1; } -+ #else -+ // Compile error... -+ #endif -+ -+ int main() { -+ return target_is_32_bit_x86(); -+ } -+ " ASMJIT_TARGET_IS_32_BIT_X86) -+ -+ if (ASMJIT_TARGET_IS_32_BIT_X86) -+ if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" OR "x${CMAKE_CXX_COMPILER_FRONTEND_VARIANT}" STREQUAL "xMSVC") -+ asmjit_detect_cflags(ASMJIT_SSE2_CFLAGS "-arch:SSE2") -+ else() -+ asmjit_detect_cflags(ASMJIT_SSE2_CFLAGS "-msse2") -+ endif() - endif() -- else() -- target_compile_options(asmjit_test_unit PRIVATE ${ASMJIT_TEST_CFLAGS} -- $<$:${ASMJIT_PRIVATE_CFLAGS_DBG}> -- $<$>:${ASMJIT_PRIVATE_CFLAGS_REL}>) -+ asmjit_add_target(asmjit_test_compiler TEST -+ SOURCES test/asmjit_test_compiler.cpp -+ test/asmjit_test_compiler.h -+ test/asmjit_test_compiler_a64.cpp -+ test/asmjit_test_compiler_x86.cpp -+ LIBRARIES asmjit::asmjit -+ CFLAGS ${ASMJIT_PRIVATE_CFLAGS} ${ASMJIT_SSE2_CFLAGS} -+ CFLAGS_DBG ${ASMJIT_PRIVATE_CFLAGS_DBG} -+ CFLAGS_REL ${ASMJIT_PRIVATE_CFLAGS_REL}) - endif() - -- foreach(_target asmjit_bench_x86 asmjit_test_opcode asmjit_test_x86) -- add_executable(${_target} "src/test/${_target}.cpp") -- target_compile_options(${_target} PRIVATE ${ASMJIT_CFLAGS}) -- target_link_libraries(${_target} ${ASMJIT_LIBS}) -- endforeach() - endif() - endif() -+ -+cmake_policy(POP) diff --git a/cmake/ports/asmjit/portfile.cmake b/cmake/ports/asmjit/portfile.cmake deleted file mode 100644 index 17b00cf..0000000 --- a/cmake/ports/asmjit/portfile.cmake +++ /dev/null @@ -1,31 +0,0 @@ -vcpkg_from_github( - OUT_SOURCE_PATH SOURCE_PATH - REPO asmjit/asmjit - REF fb9f82cb61df36aa513d054e748dc6769045f33e - SHA512 937a1ea1855d7eef53e6afc3401dd015e5de26d174dc667f8be4580a2d8388a703fff4298e4e2ca9ea490c5053197f33d3b010456985243931a1c0a6845926cc - HEAD_REF master - PATCHES - asmjit.patch -) - -set(VCPKG_LIBRARY_LINKAGE static) - -vcpkg_cmake_configure( - SOURCE_PATH "${SOURCE_PATH}" - OPTIONS - -DASMJIT_STATIC=TRUE -) - -vcpkg_cmake_install() -vcpkg_copy_pdbs() - -vcpkg_cmake_config_fixup(CONFIG_PATH lib/cmake/asmjit) - -file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/include") - -# vcpkg_replace_string("${CURRENT_PACKAGES_DIR}/include/asmjit/core/api-config.h" -# "#if !defined(ASMJIT_STATIC)" -# "#if 0" -# ) - -vcpkg_install_copyright(FILE_LIST "${SOURCE_PATH}/LICENSE.md") diff --git a/cmake/ports/asmjit/vcpkg.json b/cmake/ports/asmjit/vcpkg.json deleted file mode 100644 index 7190016..0000000 --- a/cmake/ports/asmjit/vcpkg.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "asmjit", - "version-string": "fb9f82c", - "description": "Complete x86/x64 JIT and Remote Assembler for C++", - "homepage": "https://github.com/asmjit/asmjit", - "supports": "!arm", - "dependencies": [ - { - "name": "vcpkg-cmake", - "host": true - }, - { - "name": "vcpkg-cmake-config", - "host": true - } - ] -} diff --git a/vcpkg-configuration.json b/vcpkg-configuration.json new file mode 100644 index 0000000..7990f77 --- /dev/null +++ b/vcpkg-configuration.json @@ -0,0 +1,21 @@ +{ + "default-registry": { + "kind": "git", + "repository": "https://github.com/Microsoft/vcpkg", + "baseline": "f61a294e765b257926ae9e9d85f96468a0af74e7" + }, + "registries": [ + { + "kind": "git", + "repository": "https://github.com/Microsoft/vcpkg", + "baseline": "f61a294e765b257926ae9e9d85f96468a0af74e7", + "packages": ["boost*", "boost-*"] + }, + { + "kind": "git", + "repository": "https://github.com/ModOrganizer2/vcpkg-registry", + "baseline": "27d8adbfe9e4ce88a875be3a45fadab69869eb60", + "packages": ["asmjit", "spdlog"] + } + ] +} diff --git a/vcpkg.json b/vcpkg.json index ba611cc..818fe75 100644 --- a/vcpkg.json +++ b/vcpkg.json @@ -1,10 +1,7 @@ { "dependencies": [ "asmjit", - { - "name": "spdlog", - "features": ["wchar"] - }, + "spdlog", "libudis86", "boost-algorithm", "boost-any", From b7195447c0caec24850685235790c7faaccebb22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mika=C3=ABl=20Capelle?= Date: Sun, 14 Jul 2024 10:06:08 +0200 Subject: [PATCH 20/20] Bump version to 0.5.6.2 and add job to publish release on tags. --- .github/workflows/build.yml | 65 +++++++++++++++++++++++++++++------ include/usvfs/usvfs_version.h | 2 +- 2 files changed, 55 insertions(+), 12 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 19781be..2c8f9f4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -3,6 +3,8 @@ name: Build USVFS on: push: branches: [master, dev/cmake] + tags: + - "*" pull_request: types: [opened, synchronize, reopened] @@ -34,7 +36,7 @@ jobs: vcpkgJsonGlob: ${{ github.workspace }}/usvfs/vcpkg.json # configure - - run: cmake --preset vs2022-windows-${{ matrix.arch }} -B build_${{ matrix.arch }} "-DCMAKE_INSTALL_PREFIX=install" + - run: cmake --preset vs2022-windows-${{ matrix.arch }} -B build_${{ matrix.arch }} "-DCMAKE_INSTALL_PREFIX=install/${{ matrix.config }}" env: VCPKG_ROOT: ${{ github.workspace }}/vcpkg @@ -47,7 +49,7 @@ jobs: - uses: actions/upload-artifact@master with: name: usvfs_${{ matrix.config }}_${{ matrix.arch }} - path: ./install + path: ./install/${{ matrix.config }} # package test/dlls/etc. for tests @@ -64,20 +66,15 @@ jobs: name: usvfs-tests_${{ matrix.config }}_${{ matrix.arch }} path: ./test/bin - # merge x86 / x64 artifacts - merge-artifacts: + # merge x86 / x64 artifacts for tests (root bin/lib and test folder) + merge-artifacts-for-tests: runs-on: ubuntu-latest - name: Merge Artifacts + name: Merge Test Artifacts needs: build strategy: matrix: config: [Debug, Release] steps: - - name: Merge USVFS install - uses: actions/upload-artifact/merge@v4 - with: - name: usvfs_${{ matrix.config }} - pattern: usvfs_${{ matrix.config }}_* - name: Merge USVFS libs uses: actions/upload-artifact/merge@v4 with: @@ -94,9 +91,24 @@ jobs: name: usvfs-tests_${{ matrix.config }} pattern: usvfs-tests_${{ matrix.config }}_* + # merge x86 / x64 artifacts (install folder) + merge-artifacts-for-release: + runs-on: ubuntu-latest + name: Merge Install Artifacts + needs: build + strategy: + matrix: + config: [Debug, Release] + steps: + - name: Merge USVFS install + uses: actions/upload-artifact/merge@v4 + with: + name: usvfs_${{ matrix.config }} + pattern: usvfs_${{ matrix.config }}_* + test: name: Test USVFS - needs: merge-artifacts + needs: merge-artifacts-for-tests runs-on: windows-2022 strategy: matrix: @@ -136,3 +148,34 @@ jobs: if-no-files-found: ignore retention-days: 7 overwrite: true + + publish: + if: github.ref_type == 'tag' + needs: [merge-artifacts-for-release, test] + runs-on: windows-2022 + permissions: + contents: write + steps: + # USVFS does not use different names for debug and release so we are going to + # retrieve both install artifacts and put them under install/ and install/debug/ + + - name: Download Release Artifact + uses: actions/download-artifact@master + with: + name: usvfs_Release + path: ./install + + - name: Download Debug Artifact + uses: actions/download-artifact@master + with: + name: usvfs_Debug + path: ./install/debug + + - name: Create USVFS Base archive + run: 7z a usvfs_${{ github.ref_name }}.7z ./install/* + + - name: Publish Release + env: + GH_TOKEN: ${{ github.token }} + GH_REPO: ${{ github.repository }} + run: gh release create --draft=false --notes="Release ${{ github.ref_name }}" "${{ github.ref_name }}" ./usvfs_${{ github.ref_name }}.7z diff --git a/include/usvfs/usvfs_version.h b/include/usvfs/usvfs_version.h index 71ded55..e998df3 100644 --- a/include/usvfs/usvfs_version.h +++ b/include/usvfs/usvfs_version.h @@ -3,7 +3,7 @@ #define USVFS_VERSION_MAJOR 0 #define USVFS_VERSION_MINOR 5 #define USVFS_VERSION_BUILD 6 -#define USVFS_VERSION_REVISION 1 +#define USVFS_VERSION_REVISION 2 #define USVFS_BUILD_STRING "" #define USVFS_BUILD_WSTRING L""