2022-02-21 22:47:56 +01:00
include ( FetchContent )
2022-08-04 20:37:57 +02:00
if ( IMHEX_STRIP_RELEASE )
if ( CMAKE_BUILD_TYPE STREQUAL "Release" )
set ( CPACK_STRIP_FILES TRUE )
endif ( )
2023-05-20 13:37:57 +02:00
if ( CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang" )
add_link_options ( $< $<CONFIG:RELEASE > :-s> )
endif ( )
2022-07-31 17:29:57 +02:00
endif ( )
2023-05-05 22:03:45 +02:00
macro ( addDefines )
2022-08-03 16:36:21 +02:00
if ( NOT IMHEX_VERSION )
message ( FATAL_ERROR "IMHEX_VERSION is not defined" )
endif ( )
2021-04-12 20:36:16 +02:00
set ( CMAKE_RC_FLAGS "${CMAKE_RC_FLAGS} -DPROJECT_VERSION_MAJOR=${PROJECT_VERSION_MAJOR} -DPROJECT_VERSION_MINOR=${PROJECT_VERSION_MINOR} -DPROJECT_VERSION_PATCH=${PROJECT_VERSION_PATCH} " )
2022-01-23 23:28:56 +01:00
2022-08-07 23:50:49 +02:00
set ( IMHEX_VERSION_STRING ${ IMHEX_VERSION } )
2022-02-17 11:42:56 +01:00
if ( CMAKE_BUILD_TYPE STREQUAL "Release" )
2022-08-07 23:50:49 +02:00
set ( IMHEX_VERSION_STRING ${ IMHEX_VERSION_STRING } )
2023-05-13 17:49:53 +02:00
add_compile_definitions ( NDEBUG )
2022-02-17 11:42:56 +01:00
elseif ( CMAKE_BUILD_TYPE STREQUAL "Debug" )
2022-08-07 23:50:49 +02:00
set ( IMHEX_VERSION_STRING ${ IMHEX_VERSION_STRING } -Debug )
2024-01-26 21:11:42 +01:00
add_compile_definitions ( DEBUG )
2022-02-17 11:42:56 +01:00
elseif ( CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo" )
2023-07-15 14:29:14 +02:00
set ( IMHEX_VERSION_STRING ${ IMHEX_VERSION_STRING } )
2023-05-13 17:49:53 +02:00
add_compile_definitions ( NDEBUG )
2022-02-17 11:42:56 +01:00
elseif ( CMAKE_BUILD_TYPE STREQUAL "MinSizeRel" )
2022-08-07 23:50:49 +02:00
set ( IMHEX_VERSION_STRING ${ IMHEX_VERSION_STRING } -MinSizeRel )
2023-05-13 17:49:53 +02:00
add_compile_definitions ( NDEBUG )
2022-02-17 11:42:56 +01:00
endif ( )
2023-10-04 12:00:32 +02:00
2024-01-26 12:36:07 +01:00
if ( IMHEX_ENABLE_STD_ASSERTS )
2024-01-26 21:11:42 +01:00
add_compile_definitions ( _GLIBCXX_DEBUG _GLIBCXX_VERBOSE )
2024-01-26 12:36:07 +01:00
endif ( )
2023-10-04 12:00:32 +02:00
if ( IMHEX_STATIC_LINK_PLUGINS )
add_compile_definitions ( IMHEX_STATIC_LINK_PLUGINS )
endif ( )
2021-01-22 23:27:01 +01:00
endmacro ( )
2023-06-26 14:01:45 +02:00
function ( addDefineToSource SOURCE DEFINE )
set_property (
S O U R C E $ { S O U R C E }
A P P E N D
P R O P E R T Y C O M P I L E _ D E F I N I T I O N S " $ { D E F I N E } "
)
2024-02-29 21:15:51 +01:00
# Disable precompiled headers for this file
set_source_files_properties ( ${ SOURCE } PROPERTIES SKIP_PRECOMPILE_HEADERS ON )
2023-06-26 14:01:45 +02:00
endfunction ( )
2021-01-22 23:27:01 +01:00
# Detect current OS / System
macro ( detectOS )
if ( WIN32 )
2022-01-23 23:28:56 +01:00
add_compile_definitions ( OS_WINDOWS )
2021-03-01 08:56:49 +01:00
set ( CMAKE_INSTALL_BINDIR "." )
set ( CMAKE_INSTALL_LIBDIR "." )
set ( PLUGINS_INSTALL_LOCATION "plugins" )
2024-01-29 21:18:32 +01:00
add_compile_definitions ( WIN32_LEAN_AND_MEAN )
2022-01-23 23:28:56 +01:00
elseif ( APPLE )
add_compile_definitions ( OS_MACOS )
2021-03-01 08:56:49 +01:00
set ( CMAKE_INSTALL_BINDIR "." )
set ( CMAKE_INSTALL_LIBDIR "." )
set ( PLUGINS_INSTALL_LOCATION "plugins" )
2022-06-25 12:19:59 +02:00
enable_language ( OBJC )
enable_language ( OBJCXX )
2023-10-04 12:00:32 +02:00
elseif ( EMSCRIPTEN )
add_compile_definitions ( OS_WEB )
2022-01-23 23:28:56 +01:00
elseif ( UNIX AND NOT APPLE )
add_compile_definitions ( OS_LINUX )
2022-08-04 20:37:57 +02:00
include ( GNUInstallDirs )
if ( IMHEX_PLUGINS_IN_SHARE )
set ( PLUGINS_INSTALL_LOCATION "share/imhex/plugins" )
else ( )
set ( PLUGINS_INSTALL_LOCATION "${CMAKE_INSTALL_LIBDIR}/imhex/plugins" )
2024-01-04 17:55:53 +01:00
# Add System plugin location for plugins to be loaded from
# IMPORTANT: This does not work for Sandboxed or portable builds such as the Flatpak or AppImage release
add_compile_definitions ( SYSTEM_PLUGINS_LOCATION= "${CMAKE_INSTALL_FULL_LIBDIR}/imhex" )
2022-08-04 20:37:57 +02:00
endif ( )
2022-08-26 00:21:17 +02:00
2022-01-23 23:28:56 +01:00
else ( )
2021-01-22 23:27:01 +01:00
message ( FATAL_ERROR "Unknown / unsupported system!" )
endif ( )
2022-08-26 00:21:17 +02:00
2021-01-22 23:27:01 +01:00
endmacro ( )
2022-01-15 00:14:12 +01:00
macro ( configurePackingResources )
2021-01-22 23:27:01 +01:00
if ( WIN32 )
2023-10-22 23:39:14 +02:00
if ( NOT ( CMAKE_BUILD_TYPE STREQUAL "Debug" ) )
set ( APPLICATION_TYPE WIN32 )
endif ( )
2022-02-08 09:32:38 +01:00
set ( IMHEX_ICON "${IMHEX_BASE_FOLDER}/resources/resource.rc" )
2021-01-22 23:27:01 +01:00
2023-11-04 01:11:50 +01:00
if ( IMHEX_GENERATE_PACKAGE )
2021-01-22 23:27:01 +01:00
set ( CPACK_GENERATOR "WIX" )
2023-03-26 11:22:50 +02:00
set ( CPACK_PACKAGE_NAME "ImHex" )
2021-05-24 19:09:32 +02:00
set ( CPACK_PACKAGE_VENDOR "WerWolv" )
2021-01-22 23:27:01 +01:00
set ( CPACK_WIX_UPGRADE_GUID "05000E99-9659-42FD-A1CF-05C554B39285" )
2022-08-10 22:47:21 +02:00
set ( CPACK_WIX_PRODUCT_ICON "${PROJECT_SOURCE_DIR}/resources/dist/windows/icon.ico" )
set ( CPACK_WIX_UI_BANNER "${PROJECT_SOURCE_DIR}/resources/dist/windows/wix_banner.png" )
set ( CPACK_WIX_UI_DIALOG "${PROJECT_SOURCE_DIR}/resources/dist/windows/wix_dialog.png" )
set ( CPACK_WIX_CULTURES "en-US;de-DE;ja-JP;it-IT;pt-BR;zh-CN;zh-TW" )
2021-01-22 23:27:01 +01:00
set ( CPACK_PACKAGE_INSTALL_DIRECTORY "ImHex" )
2022-01-15 00:14:12 +01:00
set_property ( INSTALL "$<TARGET_FILE_NAME:main>"
2021-01-22 23:27:01 +01:00
P R O P E R T Y C P A C K _ S T A R T _ M E N U _ S H O R T C U T S " I m H e x "
2023-12-08 14:00:32 +01:00
)
2022-08-10 22:47:21 +02:00
set ( CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/resources/dist/windows/LICENSE.rtf" )
2021-01-22 23:27:01 +01:00
endif ( )
2023-12-30 19:11:33 +01:00
elseif ( APPLE OR ${ CMAKE_HOST_SYSTEM_NAME } MATCHES "Darwin" )
set ( IMHEX_ICON "${IMHEX_BASE_FOLDER}/resources/dist/macos/AppIcon.icns" )
set ( BUNDLE_NAME "imhex.app" )
2021-01-22 23:27:01 +01:00
2023-11-04 01:11:50 +01:00
if ( IMHEX_GENERATE_PACKAGE )
2022-02-06 22:29:16 +01:00
set ( APPLICATION_TYPE MACOSX_BUNDLE )
set_source_files_properties ( ${ IMHEX_ICON } PROPERTIES MACOSX_PACKAGE_LOCATION "Resources" )
2021-01-22 23:27:01 +01:00
set ( MACOSX_BUNDLE_ICON_FILE "AppIcon.icns" )
set ( MACOSX_BUNDLE_INFO_STRING "WerWolv" )
set ( MACOSX_BUNDLE_BUNDLE_NAME "ImHex" )
2022-08-10 22:47:21 +02:00
set ( MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/resources/dist/macos/Info.plist.in" )
2021-01-22 23:27:01 +01:00
set ( MACOSX_BUNDLE_BUNDLE_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}" )
2022-06-24 00:27:35 +02:00
set ( MACOSX_BUNDLE_GUI_IDENTIFIER "net.WerWolv.ImHex" )
2024-02-10 02:40:33 +01:00
string ( SUBSTRING "${IMHEX_COMMIT_HASH_LONG}" 0 7 COMMIT_HASH_SHORT )
set ( MACOSX_BUNDLE_LONG_VERSION_STRING "${PROJECT_VERSION}-${COMMIT_HASH_SHORT}" )
2021-01-22 23:27:01 +01:00
set ( MACOSX_BUNDLE_SHORT_VERSION_STRING "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}" )
2022-08-10 22:47:21 +02:00
string ( TIMESTAMP CURR_YEAR "%Y" )
set ( MACOSX_BUNDLE_COPYRIGHT "Copyright © 2020 - ${CURR_YEAR} WerWolv. All rights reserved." )
2021-01-22 23:27:01 +01:00
if ( "${CMAKE_GENERATOR}" STREQUAL "Xcode" )
2023-12-30 19:11:33 +01:00
set ( IMHEX_BUNDLE_PATH "${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/${BUNDLE_NAME}" )
2021-01-22 23:27:01 +01:00
else ( )
2023-12-30 19:11:33 +01:00
set ( IMHEX_BUNDLE_PATH "${CMAKE_BINARY_DIR}/${BUNDLE_NAME}" )
2021-01-22 23:27:01 +01:00
endif ( )
2023-10-01 16:18:31 +02:00
set ( PLUGINS_INSTALL_LOCATION "${IMHEX_BUNDLE_PATH}/Contents/MacOS/plugins" )
2023-10-01 16:59:04 +02:00
set ( CMAKE_INSTALL_LIBDIR "${IMHEX_BUNDLE_PATH}/Contents/Frameworks" )
2021-01-22 23:27:01 +01:00
endif ( )
endif ( )
endmacro ( )
macro ( createPackage )
2022-08-07 00:30:03 +02:00
set ( LIBRARY_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE )
2021-01-22 23:27:01 +01:00
file ( MAKE_DIRECTORY "plugins" )
foreach ( plugin IN LISTS PLUGINS )
2021-05-29 23:06:36 +02:00
add_subdirectory ( "plugins/${plugin}" )
2021-05-29 21:52:18 +02:00
if ( TARGET ${ plugin } )
2022-06-16 15:42:27 +02:00
set_target_properties ( ${ plugin } PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${ CMAKE_BINARY_DIR } /plugins )
set_target_properties ( ${ plugin } PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${ CMAKE_BINARY_DIR } /plugins )
2023-12-23 21:09:41 +01:00
if ( APPLE )
if ( IMHEX_GENERATE_PACKAGE )
set_target_properties ( ${ plugin } PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${ PLUGINS_INSTALL_LOCATION } )
2021-10-09 23:07:58 +02:00
else ( )
2023-12-23 21:09:41 +01:00
set_target_properties ( ${ plugin } PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${ CMAKE_BINARY_DIR } /plugins )
2021-10-09 23:07:58 +02:00
endif ( )
2023-12-23 21:09:41 +01:00
else ( )
2023-12-27 01:10:08 +01:00
if ( WIN32 )
get_target_property ( target_type ${ plugin } TYPE )
if ( target_type STREQUAL "SHARED_LIBRARY" )
install ( TARGETS ${ plugin } RUNTIME DESTINATION ${ PLUGINS_INSTALL_LOCATION } )
else ( )
install ( TARGETS ${ plugin } LIBRARY DESTINATION ${ PLUGINS_INSTALL_LOCATION } )
endif ( )
else ( )
2023-12-27 00:31:47 +01:00
install ( TARGETS ${ plugin } LIBRARY DESTINATION ${ PLUGINS_INSTALL_LOCATION } )
endif ( )
2023-12-27 01:10:08 +01:00
2023-12-27 00:31:47 +01:00
endif ( )
2023-02-01 09:38:03 +01:00
2023-02-12 21:55:09 +01:00
add_dependencies ( imhex_all ${ plugin } )
2021-05-29 21:52:18 +02:00
endif ( )
2021-01-22 23:27:01 +01:00
endforeach ( )
2021-01-30 22:39:06 +01:00
2021-03-02 10:19:37 +01:00
set_target_properties ( libimhex PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${ CMAKE_BINARY_DIR } )
2021-01-22 23:27:01 +01:00
if ( WIN32 )
# Install binaries directly in the prefix, usually C:\Program Files\ImHex.
set ( CMAKE_INSTALL_BINDIR "." )
2023-12-28 18:05:49 +01:00
set ( PLUGIN_TARGET_FILES "" )
foreach ( plugin IN LISTS PLUGINS )
list ( APPEND PLUGIN_TARGET_FILES "$<TARGET_FILE:${plugin}>" )
endforeach ( )
2021-01-22 23:27:01 +01:00
# Grab all dynamically linked dependencies.
2023-12-28 18:05:49 +01:00
install ( CODE "set(CMAKE_INSTALL_BINDIR \" ${ CMAKE_INSTALL_BINDIR } \")")
install ( CODE "set(PLUGIN_TARGET_FILES \" ${ PLUGIN_TARGET_FILES } \")")
2021-01-22 23:27:01 +01:00
install ( CODE [[
file ( GET_RUNTIME_DEPENDENCIES
2023-12-28 18:05:49 +01:00
E X E C U T A B L E S $ { P L U G I N _ T A R G E T _ F I L E S } $ < T A R G E T _ F I L E : l i b i m h e x > $ < T A R G E T _ F I L E : m a i n >
2021-01-22 23:27:01 +01:00
R E S O L V E D _ D E P E N D E N C I E S _ V A R _ r _ d e p s
U N R E S O L V E D _ D E P E N D E N C I E S _ V A R _ u _ d e p s
C O N F L I C T I N G _ D E P E N D E N C I E S _ P R E F I X _ c _ d e p s
2021-12-15 19:26:37 +01:00
D I R E C T O R I E S $ { D E P _ F O L D E R S } $ E N V { P A T H }
2021-01-22 23:27:01 +01:00
P O S T _ E X C L U D E _ R E G E X E S " . * s y s t e m 3 2 / . * \ \ . d l l "
)
if ( _c_deps_FILENAMES )
2023-06-20 11:55:56 +02:00
message ( WARNING "Conflicting dependencies for library: \" ${ _c_deps } \"!")
2021-01-22 23:27:01 +01:00
endif ( )
foreach ( _file ${ _r_deps } )
file ( INSTALL
D E S T I N A T I O N " $ { C M A K E _ I N S T A L L _ P R E F I X } / $ { C M A K E _ I N S T A L L _ B I N D I R } "
T Y P E S H A R E D _ L I B R A R Y
F O L L O W _ S Y M L I N K _ C H A I N
F I L E S " $ { _ f i l e } "
)
endforeach ( )
2021-09-20 18:41:22 +02:00
] ] )
2022-06-24 00:27:35 +02:00
2022-08-07 00:30:03 +02:00
install ( FILES "$<TARGET_FILE:libimhex>" DESTINATION "${CMAKE_INSTALL_LIBDIR}" PERMISSIONS ${ LIBRARY_PERMISSIONS } )
2022-06-24 00:27:35 +02:00
downloadImHexPatternsFiles ( "./" )
2021-12-03 13:42:15 +01:00
elseif ( UNIX AND NOT APPLE )
2022-07-31 17:29:57 +02:00
set_target_properties ( libimhex PROPERTIES SOVERSION ${ IMHEX_VERSION } )
2023-12-08 14:00:32 +01:00
2022-08-06 16:03:47 +02:00
configure_file ( ${ CMAKE_CURRENT_SOURCE_DIR } /dist/DEBIAN/control.in ${ CMAKE_BINARY_DIR } /DEBIAN/control )
2023-12-08 14:00:32 +01:00
2022-08-06 16:03:47 +02:00
install ( FILES ${ CMAKE_CURRENT_SOURCE_DIR } /LICENSE DESTINATION ${ CMAKE_INSTALL_PREFIX } /share/licenses/imhex )
install ( FILES ${ CMAKE_CURRENT_SOURCE_DIR } /dist/imhex.desktop DESTINATION ${ CMAKE_INSTALL_PREFIX } /share/applications )
install ( FILES ${ CMAKE_CURRENT_SOURCE_DIR } /resources/icon.png DESTINATION ${ CMAKE_INSTALL_PREFIX } /share/pixmaps RENAME imhex.png )
2022-08-07 00:30:03 +02:00
install ( FILES "$<TARGET_FILE:libimhex>" DESTINATION "${CMAKE_INSTALL_LIBDIR}" PERMISSIONS ${ LIBRARY_PERMISSIONS } )
2022-06-30 15:11:00 +02:00
downloadImHexPatternsFiles ( "./share/imhex" )
2023-12-08 14:00:32 +01:00
2022-09-08 09:31:49 +02:00
# install AppStream file
install ( FILES ${ CMAKE_CURRENT_SOURCE_DIR } /dist/net.werwolv.imhex.metainfo.xml DESTINATION ${ CMAKE_INSTALL_PREFIX } /share/metainfo )
2023-12-08 14:00:32 +01:00
2022-09-08 09:31:49 +02:00
# install symlink for the old standard name
file ( CREATE_LINK net.werwolv.imhex.metainfo.xml ${ CMAKE_CURRENT_BINARY_DIR } /net.werwolv.imhex.appdata.xml SYMBOLIC )
install ( FILES ${ CMAKE_CURRENT_BINARY_DIR } /net.werwolv.imhex.appdata.xml DESTINATION ${ CMAKE_INSTALL_PREFIX } /share/metainfo )
2021-01-22 23:27:01 +01:00
endif ( )
2023-12-08 14:00:32 +01:00
2023-12-30 19:11:33 +01:00
if ( APPLE )
if ( IMHEX_GENERATE_PACKAGE )
include ( PostprocessBundle )
2023-12-08 14:00:32 +01:00
2023-12-30 19:11:33 +01:00
set_target_properties ( libimhex PROPERTIES SOVERSION ${ IMHEX_VERSION } )
2022-08-10 20:26:27 +02:00
2023-12-30 19:11:33 +01:00
set_property ( TARGET main PROPERTY MACOSX_BUNDLE_INFO_PLIST ${ MACOSX_BUNDLE_INFO_PLIST } )
2021-01-22 23:27:01 +01:00
2023-12-30 19:11:33 +01:00
# Fix rpath
2024-01-24 22:30:40 +01:00
add_custom_command ( TARGET imhex_all POST_BUILD COMMAND ${ CMAKE_INSTALL_NAME_TOOL } -add_rpath "@executable_path/../Frameworks/" $< TARGET_FILE:main > || true )
2021-01-22 23:27:01 +01:00
2023-12-30 19:11:33 +01:00
add_custom_target ( build-time-make-plugins-directory ALL COMMAND ${ CMAKE_COMMAND } -E make_directory "${IMHEX_BUNDLE_PATH}/Contents/MacOS/plugins" )
add_custom_target ( build-time-make-resources-directory ALL COMMAND ${ CMAKE_COMMAND } -E make_directory "${IMHEX_BUNDLE_PATH}/Contents/Resources" )
2022-02-06 22:29:16 +01:00
2023-12-30 19:11:33 +01:00
downloadImHexPatternsFiles ( "${IMHEX_BUNDLE_PATH}/Contents/MacOS" )
2023-12-08 14:00:32 +01:00
2023-12-30 19:11:33 +01:00
install ( FILES ${ IMHEX_ICON } DESTINATION "${IMHEX_BUNDLE_PATH}/Contents/Resources" )
install ( TARGETS main BUNDLE DESTINATION "." )
2024-02-17 21:01:57 +01:00
install ( FILES $< TARGET_FILE:main > DESTINATION "${IMHEX_BUNDLE_PATH}" )
install ( FILES $< TARGET_FILE:updater > DESTINATION "${IMHEX_BUNDLE_PATH}" )
2021-01-22 23:27:01 +01:00
2023-12-30 19:11:33 +01:00
# Update library references to make the bundle portable
postprocess_bundle ( imhex_all main )
2021-01-22 23:27:01 +01:00
2023-12-30 19:11:33 +01:00
# Enforce DragNDrop packaging.
set ( CPACK_GENERATOR "DragNDrop" )
2023-11-07 14:06:38 +01:00
2023-12-30 19:11:33 +01:00
set ( CPACK_BUNDLE_ICON "${CMAKE_SOURCE_DIR}/resources/dist/macos/AppIcon.icns" )
set ( CPACK_BUNDLE_PLIST "${CMAKE_BINARY_DIR}/${BUNDLE_NAME}/Contents/Info.plist" )
2024-01-24 22:30:40 +01:00
2024-02-01 23:56:14 +01:00
if ( IMHEX_RESIGN_BUNDLE )
message ( STATUS "Resigning bundle..." )
find_program ( CODESIGN_PATH codesign )
if ( CODESIGN_PATH )
add_custom_command ( TARGET imhex_all POST_BUILD COMMAND "codesign" ARGS "--force" "--deep" "--sign" "-" "${CMAKE_BINARY_DIR}/${BUNDLE_NAME}" )
endif ( )
2024-01-25 10:32:53 +01:00
endif ( )
2023-12-30 19:11:33 +01:00
endif ( )
2021-01-22 23:27:01 +01:00
else ( )
2022-01-15 00:14:12 +01:00
install ( TARGETS main RUNTIME DESTINATION ${ CMAKE_INSTALL_BINDIR } )
2023-12-28 20:44:42 +01:00
if ( TARGET updater )
install ( TARGETS updater RUNTIME DESTINATION ${ CMAKE_INSTALL_BINDIR } )
endif ( )
if ( TARGET main-forwarder )
2023-09-27 14:14:27 +02:00
install ( TARGETS main-forwarder BUNDLE DESTINATION ${ CMAKE_INSTALL_BINDIR } )
2023-09-16 13:08:19 +02:00
endif ( )
2021-01-22 23:27:01 +01:00
endif ( )
2023-11-07 14:06:38 +01:00
if ( IMHEX_GENERATE_PACKAGE )
2024-01-04 17:55:53 +01:00
set ( CPACK_BUNDLE_NAME "ImHex" )
2022-08-10 19:18:32 +02:00
2021-01-22 23:27:01 +01:00
include ( CPack )
endif ( )
endmacro ( )
function ( JOIN OUTPUT GLUE )
set ( _TMP_RESULT "" )
set ( _GLUE "" ) # effective glue is empty at the beginning
foreach ( arg ${ ARGN } )
set ( _TMP_RESULT "${_TMP_RESULT}${_GLUE}${arg}" )
set ( _GLUE "${GLUE}" )
endforeach ( )
set ( ${ OUTPUT } "${_TMP_RESULT}" PARENT_SCOPE )
endfunction ( )
2023-06-26 08:45:33 +02:00
macro ( configureCMake )
2023-07-14 21:51:18 +02:00
message ( STATUS "Configuring ImHex v${IMHEX_VERSION}" )
2023-08-05 20:39:20 +02:00
# Enable C and C++ languages
enable_language ( C CXX )
2024-01-29 22:57:39 +01:00
set ( CMAKE_POSITION_INDEPENDENT_CODE ON CACHE BOOL "Enable position independent code for all targets" FORCE )
2023-07-14 21:51:18 +02:00
# Configure use of recommended build tools
if ( IMHEX_USE_DEFAULT_BUILD_SETTINGS )
message ( STATUS "Configuring CMake to use recommended build tools..." )
find_program ( CCACHE_PATH ccache )
find_program ( NINJA_PATH ninja )
find_program ( LD_LLD_PATH ld.lld )
find_program ( AR_LLVMLIBS_PATH llvm-ar )
find_program ( RANLIB_LLVMLIBS_PATH llvm-ranlib )
2023-07-15 14:29:54 +02:00
if ( CCACHE_PATH )
2023-08-06 01:52:23 +02:00
set ( CMAKE_C_COMPILER_LAUNCHER ${ CCACHE_PATH } )
set ( CMAKE_CXX_COMPILER_LAUNCHER ${ CCACHE_PATH } )
2023-07-14 21:51:18 +02:00
else ( )
message ( WARNING "ccache not found!" )
endif ( )
2023-07-15 14:29:54 +02:00
if ( AR_LLVMLIBS_PATH )
2023-08-06 01:52:23 +02:00
set ( CMAKE_AR ${ AR_LLVMLIBS_PATH } )
2023-07-14 21:51:18 +02:00
else ( )
message ( WARNING "llvm-ar not found, using default ar!" )
endif ( )
2023-07-15 14:29:54 +02:00
if ( RANLIB_LLVMLIBS_PATH )
2023-08-06 01:52:23 +02:00
set ( CMAKE_RANLIB ${ RANLIB_LLVMLIBS_PATH } )
2023-07-14 21:51:18 +02:00
else ( )
message ( WARNING "llvm-ranlib not found, using default ranlib!" )
endif ( )
2023-07-15 14:29:54 +02:00
if ( LD_LLD_PATH )
2023-08-06 01:52:23 +02:00
set ( CMAKE_LINKER ${ LD_LLD_PATH } )
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fuse-ld=lld" )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fuse-ld=lld" )
2023-07-14 21:51:18 +02:00
else ( )
message ( WARNING "lld not found, using default linker!" )
endif ( )
2023-07-15 14:29:54 +02:00
if ( NINJA_PATH )
2023-08-06 01:52:23 +02:00
set ( CMAKE_GENERATOR Ninja )
2023-07-15 10:33:42 +02:00
else ( )
message ( WARNING "ninja not found, using default generator!" )
endif ( )
2023-07-14 21:51:18 +02:00
endif ( )
2023-07-09 20:34:49 +02:00
# Enable LTO if desired and supported
if ( IMHEX_ENABLE_LTO )
include ( CheckIPOSupported )
2023-08-05 20:39:20 +02:00
check_ipo_supported ( RESULT result OUTPUT output_error )
2023-07-09 20:34:49 +02:00
if ( result )
set ( CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE )
2023-07-14 21:51:18 +02:00
message ( STATUS "LTO enabled!" )
2023-07-09 20:34:49 +02:00
else ( )
2023-08-05 20:39:20 +02:00
message ( WARNING "LTO is not supported: ${output_error}" )
2023-07-09 20:34:49 +02:00
endif ( )
endif ( )
2023-07-09 22:39:27 +02:00
# Some libraries we use set the BUILD_SHARED_LIBS variable to ON, which causes CMake to
# display a warning about options being set using set() instead of option().
# Explicitly set the policy to NEW to suppress the warning.
set ( CMAKE_POLICY_DEFAULT_CMP0077 NEW )
2024-01-21 18:39:13 +01:00
set ( CMAKE_POLICY_DEFAULT_CMP0063 NEW )
set ( CMAKE_WARN_DEPRECATED OFF CACHE BOOL "Disable deprecated warnings" FORCE )
2023-06-26 08:45:33 +02:00
endmacro ( )
2021-01-22 23:27:01 +01:00
macro ( setDefaultBuiltTypeIfUnset )
if ( NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES )
2023-10-04 12:00:32 +02:00
set ( CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "Using RelWithDebInfo build type as it was left unset" FORCE )
set_property ( CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "RelWithDebInfo" )
2021-01-22 23:27:01 +01:00
endif ( )
2021-12-17 08:38:25 +01:00
endmacro ( )
2022-07-27 08:27:38 +02:00
function ( loadVersion version )
2022-09-06 10:43:43 +02:00
set ( VERSION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/VERSION" )
set_property ( DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${ VERSION_FILE } )
file ( READ "${VERSION_FILE}" read_version )
2022-11-29 09:44:47 +01:00
string ( STRIP ${ read_version } read_version )
2022-07-27 08:27:38 +02:00
set ( ${ version } ${ read_version } PARENT_SCOPE )
endfunction ( )
2022-08-01 14:35:25 +02:00
function ( detectBadClone )
if ( IMHEX_IGNORE_BAD_CLONE )
return ( )
endif ( )
2023-11-12 02:02:54 +01:00
file ( GLOB EXTERNAL_DIRS "lib/external/*" "lib/third_party/*" )
2021-12-17 08:38:25 +01:00
foreach ( EXTERNAL_DIR ${ EXTERNAL_DIRS } )
2023-11-02 20:21:38 +01:00
file ( GLOB_RECURSE RESULT "${EXTERNAL_DIR}/*" )
2021-12-17 08:38:25 +01:00
list ( LENGTH RESULT ENTRY_COUNT )
if ( ENTRY_COUNT LESS_EQUAL 1 )
message ( FATAL_ERROR "External dependency ${EXTERNAL_DIR} is empty!\nMake sure to correctly clone ImHex using the --recurse-submodules git option or initialize the submodules manually." )
endif ( )
endforeach ( )
2022-08-01 14:35:25 +02:00
endfunction ( )
2022-02-21 22:47:56 +01:00
2022-08-02 11:59:29 +02:00
function ( verifyCompiler )
if ( IMHEX_IGNORE_BAD_COMPILER )
return ( )
endif ( )
2022-08-07 23:12:10 +02:00
if ( CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS "12.0.0" )
message ( FATAL_ERROR "ImHex requires GCC 12.0.0 or newer. Please use the latest GCC version." )
2023-07-15 10:02:19 +02:00
elseif ( CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS "17.0.0" )
message ( FATAL_ERROR "ImHex requires Clang 17.0.0 or newer. Please use the latest Clang version." )
2022-08-26 00:18:08 +02:00
elseif ( NOT ( CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang" ) )
2022-08-07 23:12:10 +02:00
message ( FATAL_ERROR "ImHex can only be compiled with GCC or Clang. ${CMAKE_CXX_COMPILER_ID} is not supported." )
2022-08-02 11:59:29 +02:00
endif ( )
endfunction ( )
2023-12-23 21:09:41 +01:00
macro ( detectBundledPlugins )
file ( GLOB PLUGINS_DIRS "plugins/*" )
if ( NOT DEFINED IMHEX_INCLUDE_PLUGINS )
foreach ( PLUGIN_DIR ${ PLUGINS_DIRS } )
if ( EXISTS "${PLUGIN_DIR}/CMakeLists.txt" )
get_filename_component ( PLUGIN_NAME ${ PLUGIN_DIR } NAME )
if ( NOT ( ${ PLUGIN_NAME } IN_LIST IMHEX_EXCLUDE_PLUGINS ) )
list ( APPEND PLUGINS ${ PLUGIN_NAME } )
endif ( )
endif ( )
endforeach ( )
else ( )
set ( PLUGINS ${ IMHEX_INCLUDE_PLUGINS } )
endif ( )
foreach ( PLUGIN_NAME ${ PLUGINS } )
message ( STATUS "Enabled bundled plugin '${PLUGIN_NAME}'" )
endforeach ( )
if ( NOT PLUGINS )
message ( FATAL_ERROR "No bundled plugins enabled" )
endif ( )
if ( NOT ( "builtin" IN_LIST PLUGINS ) )
message ( FATAL_ERROR "The 'builtin' plugin is required for ImHex to work!" )
endif ( )
endmacro ( )
2022-07-27 08:45:33 +02:00
macro ( setVariableInParent variable value )
get_directory_property ( hasParent PARENT_DIRECTORY )
if ( hasParent )
2022-08-03 16:36:21 +02:00
set ( ${ variable } "${value}" PARENT_SCOPE )
2022-07-27 08:45:33 +02:00
else ( )
set ( ${ variable } "${value}" )
endif ( )
endmacro ( )
2022-02-21 22:47:56 +01:00
2022-06-24 00:27:35 +02:00
function ( downloadImHexPatternsFiles dest )
2022-07-08 14:17:22 +02:00
if ( NOT IMHEX_OFFLINE_BUILD )
2022-07-18 20:02:12 +02:00
if ( IMHEX_PATTERNS_PULL_MASTER )
set ( PATTERNS_BRANCH master )
else ( )
set ( PATTERNS_BRANCH ImHex-v ${ IMHEX_VERSION } )
2022-07-18 20:13:01 +02:00
endif ( )
2022-07-18 20:02:12 +02:00
2022-07-08 14:17:22 +02:00
FetchContent_Declare (
2023-12-08 14:00:32 +01:00
i m h e x _ p a t t e r n s
G I T _ R E P O S I T O R Y h t t p s : / / g i t h u b . c o m / W e r W o l v / I m H e x - P a t t e r n s . g i t
G I T _ T A G o r i g i n / m a s t e r
2022-07-08 14:17:22 +02:00
)
2022-02-21 22:47:56 +01:00
2022-11-25 10:37:31 +01:00
message ( STATUS "Downloading ImHex-Patterns repo branch ${PATTERNS_BRANCH}..." )
2022-12-20 20:56:01 +01:00
FetchContent_MakeAvailable ( imhex_patterns )
2022-11-25 10:37:31 +01:00
message ( STATUS "Finished downloading ImHex-Patterns" )
2022-02-21 22:47:56 +01:00
2022-09-13 22:34:33 +02:00
else ( )
# Maybe patterns are cloned to a subdirectory
set ( imhex_patterns_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ImHex-Patterns" )
endif ( )
if ( EXISTS ${ imhex_patterns_SOURCE_DIR } )
2024-01-04 22:07:49 +01:00
set ( PATTERNS_FOLDERS_TO_INSTALL constants encodings includes patterns magic nodes )
2022-07-08 14:17:22 +02:00
foreach ( FOLDER ${ PATTERNS_FOLDERS_TO_INSTALL } )
2023-05-22 13:20:55 +02:00
install ( DIRECTORY "${imhex_patterns_SOURCE_DIR}/${FOLDER}" DESTINATION ${ dest } PATTERN "**/_schema.json" EXCLUDE )
2022-07-08 14:17:22 +02:00
endforeach ( )
endif ( )
2022-02-21 22:47:56 +01:00
2022-08-05 08:32:08 +02:00
endfunction ( )
2023-06-18 14:42:48 +02:00
macro ( setupCompilerFlags target )
2023-06-13 23:01:26 +02:00
if ( CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang" )
2023-11-25 16:40:12 +01:00
# Define strict compilation flags
2023-07-15 10:02:19 +02:00
if ( IMHEX_STRICT_WARNINGS )
2023-11-25 16:40:12 +01:00
set ( IMHEX_COMMON_FLAGS "${IMHEX_COMMON_FLAGS} -Wall -Wextra -Wpedantic -Werror" )
2023-07-15 10:02:19 +02:00
endif ( )
2023-12-09 12:23:11 +01:00
if ( UNIX AND NOT APPLE AND CMAKE_CXX_COMPILER_ID MATCHES "GNU" )
2023-12-08 14:00:32 +01:00
set ( IMHEX_COMMON_FLAGS "${IMHEX_COMMON_FLAGS} -rdynamic" )
endif ( )
2023-06-18 14:42:48 +02:00
set ( IMHEX_CXX_FLAGS "-fexceptions -frtti" )
2023-11-25 16:40:12 +01:00
# Disable some warnings
2024-02-29 21:49:36 +01:00
set ( IMHEX_C_CXX_FLAGS "-Wno-unknown-warning-option -Wno-array-bounds -Wno-deprecated-declarations -Wno-unknown-pragmas" )
2024-01-29 22:57:39 +01:00
endif ( )
2023-11-25 16:40:12 +01:00
2024-01-29 22:57:39 +01:00
if ( CMAKE_CXX_COMPILER_ID MATCHES "GNU" )
2023-11-30 10:22:15 +01:00
if ( IMHEX_ENABLE_UNITY_BUILD AND WIN32 )
set ( IMHEX_COMMON_FLAGS "${IMHEX_COMMON_FLAGS} -Wa,-mbig-obj" )
endif ( )
2023-11-25 16:40:12 +01:00
endif ( )
# Disable some warnings for gcc
if ( CMAKE_CXX_COMPILER_ID MATCHES "GNU" )
set ( IMHEX_C_CXX_FLAGS "${IMHEX_C_CXX_FLAGS} -Wno-restrict -Wno-stringop-overread -Wno-stringop-overflow -Wno-dangling-reference" )
2023-06-13 23:01:26 +02:00
endif ( )
2022-08-05 09:00:03 +02:00
2023-11-25 16:40:12 +01:00
# Define emscripten-specific disabled warnings
2023-10-04 12:00:32 +02:00
if ( EMSCRIPTEN )
2023-11-25 16:40:12 +01:00
set ( IMHEX_C_CXX_FLAGS "${IMHEX_C_CXX_FLAGS} -pthread -Wno-dollar-in-identifier-extension -Wno-pthreads-mem-growth" )
2023-10-04 12:00:32 +02:00
endif ( )
2023-11-25 16:40:12 +01:00
# Set actual CMake flags
2023-12-08 14:00:32 +01:00
set_target_properties ( ${ target } PROPERTIES COMPILE_FLAGS "${IMHEX_COMMON_FLAGS} ${IMHEX_C_CXX_FLAGS}" )
2023-11-25 16:40:12 +01:00
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${IMHEX_COMMON_FLAGS} ${IMHEX_C_CXX_FLAGS}" )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${IMHEX_COMMON_FLAGS} ${IMHEX_C_CXX_FLAGS} ${IMHEX_CXX_FLAGS}" )
2022-08-05 09:16:16 +02:00
set ( CMAKE_OBJC_FLAGS "${CMAKE_OBJC_FLAGS} ${IMHEX_COMMON_FLAGS}" )
2022-10-14 15:35:45 +02:00
endmacro ( )
# uninstall target
macro ( setUninstallTarget )
if ( NOT TARGET uninstall )
configure_file (
2023-12-08 14:00:32 +01:00
" $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / c m a k e / c m a k e _ u n i n s t a l l . c m a k e . i n "
" $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / c m a k e _ u n i n s t a l l . c m a k e "
I M M E D I A T E @ O N L Y )
2022-10-14 15:35:45 +02:00
add_custom_target ( uninstall
2023-12-08 14:00:32 +01:00
C O M M A N D $ { C M A K E _ C O M M A N D } - P $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / c m a k e _ u n i n s t a l l . c m a k e )
2022-10-14 15:35:45 +02:00
endif ( )
2022-11-25 10:37:31 +01:00
endmacro ( )
2023-01-04 12:34:38 +01:00
macro ( addBundledLibraries )
2023-11-12 02:02:54 +01:00
set ( EXTERNAL_LIBS_FOLDER "${CMAKE_CURRENT_SOURCE_DIR}/lib/external" )
set ( THIRD_PARTY_LIBS_FOLDER "${CMAKE_CURRENT_SOURCE_DIR}/lib/third_party" )
2023-01-04 12:34:38 +01:00
2023-06-26 14:52:00 +02:00
set ( BUILD_SHARED_LIBS OFF )
2023-11-12 02:02:54 +01:00
add_subdirectory ( ${ THIRD_PARTY_LIBS_FOLDER } /imgui )
2023-01-04 12:34:38 +01:00
2023-11-12 02:02:54 +01:00
add_subdirectory ( ${ THIRD_PARTY_LIBS_FOLDER } /microtar EXCLUDE_FROM_ALL )
2023-01-04 12:34:38 +01:00
2023-11-12 02:02:54 +01:00
add_subdirectory ( ${ EXTERNAL_LIBS_FOLDER } /libwolv EXCLUDE_FROM_ALL )
2023-03-12 18:27:29 +01:00
2023-11-12 02:02:54 +01:00
set ( XDGPP_INCLUDE_DIRS "${THIRD_PARTY_LIBS_FOLDER}/xdgpp" )
2023-01-04 12:34:38 +01:00
set ( FPHSA_NAME_MISMATCHED ON CACHE BOOL "" )
if ( NOT USE_SYSTEM_FMT )
2023-11-12 02:02:54 +01:00
add_subdirectory ( ${ THIRD_PARTY_LIBS_FOLDER } /fmt EXCLUDE_FROM_ALL )
2023-01-04 12:34:38 +01:00
set ( FMT_LIBRARIES fmt::fmt-header-only )
else ( )
2024-01-26 12:13:22 +01:00
find_package ( fmt REQUIRED )
2023-01-04 12:34:38 +01:00
set ( FMT_LIBRARIES fmt::fmt )
endif ( )
2023-01-13 20:11:27 +01:00
if ( IMHEX_USE_GTK_FILE_PICKER )
set ( NFD_PORTAL OFF CACHE BOOL "Use Portals for Linux file dialogs" FORCE )
else ( )
set ( NFD_PORTAL ON CACHE BOOL "Use GTK for Linux file dialogs" FORCE )
endif ( )
2023-10-04 12:00:32 +02:00
if ( NOT EMSCRIPTEN )
# curl
2024-01-26 12:13:22 +01:00
find_package ( CURL REQUIRED )
2023-10-04 12:00:32 +02:00
# nfd
if ( NOT USE_SYSTEM_NFD )
2023-11-12 02:02:54 +01:00
add_subdirectory ( ${ THIRD_PARTY_LIBS_FOLDER } /nativefiledialog EXCLUDE_FROM_ALL )
2023-10-04 12:00:32 +02:00
set ( NFD_LIBRARIES nfd )
else ( )
find_package ( nfd )
set ( NFD_LIBRARIES nfd )
endif ( )
2023-01-04 12:34:38 +01:00
endif ( )
if ( NOT USE_SYSTEM_NLOHMANN_JSON )
2023-11-12 02:02:54 +01:00
add_subdirectory ( ${ THIRD_PARTY_LIBS_FOLDER } /nlohmann_json EXCLUDE_FROM_ALL )
2023-01-04 12:34:38 +01:00
set ( NLOHMANN_JSON_LIBRARIES nlohmann_json )
else ( )
find_package ( nlohmann_json 3.10.2 REQUIRED )
set ( NLOHMANN_JSON_LIBRARIES nlohmann_json::nlohmann_json )
endif ( )
if ( NOT USE_SYSTEM_LLVM )
2023-11-12 02:02:54 +01:00
add_subdirectory ( ${ THIRD_PARTY_LIBS_FOLDER } /llvm-demangle EXCLUDE_FROM_ALL )
2023-01-04 12:34:38 +01:00
else ( )
find_package ( LLVM REQUIRED Demangle )
endif ( )
2023-11-02 20:21:38 +01:00
if ( NOT USE_SYSTEM_JTHREAD )
2023-11-12 02:02:54 +01:00
add_subdirectory ( ${ THIRD_PARTY_LIBS_FOLDER } /jthread EXCLUDE_FROM_ALL )
2023-11-02 20:21:38 +01:00
set ( JTHREAD_LIBRARIES jthread )
else ( )
find_path ( JOSUTTIS_JTHREAD_INCLUDE_DIRS "condition_variable_any2.hpp" )
include_directories ( ${ JOSUTTIS_JTHREAD_INCLUDE_DIRS } )
add_library ( jthread INTERFACE )
target_include_directories ( jthread INTERFACE ${ JOSUTTIS_JTHREAD_INCLUDE_DIRS } )
set ( JTHREAD_LIBRARIES jthread )
endif ( )
2024-01-29 21:18:32 +01:00
set ( LIBPL_BUILD_CLI_AS_EXECUTABLE OFF CACHE BOOL "" FORCE )
2024-03-02 11:51:33 +01:00
set ( LIBPL_ENABLE_PRECOMPILED_HEADERS ${ IMHEX_ENABLE_PRECOMPILED_HEADERS } CACHE BOOL "" FORCE )
2024-02-15 16:10:16 +01:00
if ( WIN32 )
set ( LIBPL_SHARED_LIBRARY ON CACHE BOOL "" FORCE )
else ( )
set ( LIBPL_SHARED_LIBRARY OFF CACHE BOOL "" FORCE )
endif ( )
2023-11-12 02:02:54 +01:00
add_subdirectory ( ${ EXTERNAL_LIBS_FOLDER } /pattern_language EXCLUDE_FROM_ALL )
2024-02-03 10:41:11 +01:00
2024-02-15 16:10:16 +01:00
if ( LIBPL_SHARED_LIBRARY )
install (
T A R G E T S
l i b p l
D E S T I N A T I O N
" $ { C M A K E _ I N S T A L L _ L I B D I R } "
P E R M I S S I O N S
O W N E R _ R E A D O W N E R _ W R I T E O W N E R _ E X E C U T E G R O U P _ R E A D G R O U P _ E X E C U T E W O R L D _ R E A D W O R L D _ E X E C U T E
)
endif ( )
2024-02-03 14:43:41 +01:00
2024-02-03 10:41:11 +01:00
if ( WIN32 )
set_target_properties (
l i b p l
P R O P E R T I E S
R U N T I M E _ O U T P U T _ D I R E C T O R Y $ { C M A K E _ B I N A R Y _ D I R }
L I B R A R Y _ O U T P U T _ D I R E C T O R Y $ { C M A K E _ B I N A R Y _ D I R }
)
endif ( )
2024-01-29 21:18:32 +01:00
enableUnityBuild ( libpl )
2023-01-04 12:34:38 +01:00
2023-07-15 00:10:01 +02:00
find_package ( mbedTLS 3.4.0 REQUIRED )
2024-01-30 21:19:43 +01:00
find_package ( Magic 5.39 REQUIRED )
2023-01-17 21:38:56 +01:00
2023-02-17 17:52:10 +01:00
if ( NOT IMHEX_DISABLE_STACKTRACE )
if ( WIN32 )
message ( STATUS "StackWalk enabled!" )
set ( LIBBACKTRACE_LIBRARIES DbgHelp.lib )
else ( )
find_package ( Backtrace )
if ( ${ Backtrace_FOUND } )
message ( STATUS "Backtrace enabled! Header: ${Backtrace_HEADER}" )
if ( Backtrace_HEADER STREQUAL "execinfo.h" )
2023-02-17 17:56:27 +01:00
set ( LIBBACKTRACE_LIBRARIES ${ Backtrace_LIBRARY } )
2023-02-17 17:52:10 +01:00
set ( LIBBACKTRACE_INCLUDE_DIRS ${ Backtrace_INCLUDE_DIR } )
add_compile_definitions ( BACKTRACE_HEADER=\ "${Backtrace_HEADER}\" )
add_compile_definitions ( HEX_HAS_EXECINFO )
elseif ( Backtrace_HEADER STREQUAL "backtrace.h" )
2023-02-17 17:56:27 +01:00
set ( LIBBACKTRACE_LIBRARIES ${ Backtrace_LIBRARY } )
2023-02-17 17:52:10 +01:00
set ( LIBBACKTRACE_INCLUDE_DIRS ${ Backtrace_INCLUDE_DIR } )
add_compile_definitions ( BACKTRACE_HEADER=\ "${Backtrace_HEADER}\" )
add_compile_definitions ( HEX_HAS_BACKTRACE )
endif ( )
endif ( )
endif ( )
2023-01-17 21:38:56 +01:00
endif ( )
2023-01-04 12:34:38 +01:00
endmacro ( )
2023-06-20 11:55:56 +02:00
2023-11-30 10:22:15 +01:00
function ( enableUnityBuild TARGET )
if ( IMHEX_ENABLE_UNITY_BUILD )
set_target_properties ( ${ TARGET } PROPERTIES UNITY_BUILD ON UNITY_BUILD_MODE BATCH )
endif ( )
endfunction ( )
2023-06-20 11:55:56 +02:00
function ( generatePDBs )
2024-01-15 23:33:31 +01:00
if ( NOT IMHEX_GENERATE_PDBS )
return ( )
endif ( )
2023-06-24 11:52:37 +02:00
if ( NOT WIN32 OR CMAKE_BUILD_TYPE STREQUAL "Debug" )
2023-06-20 11:55:56 +02:00
return ( )
endif ( )
include ( FetchContent )
FetchContent_Declare (
c v 2 p d b
U R L " h t t p s : / / g i t h u b . c o m / r a i n e r s / c v 2 p d b / r e l e a s e s / d o w n l o a d / v 0 . 5 2 / c v 2 p d b - 0 . 5 2 . z i p "
D O W N L O A D _ E X T R A C T _ T I M E S T A M P O N
)
FetchContent_Populate ( cv2pdb )
2023-09-27 14:14:27 +02:00
set ( PDBS_TO_GENERATE main main-forwarder libimhex ${ PLUGINS } )
2023-06-20 11:55:56 +02:00
foreach ( PDB ${ PDBS_TO_GENERATE } )
2023-06-24 01:48:13 +02:00
if ( PDB STREQUAL "main" )
set ( GENERATED_PDB imhex )
2023-09-27 14:14:27 +02:00
elseif ( PDB STREQUAL "main-forwarder" )
2023-09-16 13:08:19 +02:00
set ( GENERATED_PDB imhex-gui )
2023-06-24 01:48:13 +02:00
elseif ( PDB STREQUAL "libimhex" )
set ( GENERATED_PDB libimhex )
2023-06-20 11:55:56 +02:00
else ( )
2023-06-24 01:48:13 +02:00
set ( GENERATED_PDB plugins/ ${ PDB } )
2023-06-20 11:55:56 +02:00
endif ( )
2024-01-30 21:19:04 +01:00
if ( IMHEX_REPLACE_DWARF_WITH_PDB )
set ( PDB_OUTPUT_PATH ${ CMAKE_BINARY_DIR } / ${ GENERATED_PDB } )
else ( )
set ( PDB_OUTPUT_PATH )
endif ( )
2024-01-16 00:31:46 +01:00
add_custom_target ( ${ PDB } _pdb DEPENDS ${ CMAKE_BINARY_DIR } / ${ GENERATED_PDB } .pdb )
2023-06-20 11:55:56 +02:00
add_custom_command ( OUTPUT ${ CMAKE_BINARY_DIR } / ${ GENERATED_PDB } .pdb
2024-01-16 00:31:46 +01:00
W O R K I N G _ D I R E C T O R Y $ { C M A K E _ B I N A R Y _ D I R }
2023-06-20 11:55:56 +02:00
C O M M A N D
2023-12-21 13:57:40 +01:00
(
$ { C M A K E _ C O M M A N D } - E r e m o v e - f $ { C M A K E _ B I N A R Y _ D I R } / $ { G E N E R A T E D _ P D B } . p d b & &
2024-01-30 21:19:04 +01:00
$ { c v 2 p d b _ S O U R C E _ D I R } / c v 2 p d b 6 4 . e x e $ < T A R G E T _ F I L E : $ { P D B } > $ { P D B _ O U T P U T _ P A T H } & &
2024-01-16 00:31:46 +01:00
$ { C M A K E _ C O M M A N D } - E r e m o v e - f $ { C M A K E _ B I N A R Y _ D I R } / $ { G E N E R A T E D _ P D B }
2023-12-21 13:57:40 +01:00
) | | ( e x i t 0 )
2023-06-20 11:55:56 +02:00
C O M M A N D _ E X P A N D _ L I S T S )
2023-06-24 01:48:13 +02:00
install ( FILES ${ CMAKE_BINARY_DIR } / ${ GENERATED_PDB } .pdb DESTINATION "." )
2024-01-16 00:31:46 +01:00
add_dependencies ( imhex_all ${ PDB } _pdb )
2023-06-20 11:55:56 +02:00
endforeach ( )
2023-10-22 21:27:13 +02:00
endfunction ( )
function ( generateSDKDirectory )
2023-12-22 23:39:38 +01:00
if ( WIN32 )
set ( SDK_PATH "./sdk" )
elseif ( APPLE )
2023-12-30 19:11:33 +01:00
set ( SDK_PATH "${BUNDLE_NAME}/Contents/Resources/sdk" )
2023-12-22 23:39:38 +01:00
else ( )
set ( SDK_PATH "share/imhex/sdk" )
endif ( )
2024-02-24 16:09:48 +01:00
set ( SDK_BUILD_PATH "${CMAKE_BINARY_DIR}/sdk" )
2024-02-25 01:57:42 +01:00
install ( DIRECTORY ${ CMAKE_SOURCE_DIR } /lib/libimhex DESTINATION "${SDK_PATH}/lib" PATTERN "**/source/*" EXCLUDE )
install ( DIRECTORY ${ CMAKE_SOURCE_DIR } /lib/external DESTINATION "${SDK_PATH}/lib" )
install ( DIRECTORY ${ CMAKE_SOURCE_DIR } /lib/third_party/imgui DESTINATION "${SDK_PATH}/lib/third_party" PATTERN "**/source/*" EXCLUDE )
2023-12-22 23:39:38 +01:00
if ( NOT USE_SYSTEM_FMT )
2024-02-25 01:57:42 +01:00
install ( DIRECTORY ${ CMAKE_SOURCE_DIR } /lib/third_party/fmt DESTINATION "${SDK_PATH}/lib/third_party" )
2023-12-22 23:39:38 +01:00
endif ( )
if ( NOT USE_SYSTEM_NLOHMANN_JSON )
2024-02-25 01:57:42 +01:00
install ( DIRECTORY ${ CMAKE_SOURCE_DIR } /lib/third_party/nlohmann_json DESTINATION "${SDK_PATH}/lib/third_party" )
2023-12-22 23:39:38 +01:00
endif ( )
2023-06-20 11:55:56 +02:00
2024-02-25 01:57:42 +01:00
install ( DIRECTORY ${ CMAKE_SOURCE_DIR } /cmake/modules DESTINATION "${SDK_PATH}/cmake" )
install ( FILES ${ CMAKE_SOURCE_DIR } /cmake/build_helpers.cmake DESTINATION "${SDK_PATH}/cmake" )
install ( DIRECTORY ${ CMAKE_SOURCE_DIR } /cmake/sdk/ DESTINATION "${SDK_PATH}" )
install ( TARGETS libimhex ARCHIVE DESTINATION "${SDK_PATH}/lib" )
2023-12-22 23:39:38 +01:00
endfunction ( )
function ( addIncludesFromLibrary target library )
get_target_property ( library_include_dirs ${ library } INTERFACE_INCLUDE_DIRECTORIES )
target_include_directories ( ${ target } PRIVATE ${ library_include_dirs } )
2024-02-29 19:48:16 +01:00
endfunction ( )
function ( precompileHeaders target includeFolder )
2024-03-02 11:28:24 +01:00
if ( NOT IMHEX_ENABLE_PRECOMPILED_HEADERS )
return ( )
endif ( )
2024-02-29 19:48:16 +01:00
file ( GLOB_RECURSE TARGET_INCLUDES "${includeFolder}/**/*.hpp" )
set ( SYSTEM_INCLUDES "<algorithm>;<array>;<atomic>;<chrono>;<cmath>;<cstddef>;<cstdint>;<cstdio>;<cstdlib>;<cstring>;<exception>;<filesystem>;<functional>;<iterator>;<limits>;<list>;<map>;<memory>;<optional>;<ranges>;<set>;<stdexcept>;<string>;<string_view>;<thread>;<tuple>;<type_traits>;<unordered_map>;<unordered_set>;<utility>;<variant>;<vector>" )
set ( INCLUDES "${SYSTEM_INCLUDES};${TARGET_INCLUDES}" )
string ( REPLACE ">" "$<ANGLE-R>" INCLUDES "${INCLUDES}" )
target_precompile_headers ( ${ target }
P U B L I C
" $ < $ < C O M P I L E _ L A N G U A G E : C X X > : $ { I N C L U D E S } > "
)
2023-06-20 11:55:56 +02:00
endfunction ( )