diff --git a/.github/workflows/aarch64.yml b/.github/workflows/aarch64.yml index 2e0dd36f..38a794bb 100644 --- a/.github/workflows/aarch64.yml +++ b/.github/workflows/aarch64.yml @@ -44,7 +44,7 @@ jobs: run: > cmake -B ${{github.workspace}}/build-arm64 - -DBoost_INCLUDE_DIRS=${{github.workspace}}/externals/ext-boost + -DBOOST_INCLUDEDIR=${{github.workspace}}/externals/ext-boost -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DDYNARMIC_TESTS_USE_UNICORN=0 -DDYNARMIC_USE_LLVM=0 @@ -62,7 +62,7 @@ jobs: run: > cmake -B ${{github.workspace}}/build-x64 - -DBoost_INCLUDE_DIRS=${{github.workspace}}/externals/ext-boost + -DBOOST_INCLUDEDIR=${{github.workspace}}/externals/ext-boost -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache diff --git a/.github/workflows/x86-64.yml b/.github/workflows/x86-64.yml index 751133ff..1804f647 100644 --- a/.github/workflows/x86-64.yml +++ b/.github/workflows/x86-64.yml @@ -57,7 +57,7 @@ jobs: run: > cmake -B ${{github.workspace}}/build - -DBoost_INCLUDE_DIRS=${{github.workspace}}/externals/ext-boost + -DBOOST_INCLUDEDIR=${{github.workspace}}/externals/ext-boost -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DDYNARMIC_ENABLE_CPU_FEATURE_DETECTION=${{matrix.cpu_detection}} -DDYNARMIC_TESTS_USE_UNICORN=1 @@ -71,7 +71,7 @@ jobs: run: > cmake -B ${{github.workspace}}/build - -DBoost_INCLUDE_DIRS=${{github.workspace}}/externals/ext-boost + -DBOOST_INCLUDEDIR=${{github.workspace}}/externals/ext-boost -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DDYNARMIC_ENABLE_CPU_FEATURE_DETECTION=${{matrix.cpu_detection}} -DDYNARMIC_TESTS_USE_UNICORN=1 @@ -85,7 +85,7 @@ jobs: run: > cmake -B ${{github.workspace}}/build - -DBoost_INCLUDE_DIRS=${{github.workspace}}/externals/ext-boost + -DBOOST_INCLUDEDIR=${{github.workspace}}/externals/ext-boost -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DDYNARMIC_ENABLE_CPU_FEATURE_DETECTION=${{matrix.cpu_detection}} -G "Visual Studio 17 2022" diff --git a/CMakeLists.txt b/CMakeLists.txt index 9a8c4acf..b896d910 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -113,36 +113,14 @@ if (NOT DEFINED ARCHITECTURE) endif() message(STATUS "Target architecture: ${ARCHITECTURE}") -# Include Boost -if (NOT TARGET boost) - if (NOT Boost_INCLUDE_DIRS) - find_package(Boost 1.57.0 REQUIRED) - endif() - add_library(boost INTERFACE) - target_include_directories(boost SYSTEM INTERFACE ${Boost_INCLUDE_DIRS}) -endif() +# Forced use of external for non-REQUIRED library is possible with e.g. cmake -DCMAKE_DISABLE_FIND_PACKAGE_fmt=ON ... +find_package(Boost 1.57 REQUIRED) +find_package(fmt 9) +find_package(tsl-robin-map) -if (DYNARMIC_NO_BUNDLED_FMT AND NOT TARGET fmt AND NOT TARGET fmt::fmt) - find_package(fmt REQUIRED) - add_library(fmt ALIAS fmt::fmt) -endif() - -if (DYNARMIC_NO_BUNDLED_ROBIN_MAP AND NOT TARGET tsl::robin_map) - find_package(tsl-robin-map REQUIRED) -endif() - -if (DYNARMIC_NO_BUNDLED_XBYAK AND NOT TARGET xbyak) - if (ARCHITECTURE STREQUAL "x86" OR ARCHITECTURE STREQUAL "x86_64") - find_package(xbyak REQUIRED) - add_library(xbyak ALIAS xbyak::xbyak) - endif() -endif() - -if (DYNARMIC_NO_BUNDLED_ZYDIS AND NOT TARGET Zydis) - if (ARCHITECTURE STREQUAL "x86" OR ARCHITECTURE STREQUAL "x86_64") - find_package(Zydis REQUIRED) - add_library(Zydis ALIAS Zydis::Zydis) - endif() +if (ARCHITECTURE STREQUAL "x86" OR ARCHITECTURE STREQUAL "x86_64") + find_package(xbyak 6) + find_package(Zydis 4) endif() # Enable unit-testing. @@ -156,13 +134,11 @@ if (DYNARMIC_USE_LLVM) llvm_map_components_to_libnames(llvm_libs armdesc armdisassembler aarch64desc aarch64disassembler x86desc x86disassembler) endif() -if (DYNARMIC_TESTS_USE_UNICORN AND DYNARMIC_TESTS) - find_package(Unicorn REQUIRED) -endif() - -if (DYNARMIC_TESTS AND DYNARMIC_NO_BUNDLED_CATCH AND NOT TARGET catch) - find_package(Catch2 REQUIRED) - add_library(catch ALIAS Catch2::Catch2) +if (DYNARMIC_TESTS) + find_package(Catch2 2) + if (DYNARMIC_TESTS_USE_UNICORN) + find_package(Unicorn REQUIRED) + endif() endif() # Pull in externals CMakeLists for libs where available @@ -177,28 +153,26 @@ endif() # # Install # -if (MASTER_PROJECT) - include(GNUInstallDirs) - include(CMakePackageConfigHelpers) +include(GNUInstallDirs) +include(CMakePackageConfigHelpers) - install(TARGETS dynarmic EXPORT dynarmicTargets) - install(EXPORT dynarmicTargets - NAMESPACE dynarmic:: - DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/dynarmic" - ) +install(TARGETS dynarmic EXPORT dynarmicTargets) +install(EXPORT dynarmicTargets + NAMESPACE dynarmic:: + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/dynarmic" +) - configure_package_config_file(CMakeModules/dynarmicConfig.cmake.in - dynarmicConfig.cmake - INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/dynarmic" - ) - write_basic_package_version_file(dynarmicConfigVersion.cmake - COMPATIBILITY SameMajorVersion - ) - install(FILES - "${CMAKE_CURRENT_BINARY_DIR}/dynarmicConfig.cmake" - "${CMAKE_CURRENT_BINARY_DIR}/dynarmicConfigVersion.cmake" - DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/dynarmic" - ) +configure_package_config_file(CMakeModules/dynarmicConfig.cmake.in + dynarmicConfig.cmake + INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/dynarmic" +) +write_basic_package_version_file(dynarmicConfigVersion.cmake + COMPATIBILITY SameMajorVersion +) +install(FILES + "${CMAKE_CURRENT_BINARY_DIR}/dynarmicConfig.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/dynarmicConfigVersion.cmake" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/dynarmic" +) - install(DIRECTORY src/dynarmic TYPE INCLUDE FILES_MATCHING PATTERN "*.h") -endif() +install(DIRECTORY src/dynarmic TYPE INCLUDE FILES_MATCHING PATTERN "*.h") diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index dcc25aaa..6423de85 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -10,58 +10,59 @@ endif() # catch -if (DYNARMIC_TESTS AND NOT TARGET catch) - add_library(catch INTERFACE) - target_include_directories(catch INTERFACE $) +if (NOT TARGET Catch2::Catch2) + if (DYNARMIC_TESTS) + add_library(Catch2::Catch2 INTERFACE IMPORTED GLOBAL) + target_include_directories(Catch2::Catch2 INTERFACE catch/include) + endif() endif() # fmt -if (NOT TARGET fmt AND NOT TARGET fmt::fmt) +if (NOT TARGET fmt::fmt) # fmtlib formatting library - add_subdirectory(fmt) + option(FMT_INSTALL "" ON) + add_subdirectory(fmt EXCLUDE_FROM_ALL) endif() # mcl if (NOT TARGET merry::mcl) - add_subdirectory(mcl) + option(MCL_INSTALL "" ON) + add_subdirectory(mcl EXCLUDE_FROM_ALL) endif() # oaknut if (NOT TARGET merry::oaknut) if (ARCHITECTURE STREQUAL "arm64") - add_subdirectory(oaknut) + add_subdirectory(oaknut EXCLUDE_FROM_ALL) endif() endif() # robin-map if (NOT TARGET tsl::robin_map) - add_subdirectory(robin-map) + add_subdirectory(robin-map EXCLUDE_FROM_ALL) endif() # xbyak -if (NOT TARGET xbyak) +if (NOT TARGET xbyak::xbyak) if (ARCHITECTURE STREQUAL "x86" OR ARCHITECTURE STREQUAL "x86_64") - add_library(xbyak INTERFACE) - file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/xbyak/include) - file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/xbyak/xbyak DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/xbyak/include) - target_include_directories(xbyak SYSTEM INTERFACE ${CMAKE_CURRENT_BINARY_DIR}/xbyak/include) - target_compile_definitions(xbyak INTERFACE XBYAK_NO_OP_NAMES) + add_subdirectory(xbyak EXCLUDE_FROM_ALL) endif() endif() # zydis -if (NOT TARGET Zydis) +if (NOT TARGET Zydis::Zydis) if (ARCHITECTURE STREQUAL "x86" OR ARCHITECTURE STREQUAL "x86_64") option(ZYDIS_BUILD_TOOLS "" OFF) option(ZYDIS_BUILD_EXAMPLES "" OFF) option(ZYDIS_BUILD_DOXYGEN "" OFF) set(ZYAN_ZYCORE_PATH "${CMAKE_CURRENT_LIST_DIR}/zycore" CACHE PATH "") add_subdirectory(zydis EXCLUDE_FROM_ALL) + add_library(Zydis::Zydis ALIAS Zydis) endif() endif() diff --git a/src/dynarmic/CMakeLists.txt b/src/dynarmic/CMakeLists.txt index 75c24feb..423de034 100644 --- a/src/dynarmic/CMakeLists.txt +++ b/src/dynarmic/CMakeLists.txt @@ -257,8 +257,8 @@ endif() if (ARCHITECTURE STREQUAL "x86_64") target_link_libraries(dynarmic PRIVATE - $ - $ + xbyak::xbyak + Zydis::Zydis ) target_sources(dynarmic PRIVATE @@ -366,7 +366,7 @@ if (ARCHITECTURE STREQUAL "x86_64") target_sources(dynarmic PRIVATE backend/x64/exception_handler_generic.cpp) endif() elseif(ARCHITECTURE STREQUAL "arm64") - target_link_libraries(dynarmic PRIVATE $) + target_link_libraries(dynarmic PRIVATE merry::oaknut) target_sources(dynarmic PRIVATE backend/arm64/a32_jitstate.cpp @@ -431,13 +431,11 @@ set_target_properties(dynarmic PROPERTIES SOVERSION ${dynarmic_VERSION_MAJOR} ) target_compile_options(dynarmic PRIVATE ${DYNARMIC_CXX_FLAGS}) -# $ required because of https://gitlab.kitware.com/cmake/cmake/-/issues/15415 target_link_libraries(dynarmic - PUBLIC - $ PRIVATE - $ - $ + Boost::boost + fmt::fmt + merry::mcl tsl::robin_map "$<$:${llvm_libs}>" ) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 6587e606..5e25a3ca 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -55,7 +55,7 @@ if (DYNARMIC_TESTS_USE_UNICORN) endif() if (ARCHITECTURE STREQUAL "x86_64") - target_link_libraries(dynarmic_tests PRIVATE xbyak) + target_link_libraries(dynarmic_tests PRIVATE xbyak::xbyak) target_sources(dynarmic_tests PRIVATE x64_cpu_info.cpp @@ -78,7 +78,7 @@ if (("A32" IN_LIST DYNARMIC_FRONTENDS) AND ("A64" IN_LIST DYNARMIC_FRONTENDS)) create_target_directory_groups(dynarmic_print_info) - target_link_libraries(dynarmic_print_info PRIVATE dynarmic boost catch fmt) + target_link_libraries(dynarmic_print_info PRIVATE dynarmic Boost::boost Catch2::Catch2 fmt::fmt merry::mcl) target_include_directories(dynarmic_print_info PRIVATE . ../src) target_compile_options(dynarmic_print_info PRIVATE ${DYNARMIC_CXX_FLAGS}) target_compile_definitions(dynarmic_print_info PRIVATE FMT_USE_USER_DEFINED_LITERALS=1) @@ -93,7 +93,7 @@ if ("A32" IN_LIST DYNARMIC_FRONTENDS) create_target_directory_groups(dynarmic_test_generator) - target_link_libraries(dynarmic_test_generator PRIVATE dynarmic boost catch fmt) + target_link_libraries(dynarmic_test_generator PRIVATE dynarmic Boost::boost Catch2::Catch2 fmt::fmt merry::mcl) target_include_directories(dynarmic_test_generator PRIVATE . ../src) target_compile_options(dynarmic_test_generator PRIVATE ${DYNARMIC_CXX_FLAGS}) target_compile_definitions(dynarmic_test_generator PRIVATE FMT_USE_USER_DEFINED_LITERALS=1) @@ -101,7 +101,7 @@ endif() create_target_directory_groups(dynarmic_tests) -target_link_libraries(dynarmic_tests PRIVATE dynarmic boost catch fmt) +target_link_libraries(dynarmic_tests PRIVATE dynarmic Boost::boost Catch2::Catch2 fmt::fmt merry::mcl) target_include_directories(dynarmic_tests PRIVATE . ../src) target_compile_options(dynarmic_tests PRIVATE ${DYNARMIC_CXX_FLAGS}) target_compile_definitions(dynarmic_tests PRIVATE FMT_USE_USER_DEFINED_LITERALS=1 CATCH_CONFIG_ENABLE_BENCHMARKING=1)