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 )
2024-06-28 11:12:17 +02:00
add_compile_definitions ( UNICODE )
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 )
2024-03-21 21:31:17 +01:00
if ( BSD AND BSD STREQUAL "FreeBSD" )
add_compile_definitions ( OS_FREEBSD )
endif ( )
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 )
2024-03-11 21:08:23 +01: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
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" )
2024-03-23 00:33:46 +01:00
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 ( )
2024-03-11 21:08:23 +01:00
macro ( addPluginDirectories )
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 } )
build: Xcode accomodating CMake setup (#1688)
### Problem description
This PR implements some rudimentary Xcode support for building and
editing ImHex.
### Implementation description
#### Problem 1: Xcode is a multi-configuration buildsystem
The project is already rather CMake generator independent, thus it did
not need to change much to support Xcode's multi-configuration paradigm:
By default, CMake generates a `.xcodeproj` in which targets build their
artifacts into the specified `<>_OUTPUT_DIRECTORY`, postfixed by the
currently active configuration. To better fit the existing paradigm, I
instead opted ot introduce `IMHEX_MAIN_OUTPUT_DIRECTORY`. This variable
is equal to the previously used `RUNTIME_OUTPUT_DIRECTORY` when using
other generators, and is changed to include a configuration specific
_prefix_ when used with Xcode.
The result is different output directories when using Xcode, and no
changes when using any other generator.
#### Problem 2: ImHex does not support AppleClang
To allow building the codebase with Xcode, I have introduced
`IMHEX_IDE_HELPERS_OVERRIDE_XCODE_COMPILER`. Specifying this option to
`ON` will force CMake to honor the user specified compiler settings,
even when using the Xcode generator.
In practice this can be used together with the new "xcode" CMakePreset
to build the project with mainline clang using `xcodebuild`, or Xcode
itself by generating a buildsystem like so:
```
cmake --preset xcode -DCMAKE_PREFIX_PATH=/opt/homebrew/opt/llvm@17
```
This solution is of course not without flaws. The inner workings are a
particularly ugly hack, and mainline clang does not implement the
necessary extensions to allow Xcode to index the code. Regardless this
option is useful to enable future work in terms of bundling/signing
macOS applications in the "intended" way using Xcode without additional
source modifications.
#### Problem 3: Vanilla CMake + Xcode = Bad developer UX
By default, the CMake generated `.xcodeproj` is a mess. Tons of targets
are scattered about, and source files are not organized beyond grouping
them into a "Source Files" and "Header Files" group.
Even "Header Files" is missing, because the ImHex build system does not
regard private header files of libraries as sources of a target, and
Xcode does not try to guess this information.
The solution is twofold:
* Additional code has been added which organizes the targets into a neat
folder structure
* Additional code was added behind a configuration flag
`IMHEX_IDE_HELPERS_INTRUSIVE_IDE_TWEAKS` which automatically creates
source file trees in Xcode targets, and discovers the non-declared
header files via the folder convention.
### Screenshots
N/A
### Additional things
As a bonus: `IMHEX_OFFLINE_BUILD` assumes that ImHex-Patterns is cloned
into the source tree. I have added an additional fallback that tries to
locate it as a sibling folder of `${CMAKE_SOURCE_DIR}`, as this meshes
better with my filesystem setup.
The setup was tested with `CMake 3.29.2`, `Xcode 15.2`, and `llvm@17`
from homebrew.
2024-05-20 12:12:57 +02:00
set_target_properties ( ${ plugin } PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${IMHEX_MAIN_OUTPUT_DIRECTORY}/plugins" )
set_target_properties ( ${ plugin } PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${IMHEX_MAIN_OUTPUT_DIRECTORY}/plugins" )
2022-06-16 15:42:27 +02:00
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
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 ( )
2024-03-11 21:08:23 +01:00
endmacro ( )
2021-01-30 22:39:06 +01:00
2024-03-11 21:08:23 +01:00
macro ( createPackage )
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
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-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-03-22 17:31:53 +01:00
install ( CODE "execute_process(COMMAND ${CMAKE_INSTALL_NAME_TOOL} -add_rpath \" @executable_path/../Frameworks/\ " $<TARGET_FILE:main>)" )
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
2024-03-22 17:24:44 +01:00
downloadImHexPatternsFiles ( "${CMAKE_INSTALL_PREFIX}/${BUNDLE_NAME}/Contents/MacOS" )
2023-12-08 14:00:32 +01:00
2024-03-22 17:24:44 +01:00
install ( FILES ${ IMHEX_ICON } DESTINATION "${CMAKE_INSTALL_PREFIX}/${BUNDLE_NAME}/Contents/Resources" )
2023-12-30 19:11:33 +01:00
install ( TARGETS main BUNDLE DESTINATION "." )
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" )
2024-03-22 17:24:44 +01:00
set ( CPACK_BUNDLE_PLIST "${CMAKE_INSTALL_PREFIX}/${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 )
find_program ( CODESIGN_PATH codesign )
if ( CODESIGN_PATH )
2024-03-22 17:24:44 +01:00
install ( CODE "message(STATUS \" Signing bundle ' ${ CMAKE_INSTALL_PREFIX } / ${ BUNDLE_NAME } '...\ ")" )
2024-06-07 19:17:14 +02:00
install ( CODE "execute_process(COMMAND ${CODESIGN_PATH} --force --deep --entitlements ${CMAKE_SOURCE_DIR}/resources/macos/Entitlements.plist --sign - ${CMAKE_INSTALL_PREFIX}/${BUNDLE_NAME} COMMAND_ERROR_IS_FATAL ANY)" )
2024-02-01 23:56:14 +01:00
endif ( )
2024-01-25 10:32:53 +01:00
endif ( )
2024-03-22 17:24:44 +01:00
install ( CODE [[ message(STATUS "MacOS Bundle finalized. DO NOT TOUCH IT ANYMORE! ANY MODIFICATIONS WILL BREAK IT FROM NOW ON!" ) ] ] )
build: Xcode accomodating CMake setup (#1688)
### Problem description
This PR implements some rudimentary Xcode support for building and
editing ImHex.
### Implementation description
#### Problem 1: Xcode is a multi-configuration buildsystem
The project is already rather CMake generator independent, thus it did
not need to change much to support Xcode's multi-configuration paradigm:
By default, CMake generates a `.xcodeproj` in which targets build their
artifacts into the specified `<>_OUTPUT_DIRECTORY`, postfixed by the
currently active configuration. To better fit the existing paradigm, I
instead opted ot introduce `IMHEX_MAIN_OUTPUT_DIRECTORY`. This variable
is equal to the previously used `RUNTIME_OUTPUT_DIRECTORY` when using
other generators, and is changed to include a configuration specific
_prefix_ when used with Xcode.
The result is different output directories when using Xcode, and no
changes when using any other generator.
#### Problem 2: ImHex does not support AppleClang
To allow building the codebase with Xcode, I have introduced
`IMHEX_IDE_HELPERS_OVERRIDE_XCODE_COMPILER`. Specifying this option to
`ON` will force CMake to honor the user specified compiler settings,
even when using the Xcode generator.
In practice this can be used together with the new "xcode" CMakePreset
to build the project with mainline clang using `xcodebuild`, or Xcode
itself by generating a buildsystem like so:
```
cmake --preset xcode -DCMAKE_PREFIX_PATH=/opt/homebrew/opt/llvm@17
```
This solution is of course not without flaws. The inner workings are a
particularly ugly hack, and mainline clang does not implement the
necessary extensions to allow Xcode to index the code. Regardless this
option is useful to enable future work in terms of bundling/signing
macOS applications in the "intended" way using Xcode without additional
source modifications.
#### Problem 3: Vanilla CMake + Xcode = Bad developer UX
By default, the CMake generated `.xcodeproj` is a mess. Tons of targets
are scattered about, and source files are not organized beyond grouping
them into a "Source Files" and "Header Files" group.
Even "Header Files" is missing, because the ImHex build system does not
regard private header files of libraries as sources of a target, and
Xcode does not try to guess this information.
The solution is twofold:
* Additional code has been added which organizes the targets into a neat
folder structure
* Additional code was added behind a configuration flag
`IMHEX_IDE_HELPERS_INTRUSIVE_IDE_TWEAKS` which automatically creates
source file trees in Xcode targets, and discovers the non-declared
header files via the folder convention.
### Screenshots
N/A
### Additional things
As a bonus: `IMHEX_OFFLINE_BUILD` assumes that ImHex-Patterns is cloned
into the source tree. I have added an additional fallback that tries to
locate it as a sibling folder of `${CMAKE_SOURCE_DIR}`, as this meshes
better with my filesystem setup.
The setup was tested with `CMake 3.29.2`, `Xcode 15.2`, and `llvm@17`
from homebrew.
2024-05-20 12:12:57 +02:00
else ( )
downloadImHexPatternsFiles ( "${IMHEX_MAIN_OUTPUT_DIRECTORY}" )
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}" )
2024-10-24 08:14:07 +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 } )
build: Xcode accomodating CMake setup (#1688)
### Problem description
This PR implements some rudimentary Xcode support for building and
editing ImHex.
### Implementation description
#### Problem 1: Xcode is a multi-configuration buildsystem
The project is already rather CMake generator independent, thus it did
not need to change much to support Xcode's multi-configuration paradigm:
By default, CMake generates a `.xcodeproj` in which targets build their
artifacts into the specified `<>_OUTPUT_DIRECTORY`, postfixed by the
currently active configuration. To better fit the existing paradigm, I
instead opted ot introduce `IMHEX_MAIN_OUTPUT_DIRECTORY`. This variable
is equal to the previously used `RUNTIME_OUTPUT_DIRECTORY` when using
other generators, and is changed to include a configuration specific
_prefix_ when used with Xcode.
The result is different output directories when using Xcode, and no
changes when using any other generator.
#### Problem 2: ImHex does not support AppleClang
To allow building the codebase with Xcode, I have introduced
`IMHEX_IDE_HELPERS_OVERRIDE_XCODE_COMPILER`. Specifying this option to
`ON` will force CMake to honor the user specified compiler settings,
even when using the Xcode generator.
In practice this can be used together with the new "xcode" CMakePreset
to build the project with mainline clang using `xcodebuild`, or Xcode
itself by generating a buildsystem like so:
```
cmake --preset xcode -DCMAKE_PREFIX_PATH=/opt/homebrew/opt/llvm@17
```
This solution is of course not without flaws. The inner workings are a
particularly ugly hack, and mainline clang does not implement the
necessary extensions to allow Xcode to index the code. Regardless this
option is useful to enable future work in terms of bundling/signing
macOS applications in the "intended" way using Xcode without additional
source modifications.
#### Problem 3: Vanilla CMake + Xcode = Bad developer UX
By default, the CMake generated `.xcodeproj` is a mess. Tons of targets
are scattered about, and source files are not organized beyond grouping
them into a "Source Files" and "Header Files" group.
Even "Header Files" is missing, because the ImHex build system does not
regard private header files of libraries as sources of a target, and
Xcode does not try to guess this information.
The solution is twofold:
* Additional code has been added which organizes the targets into a neat
folder structure
* Additional code was added behind a configuration flag
`IMHEX_IDE_HELPERS_INTRUSIVE_IDE_TWEAKS` which automatically creates
source file trees in Xcode targets, and discovers the non-declared
header files via the folder convention.
### Screenshots
N/A
### Additional things
As a bonus: `IMHEX_OFFLINE_BUILD` assumes that ImHex-Patterns is cloned
into the source tree. I have added an additional fallback that tries to
locate it as a sibling folder of `${CMAKE_SOURCE_DIR}`, as this meshes
better with my filesystem setup.
The setup was tested with `CMake 3.29.2`, `Xcode 15.2`, and `llvm@17`
from homebrew.
2024-05-20 12:12:57 +02:00
if ( NOT XCODE )
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fuse-ld=lld" )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fuse-ld=lld" )
endif ( )
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 ( )
build: Xcode accomodating CMake setup (#1688)
### Problem description
This PR implements some rudimentary Xcode support for building and
editing ImHex.
### Implementation description
#### Problem 1: Xcode is a multi-configuration buildsystem
The project is already rather CMake generator independent, thus it did
not need to change much to support Xcode's multi-configuration paradigm:
By default, CMake generates a `.xcodeproj` in which targets build their
artifacts into the specified `<>_OUTPUT_DIRECTORY`, postfixed by the
currently active configuration. To better fit the existing paradigm, I
instead opted ot introduce `IMHEX_MAIN_OUTPUT_DIRECTORY`. This variable
is equal to the previously used `RUNTIME_OUTPUT_DIRECTORY` when using
other generators, and is changed to include a configuration specific
_prefix_ when used with Xcode.
The result is different output directories when using Xcode, and no
changes when using any other generator.
#### Problem 2: ImHex does not support AppleClang
To allow building the codebase with Xcode, I have introduced
`IMHEX_IDE_HELPERS_OVERRIDE_XCODE_COMPILER`. Specifying this option to
`ON` will force CMake to honor the user specified compiler settings,
even when using the Xcode generator.
In practice this can be used together with the new "xcode" CMakePreset
to build the project with mainline clang using `xcodebuild`, or Xcode
itself by generating a buildsystem like so:
```
cmake --preset xcode -DCMAKE_PREFIX_PATH=/opt/homebrew/opt/llvm@17
```
This solution is of course not without flaws. The inner workings are a
particularly ugly hack, and mainline clang does not implement the
necessary extensions to allow Xcode to index the code. Regardless this
option is useful to enable future work in terms of bundling/signing
macOS applications in the "intended" way using Xcode without additional
source modifications.
#### Problem 3: Vanilla CMake + Xcode = Bad developer UX
By default, the CMake generated `.xcodeproj` is a mess. Tons of targets
are scattered about, and source files are not organized beyond grouping
them into a "Source Files" and "Header Files" group.
Even "Header Files" is missing, because the ImHex build system does not
regard private header files of libraries as sources of a target, and
Xcode does not try to guess this information.
The solution is twofold:
* Additional code has been added which organizes the targets into a neat
folder structure
* Additional code was added behind a configuration flag
`IMHEX_IDE_HELPERS_INTRUSIVE_IDE_TWEAKS` which automatically creates
source file trees in Xcode targets, and discovers the non-declared
header files via the folder convention.
### Screenshots
N/A
### Additional things
As a bonus: `IMHEX_OFFLINE_BUILD` assumes that ImHex-Patterns is cloned
into the source tree. I have added an additional fallback that tries to
locate it as a sibling folder of `${CMAKE_SOURCE_DIR}`, as this meshes
better with my filesystem setup.
The setup was tested with `CMake 3.29.2`, `Xcode 15.2`, and `llvm@17`
from homebrew.
2024-05-20 12:12:57 +02:00
function ( configureProject )
if ( XCODE )
# Support Xcode's multi configuration paradigm by placing built artifacts into separate directories
set ( IMHEX_MAIN_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/Configs/$<CONFIG>" PARENT_SCOPE )
else ( )
set ( IMHEX_MAIN_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" PARENT_SCOPE )
endif ( )
endfunction ( )
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 ( )
2024-06-05 20:59:48 +02:00
function ( loadVersion version plain_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 )
2024-06-05 20:59:48 +02:00
string ( REPLACE ".WIP" "" read_version_plain ${ read_version } )
2022-07-27 08:27:38 +02:00
set ( ${ version } ${ read_version } PARENT_SCOPE )
2024-06-05 20:59:48 +02:00
set ( ${ plain_version } ${ read_version_plain } PARENT_SCOPE )
2022-07-27 08:27:38 +02:00
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 ( )
build: Xcode accomodating CMake setup (#1688)
### Problem description
This PR implements some rudimentary Xcode support for building and
editing ImHex.
### Implementation description
#### Problem 1: Xcode is a multi-configuration buildsystem
The project is already rather CMake generator independent, thus it did
not need to change much to support Xcode's multi-configuration paradigm:
By default, CMake generates a `.xcodeproj` in which targets build their
artifacts into the specified `<>_OUTPUT_DIRECTORY`, postfixed by the
currently active configuration. To better fit the existing paradigm, I
instead opted ot introduce `IMHEX_MAIN_OUTPUT_DIRECTORY`. This variable
is equal to the previously used `RUNTIME_OUTPUT_DIRECTORY` when using
other generators, and is changed to include a configuration specific
_prefix_ when used with Xcode.
The result is different output directories when using Xcode, and no
changes when using any other generator.
#### Problem 2: ImHex does not support AppleClang
To allow building the codebase with Xcode, I have introduced
`IMHEX_IDE_HELPERS_OVERRIDE_XCODE_COMPILER`. Specifying this option to
`ON` will force CMake to honor the user specified compiler settings,
even when using the Xcode generator.
In practice this can be used together with the new "xcode" CMakePreset
to build the project with mainline clang using `xcodebuild`, or Xcode
itself by generating a buildsystem like so:
```
cmake --preset xcode -DCMAKE_PREFIX_PATH=/opt/homebrew/opt/llvm@17
```
This solution is of course not without flaws. The inner workings are a
particularly ugly hack, and mainline clang does not implement the
necessary extensions to allow Xcode to index the code. Regardless this
option is useful to enable future work in terms of bundling/signing
macOS applications in the "intended" way using Xcode without additional
source modifications.
#### Problem 3: Vanilla CMake + Xcode = Bad developer UX
By default, the CMake generated `.xcodeproj` is a mess. Tons of targets
are scattered about, and source files are not organized beyond grouping
them into a "Source Files" and "Header Files" group.
Even "Header Files" is missing, because the ImHex build system does not
regard private header files of libraries as sources of a target, and
Xcode does not try to guess this information.
The solution is twofold:
* Additional code has been added which organizes the targets into a neat
folder structure
* Additional code was added behind a configuration flag
`IMHEX_IDE_HELPERS_INTRUSIVE_IDE_TWEAKS` which automatically creates
source file trees in Xcode targets, and discovers the non-declared
header files via the folder convention.
### Screenshots
N/A
### Additional things
As a bonus: `IMHEX_OFFLINE_BUILD` assumes that ImHex-Patterns is cloned
into the source tree. I have added an additional fallback that tries to
locate it as a sibling folder of `${CMAKE_SOURCE_DIR}`, as this meshes
better with my filesystem setup.
The setup was tested with `CMake 3.29.2`, `Xcode 15.2`, and `llvm@17`
from homebrew.
2024-05-20 12:12:57 +02:00
set ( imhex_patterns_SOURCE_DIR "" )
2022-09-13 22:34:33 +02:00
# Maybe patterns are cloned to a subdirectory
build: Xcode accomodating CMake setup (#1688)
### Problem description
This PR implements some rudimentary Xcode support for building and
editing ImHex.
### Implementation description
#### Problem 1: Xcode is a multi-configuration buildsystem
The project is already rather CMake generator independent, thus it did
not need to change much to support Xcode's multi-configuration paradigm:
By default, CMake generates a `.xcodeproj` in which targets build their
artifacts into the specified `<>_OUTPUT_DIRECTORY`, postfixed by the
currently active configuration. To better fit the existing paradigm, I
instead opted ot introduce `IMHEX_MAIN_OUTPUT_DIRECTORY`. This variable
is equal to the previously used `RUNTIME_OUTPUT_DIRECTORY` when using
other generators, and is changed to include a configuration specific
_prefix_ when used with Xcode.
The result is different output directories when using Xcode, and no
changes when using any other generator.
#### Problem 2: ImHex does not support AppleClang
To allow building the codebase with Xcode, I have introduced
`IMHEX_IDE_HELPERS_OVERRIDE_XCODE_COMPILER`. Specifying this option to
`ON` will force CMake to honor the user specified compiler settings,
even when using the Xcode generator.
In practice this can be used together with the new "xcode" CMakePreset
to build the project with mainline clang using `xcodebuild`, or Xcode
itself by generating a buildsystem like so:
```
cmake --preset xcode -DCMAKE_PREFIX_PATH=/opt/homebrew/opt/llvm@17
```
This solution is of course not without flaws. The inner workings are a
particularly ugly hack, and mainline clang does not implement the
necessary extensions to allow Xcode to index the code. Regardless this
option is useful to enable future work in terms of bundling/signing
macOS applications in the "intended" way using Xcode without additional
source modifications.
#### Problem 3: Vanilla CMake + Xcode = Bad developer UX
By default, the CMake generated `.xcodeproj` is a mess. Tons of targets
are scattered about, and source files are not organized beyond grouping
them into a "Source Files" and "Header Files" group.
Even "Header Files" is missing, because the ImHex build system does not
regard private header files of libraries as sources of a target, and
Xcode does not try to guess this information.
The solution is twofold:
* Additional code has been added which organizes the targets into a neat
folder structure
* Additional code was added behind a configuration flag
`IMHEX_IDE_HELPERS_INTRUSIVE_IDE_TWEAKS` which automatically creates
source file trees in Xcode targets, and discovers the non-declared
header files via the folder convention.
### Screenshots
N/A
### Additional things
As a bonus: `IMHEX_OFFLINE_BUILD` assumes that ImHex-Patterns is cloned
into the source tree. I have added an additional fallback that tries to
locate it as a sibling folder of `${CMAKE_SOURCE_DIR}`, as this meshes
better with my filesystem setup.
The setup was tested with `CMake 3.29.2`, `Xcode 15.2`, and `llvm@17`
from homebrew.
2024-05-20 12:12:57 +02:00
if ( NOT EXISTS ${ imhex_patterns_SOURCE_DIR } )
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" )
endif ( )
2022-09-13 22:34:33 +02:00
endif ( )
build: Xcode accomodating CMake setup (#1688)
### Problem description
This PR implements some rudimentary Xcode support for building and
editing ImHex.
### Implementation description
#### Problem 1: Xcode is a multi-configuration buildsystem
The project is already rather CMake generator independent, thus it did
not need to change much to support Xcode's multi-configuration paradigm:
By default, CMake generates a `.xcodeproj` in which targets build their
artifacts into the specified `<>_OUTPUT_DIRECTORY`, postfixed by the
currently active configuration. To better fit the existing paradigm, I
instead opted ot introduce `IMHEX_MAIN_OUTPUT_DIRECTORY`. This variable
is equal to the previously used `RUNTIME_OUTPUT_DIRECTORY` when using
other generators, and is changed to include a configuration specific
_prefix_ when used with Xcode.
The result is different output directories when using Xcode, and no
changes when using any other generator.
#### Problem 2: ImHex does not support AppleClang
To allow building the codebase with Xcode, I have introduced
`IMHEX_IDE_HELPERS_OVERRIDE_XCODE_COMPILER`. Specifying this option to
`ON` will force CMake to honor the user specified compiler settings,
even when using the Xcode generator.
In practice this can be used together with the new "xcode" CMakePreset
to build the project with mainline clang using `xcodebuild`, or Xcode
itself by generating a buildsystem like so:
```
cmake --preset xcode -DCMAKE_PREFIX_PATH=/opt/homebrew/opt/llvm@17
```
This solution is of course not without flaws. The inner workings are a
particularly ugly hack, and mainline clang does not implement the
necessary extensions to allow Xcode to index the code. Regardless this
option is useful to enable future work in terms of bundling/signing
macOS applications in the "intended" way using Xcode without additional
source modifications.
#### Problem 3: Vanilla CMake + Xcode = Bad developer UX
By default, the CMake generated `.xcodeproj` is a mess. Tons of targets
are scattered about, and source files are not organized beyond grouping
them into a "Source Files" and "Header Files" group.
Even "Header Files" is missing, because the ImHex build system does not
regard private header files of libraries as sources of a target, and
Xcode does not try to guess this information.
The solution is twofold:
* Additional code has been added which organizes the targets into a neat
folder structure
* Additional code was added behind a configuration flag
`IMHEX_IDE_HELPERS_INTRUSIVE_IDE_TWEAKS` which automatically creates
source file trees in Xcode targets, and discovers the non-declared
header files via the folder convention.
### Screenshots
N/A
### Additional things
As a bonus: `IMHEX_OFFLINE_BUILD` assumes that ImHex-Patterns is cloned
into the source tree. I have added an additional fallback that tries to
locate it as a sibling folder of `${CMAKE_SOURCE_DIR}`, as this meshes
better with my filesystem setup.
The setup was tested with `CMake 3.29.2`, `Xcode 15.2`, and `llvm@17`
from homebrew.
2024-05-20 12:12:57 +02:00
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
file ( GLOB_RECURSE sourceFilePaths LIST_DIRECTORIES NO CONFIGURE_DEPENDS RELATIVE "${imhex_patterns_SOURCE_DIR}"
" $ { i m h e x _ p a t t e r n s _ S O U R C E _ D I R } / c o n s t a n t s / * "
" $ { i m h e x _ p a t t e r n s _ S O U R C E _ D I R } / e n c o d i n g s / * "
" $ { i m h e x _ p a t t e r n s _ S O U R C E _ D I R } / i n c l u d e s / * "
" $ { i m h e x _ p a t t e r n s _ S O U R C E _ D I R } / p a t t e r n s / * "
" $ { i m h e x _ p a t t e r n s _ S O U R C E _ D I R } / m a g i c / * "
" $ { i m h e x _ p a t t e r n s _ S O U R C E _ D I R } / n o d e s / * "
)
list ( FILTER sourceFilePaths EXCLUDE REGEX "_schema.json$" )
foreach ( relativePath IN LISTS sourceFilePaths )
file ( GENERATE OUTPUT "${dest}/${relativePath}" INPUT "${imhex_patterns_SOURCE_DIR}/${relativePath}" )
endforeach ( )
else ( )
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 } )
build: Xcode accomodating CMake setup (#1688)
### Problem description
This PR implements some rudimentary Xcode support for building and
editing ImHex.
### Implementation description
#### Problem 1: Xcode is a multi-configuration buildsystem
The project is already rather CMake generator independent, thus it did
not need to change much to support Xcode's multi-configuration paradigm:
By default, CMake generates a `.xcodeproj` in which targets build their
artifacts into the specified `<>_OUTPUT_DIRECTORY`, postfixed by the
currently active configuration. To better fit the existing paradigm, I
instead opted ot introduce `IMHEX_MAIN_OUTPUT_DIRECTORY`. This variable
is equal to the previously used `RUNTIME_OUTPUT_DIRECTORY` when using
other generators, and is changed to include a configuration specific
_prefix_ when used with Xcode.
The result is different output directories when using Xcode, and no
changes when using any other generator.
#### Problem 2: ImHex does not support AppleClang
To allow building the codebase with Xcode, I have introduced
`IMHEX_IDE_HELPERS_OVERRIDE_XCODE_COMPILER`. Specifying this option to
`ON` will force CMake to honor the user specified compiler settings,
even when using the Xcode generator.
In practice this can be used together with the new "xcode" CMakePreset
to build the project with mainline clang using `xcodebuild`, or Xcode
itself by generating a buildsystem like so:
```
cmake --preset xcode -DCMAKE_PREFIX_PATH=/opt/homebrew/opt/llvm@17
```
This solution is of course not without flaws. The inner workings are a
particularly ugly hack, and mainline clang does not implement the
necessary extensions to allow Xcode to index the code. Regardless this
option is useful to enable future work in terms of bundling/signing
macOS applications in the "intended" way using Xcode without additional
source modifications.
#### Problem 3: Vanilla CMake + Xcode = Bad developer UX
By default, the CMake generated `.xcodeproj` is a mess. Tons of targets
are scattered about, and source files are not organized beyond grouping
them into a "Source Files" and "Header Files" group.
Even "Header Files" is missing, because the ImHex build system does not
regard private header files of libraries as sources of a target, and
Xcode does not try to guess this information.
The solution is twofold:
* Additional code has been added which organizes the targets into a neat
folder structure
* Additional code was added behind a configuration flag
`IMHEX_IDE_HELPERS_INTRUSIVE_IDE_TWEAKS` which automatically creates
source file trees in Xcode targets, and discovers the non-declared
header files via the folder convention.
### Screenshots
N/A
### Additional things
As a bonus: `IMHEX_OFFLINE_BUILD` assumes that ImHex-Patterns is cloned
into the source tree. I have added an additional fallback that tries to
locate it as a sibling folder of `${CMAKE_SOURCE_DIR}`, as this meshes
better with my filesystem setup.
The setup was tested with `CMake 3.29.2`, `Xcode 15.2`, and `llvm@17`
from homebrew.
2024-05-20 12:12:57 +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 ( )
2024-05-26 20:48:14 +02:00
# Compress debug info. See https://github.com/WerWolv/ImHex/issues/1714 for relevant problem
macro ( setupDebugCompressionFlag )
include ( CheckCXXCompilerFlag )
include ( CheckLinkerFlag )
check_cxx_compiler_flag ( -gz=zstd ZSTD_AVAILABLE_COMPILER )
check_linker_flag ( CXX -gz=zstd ZSTD_AVAILABLE_LINKER )
check_cxx_compiler_flag ( -gz COMPRESS_AVAILABLE_COMPILER )
check_linker_flag ( CXX -gz COMPRESS_AVAILABLE_LINKER )
if ( NOT DEBUG_COMPRESSION_FLAG ) # Cache variable
if ( ZSTD_AVAILABLE_COMPILER AND ZSTD_AVAILABLE_LINKER )
message ( "Using Zstd compression for debug info because both compiler and linker support it" )
set ( DEBUG_COMPRESSION_FLAG "-gz=zstd" CACHE STRING "Cache to use for debug info compression" )
elseif ( COMPRESS_AVAILABLE_COMPILER AND COMPRESS_AVAILABLE_LINKER )
message ( "Using default compression for debug info because both compiler and linker support it" )
set ( DEBUG_COMPRESSION_FLAG "-gz" CACHE STRING "Cache to use for debug info compression" )
endif ( )
endif ( )
set ( IMHEX_COMMON_FLAGS "${IMHEX_COMMON_FLAGS} ${DEBUG_COMPRESSION_FLAG}" )
endmacro ( )
2023-06-18 14:42:48 +02:00
macro ( setupCompilerFlags target )
2024-05-21 15:00:51 +02:00
# IMHEX_COMMON_FLAGS: flags common for C, C++, Objective C, etc.. compilers
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 ( )
2024-09-08 10:45:38 +02:00
if ( CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND APPLE )
execute_process ( COMMAND brew --prefix llvm OUTPUT_VARIABLE LLVM_PREFIX OUTPUT_STRIP_TRAILING_WHITESPACE )
set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${LLVM_PREFIX}/lib/c++" )
set ( CMAKE_SHARED_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${LLVM_PREFIX}/lib/c++" )
endif ( )
2023-11-25 16:40:12 +01:00
# 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 ( )
2024-05-26 20:48:14 +02:00
if ( IMHEX_COMPRESS_DEBUG_INFO )
setupDebugCompressionFlag ( )
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}" )
2024-05-27 16:33:15 +02:00
# Only generate minimal debug information for stacktraces in RelWithDebInfo builds
set ( CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -g1" )
set ( CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -g1" )
if ( CMAKE_CXX_COMPILER_ID STREQUAL "GNU" )
# Add flags for debug info in inline functions
set ( CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -gstatement-frontiers -ginline-points" )
set ( CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -gstatement-frontiers -ginline-points" )
endif ( )
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 ( )
2024-05-01 20:36:10 +02:00
if ( NOT USE_SYSTEM_LUNASVG )
add_subdirectory ( ${ THIRD_PARTY_LIBS_FOLDER } /lunasvg EXCLUDE_FROM_ALL )
set ( LUNASVG_LIBRARIES lunasvg )
else ( )
find_package ( LunaSVG REQUIRED )
set ( LUNASVG_LIBRARIES lunasvg )
endif ( )
2023-01-04 12:34:38 +01:00
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-06-07 23:12:18 +02:00
if ( USE_SYSTEM_BOOST )
2024-08-20 20:29:03 +02:00
find_package ( Boost REQUIRED )
set ( BOOST_LIBRARIES Boost::regex )
2024-06-07 23:12:18 +02:00
else ( )
add_subdirectory ( ${ THIRD_PARTY_LIBS_FOLDER } /boost ${ CMAKE_CURRENT_BINARY_DIR } /boost EXCLUDE_FROM_ALL )
2024-06-30 21:55:29 +02:00
set ( BOOST_LIBRARIES boost::regex )
2024-06-07 23:12:18 +02:00
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}" )
2024-03-15 17:53:12 +01:00
if ( 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 } )
2024-03-15 17:53:12 +01:00
add_compile_definitions ( BACKTRACE_HEADER=< ${ Backtrace_HEADER } > )
add_compile_definitions ( HEX_HAS_BACKTRACE )
elseif ( 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 } )
2024-03-15 17:53:12 +01:00
add_compile_definitions ( BACKTRACE_HEADER=< ${ Backtrace_HEADER } > )
add_compile_definitions ( HEX_HAS_EXECINFO )
endif ( )
2023-02-17 17:52:10 +01:00
endif ( )
2024-03-15 17:53:12 +01:00
endif ( )
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 )
2024-03-22 17:24:44 +01:00
set ( SDK_PATH "${CMAKE_INSTALL_PREFIX}/${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 ( )
2024-07-10 20:50:20 +02:00
if ( NOT USE_SYSTEM_BOOST )
2024-06-30 21:55:29 +02:00
install ( DIRECTORY ${ CMAKE_SOURCE_DIR } /lib/third_party/boost DESTINATION "${SDK_PATH}/lib/third_party" )
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 ( )