diff --git a/.gitignore b/.gitignore index be9e97d76e97f..39cd4ecf4bed1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ .vscode/ +.devcontainer/ +.cache/ .idea/ .kdev4/ @@ -13,3 +15,4 @@ imgui.ini .DS_Store CMakeUserPresets.json Brewfile.lock.json +compile_commands.json diff --git a/CMakePresets.json b/CMakePresets.json index 83c9e53429b95..55a0ec16a8df0 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -17,6 +17,7 @@ "CMAKE_BUILD_TYPE": "Debug", "CMAKE_C_COMPILER": "gcc", "CMAKE_CXX_COMPILER": "g++", + "CMAKE_EXPORT_COMPILE_COMMANDS": "ON", "IMHEX_PATTERNS_PULL_MASTER": "ON", "CMAKE_INSTALL_PREFIX": "./install", "USE_SYSTEM_CAPSTONE": "ON", diff --git a/cmake/build_helpers.cmake b/cmake/build_helpers.cmake index a3ee0a45ae329..33af041205fc7 100644 --- a/cmake/build_helpers.cmake +++ b/cmake/build_helpers.cmake @@ -387,7 +387,7 @@ function(configureProject) # Support Xcode's multi configuration paradigm by placing built artifacts into separate directories set(IMHEX_MAIN_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/Configs/$" PARENT_SCOPE) else() - set(IMHEX_MAIN_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" PARENT_SCOPE) + set(IMHEX_MAIN_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" PARENT_SCOPE) endif() endfunction() @@ -499,16 +499,16 @@ function(downloadImHexPatternsFiles dest) # Maybe patterns are cloned to a subdirectory if (NOT EXISTS ${imhex_patterns_SOURCE_DIR}) - set(imhex_patterns_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ImHex-Patterns") + set(imhex_patterns_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ImHex-Patterns") endif() # Or a sibling directory if (NOT EXISTS ${imhex_patterns_SOURCE_DIR}) - set(imhex_patterns_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../ImHex-Patterns") + set(imhex_patterns_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../ImHex-Patterns") endif() endif () - if (NOT EXISTS ${imhex_patterns_SOURCE_DIR}) + if (NOT EXISTS ${imhex_patterns_SOURCE_DIR}) message(WARNING "Failed to locate ImHex-Patterns repository, some resources will be missing during install!") elseif(XCODE) # The Xcode build has multiple configurations, which each need a copy of these files @@ -526,8 +526,18 @@ function(downloadImHexPatternsFiles dest) file(GENERATE OUTPUT "${dest}/${relativePath}" INPUT "${imhex_patterns_SOURCE_DIR}/${relativePath}") endforeach() else() + # Make sure the IMHEX_MAIN_OUTPUT_DIRECTORY exists, as CREATE_LINK doesn't create missing intermediate directories + file(MAKE_DIRECTORY "${IMHEX_MAIN_OUTPUT_DIRECTORY}") set(PATTERNS_FOLDERS_TO_INSTALL constants encodings includes patterns magic nodes) foreach (FOLDER ${PATTERNS_FOLDERS_TO_INSTALL}) + # Make the pattern files available to ImHex binaries started from the build directory + if (NOT IMHEX_OFFLINE_BUILD) + file(COPY "${imhex_patterns_SOURCE_DIR}/${FOLDER}" DESTINATION "${IMHEX_MAIN_OUTPUT_DIRECTORY}" PATTERN "**/_schema.json" EXCLUDE) + else() + # If it is an offline build, the imhex_patterns_SOURCE_DIR location is likely a git clone + # Create the directories as symbolic links, so that any changes get mirrored both ways + file(CREATE_LINK "${imhex_patterns_SOURCE_DIR}/${FOLDER}" "${IMHEX_MAIN_OUTPUT_DIRECTORY}/${FOLDER}" COPY_ON_ERROR SYMBOLIC) + endif() install(DIRECTORY "${imhex_patterns_SOURCE_DIR}/${FOLDER}" DESTINATION "${dest}" PATTERN "**/_schema.json" EXCLUDE) endforeach () endif () @@ -735,8 +745,8 @@ macro(addBundledLibraries) set_target_properties( libpl PROPERTIES - RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} - LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} + RUNTIME_OUTPUT_DIRECTORY ${IMHEX_MAIN_OUTPUT_DIRECTORY} + LIBRARY_OUTPUT_DIRECTORY ${IMHEX_MAIN_OUTPUT_DIRECTORY} ) endif() enableUnityBuild(libpl) diff --git a/cmake/modules/ImHexPlugin.cmake b/cmake/modules/ImHexPlugin.cmake index b20b0e50ae3b3..3c69a9b8a66c2 100644 --- a/cmake/modules/ImHexPlugin.cmake +++ b/cmake/modules/ImHexPlugin.cmake @@ -56,6 +56,7 @@ macro(add_imhex_plugin) set_target_properties(${IMHEX_PLUGIN_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${IMHEX_MAIN_OUTPUT_DIRECTORY}/plugins" + LIBRARY_OUTPUT_DIRECTORY "${IMHEX_MAIN_OUTPUT_DIRECTORY}/plugins" CXX_STANDARD 23 PREFIX "" SUFFIX ${IMHEX_PLUGIN_SUFFIX} diff --git a/lib/libimhex/CMakeLists.txt b/lib/libimhex/CMakeLists.txt index abcd9677faa54..1b138d96470df 100644 --- a/lib/libimhex/CMakeLists.txt +++ b/lib/libimhex/CMakeLists.txt @@ -151,5 +151,6 @@ set_property(TARGET libimhex PROPERTY INTERPROCEDURAL_OPTIMIZATION FALSE) add_dependencies(imhex_all libimhex) install(FILES "$" DESTINATION "${CMAKE_INSTALL_LIBDIR}" PERMISSIONS ${LIBRARY_PERMISSIONS}) -set_target_properties(libimhex PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) +set_target_properties(libimhex PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${IMHEX_MAIN_OUTPUT_DIRECTORY}) +set_target_properties(libimhex PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${IMHEX_MAIN_OUTPUT_DIRECTORY}) set_target_properties(libimhex PROPERTIES PREFIX "") \ No newline at end of file diff --git a/main/forwarder/CMakeLists.txt b/main/forwarder/CMakeLists.txt index 9a04c35173e1f..94478a845660a 100644 --- a/main/forwarder/CMakeLists.txt +++ b/main/forwarder/CMakeLists.txt @@ -9,5 +9,5 @@ target_link_libraries(main-forwarder PRIVATE wolv::io ${FMT_LIBRARIES}) add_dependencies(imhex_all main-forwarder) set_target_properties(main-forwarder PROPERTIES OUTPUT_NAME "imhex" - RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/../.. + RUNTIME_OUTPUT_DIRECTORY ${IMHEX_MAIN_OUTPUT_DIRECTORY} ) \ No newline at end of file diff --git a/main/updater/CMakeLists.txt b/main/updater/CMakeLists.txt index 4e07614a7c9dd..c8e34ccbac53e 100644 --- a/main/updater/CMakeLists.txt +++ b/main/updater/CMakeLists.txt @@ -1,4 +1,4 @@ -project(updater) +project(updater) add_executable(updater source/main.cpp @@ -16,5 +16,5 @@ endif() set_target_properties(updater PROPERTIES OUTPUT_NAME "imhex-updater" - RUNTIME_OUTPUT_DIRECTORY ${OUTPUT_DIRECTORY} + RUNTIME_OUTPUT_DIRECTORY ${IMHEX_MAIN_OUTPUT_DIRECTORY} ) \ No newline at end of file