diff --git a/cmake/build_helpers.cmake b/cmake/build_helpers.cmake index 48e243e01..49bceca19 100644 --- a/cmake/build_helpers.cmake +++ b/cmake/build_helpers.cmake @@ -529,8 +529,6 @@ macro(setUninstallTarget) endmacro() macro(addBundledLibraries) - find_package(PkgConfig REQUIRED) - set(EXTERNAL_LIBS_FOLDER "${CMAKE_CURRENT_SOURCE_DIR}/lib/external") set(THIRD_PARTY_LIBS_FOLDER "${CMAKE_CURRENT_SOURCE_DIR}/lib/third_party") @@ -552,14 +550,12 @@ macro(addBundledLibraries) set(XDGPP_INCLUDE_DIRS "${THIRD_PARTY_LIBS_FOLDER}/xdgpp") set(FPHSA_NAME_MISMATCHED ON CACHE BOOL "") - find_package(PkgConfig REQUIRED) - if(NOT USE_SYSTEM_FMT) add_subdirectory(${THIRD_PARTY_LIBS_FOLDER}/fmt EXCLUDE_FROM_ALL) set_target_properties(fmt PROPERTIES POSITION_INDEPENDENT_CODE ON) set(FMT_LIBRARIES fmt::fmt-header-only) else() - find_package(fmt 8.0.0 REQUIRED) + find_package(fmt REQUIRED) set(FMT_LIBRARIES fmt::fmt) endif() @@ -571,8 +567,7 @@ macro(addBundledLibraries) if (NOT EMSCRIPTEN) # curl - find_package(PkgConfig REQUIRED) - pkg_check_modules(LIBCURL REQUIRED IMPORTED_TARGET libcurl>=7.60.0) + find_package(CURL REQUIRED) # nfd if (NOT USE_SYSTEM_NFD) @@ -617,13 +612,7 @@ macro(addBundledLibraries) set_target_properties(libpl PROPERTIES POSITION_INDEPENDENT_CODE ON) find_package(mbedTLS 3.4.0 REQUIRED) - - pkg_search_module(MAGIC libmagic>=5.39) - if(NOT MAGIC_FOUND) - find_library(MAGIC 5.39 magic REQUIRED) - else() - set(MAGIC_INCLUDE_DIRS ${MAGIC_INCLUDEDIR}) - endif() + find_library(MAGIC 5.39 magic REQUIRED) if (NOT IMHEX_DISABLE_STACKTRACE) if (WIN32) diff --git a/cmake/modules/FindCapstone.cmake b/cmake/modules/FindCapstone.cmake new file mode 100644 index 000000000..c745dfd2b --- /dev/null +++ b/cmake/modules/FindCapstone.cmake @@ -0,0 +1,8 @@ +find_path(CAPSTONE_INCLUDE_DIR capstone.h PATH_SUFFIXES capstone) +find_library(CAPSTONE_LIBRARY NAMES capstone) + +include(FindPackageHandleStandardArgs) + +find_package_handle_standard_args(Capstone DEFAULT_MSG CAPSTONE_LIBRARY CAPSTONE_INCLUDE_DIR) + +mark_as_advanced(CAPSTONE_INCLUDE_DIR CAPSTONE_LIBRARY) \ No newline at end of file diff --git a/cmake/modules/FindGLFW.cmake b/cmake/modules/FindGLFW.cmake new file mode 100644 index 000000000..00e14bee5 --- /dev/null +++ b/cmake/modules/FindGLFW.cmake @@ -0,0 +1,139 @@ +#.rst: +# Find GLFW +# --------- +# +# Finds the GLFW library using its cmake config if that exists, otherwise +# falls back to finding it manually. This module defines: +# +# GLFW_FOUND - True if GLFW library is found +# GLFW::GLFW - GLFW imported target +# +# Additionally, in case the config was not found, these variables are defined +# for internal usage: +# +# GLFW_LIBRARY - GLFW library +# GLFW_DLL_DEBUG - GLFW debug DLL on Windows, if found +# GLFW_DLL_RELEASE - GLFW release DLL on Windows, if found +# GLFW_INCLUDE_DIR - Root include dir +# + +# +# This file is part of Magnum. +# +# Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, +# 2020, 2021, 2022 Vladimír Vondruš +# Copyright © 2016 Jonathan Hale +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. +# + +# GLFW installs cmake package config files which handles dependencies in case +# GLFW is built statically. Try to find first, quietly, so it doesn't print +# loud messages when it's not found, since that's okay. If the glfw target +# already exists, it means we're using it through a CMake subproject -- don't +# attempt to find the package in that case. +if(NOT TARGET glfw) + find_package(glfw3 CONFIG QUIET) +endif() + +# If either a glfw config file was found or we have a subproject, point +# GLFW::GLFW to that and exit -- nothing else to do here. +if(TARGET glfw) + if(NOT TARGET GLFW::GLFW) + # Aliases of (global) targets are only supported in CMake 3.11, so we + # work around it by this. This is easier than fetching all possible + # properties (which are impossible to track of) and then attempting to + # rebuild them into a new target. + add_library(GLFW::GLFW INTERFACE IMPORTED) + set_target_properties(GLFW::GLFW PROPERTIES INTERFACE_LINK_LIBRARIES glfw) + endif() + + # Just to make FPHSA print some meaningful location, nothing else + get_target_property(_GLFW_INTERFACE_INCLUDE_DIRECTORIES glfw INTERFACE_INCLUDE_DIRECTORIES) + include(FindPackageHandleStandardArgs) + find_package_handle_standard_args("GLFW" DEFAULT_MSG + _GLFW_INTERFACE_INCLUDE_DIRECTORIES) + + if(CORRADE_TARGET_WINDOWS) + # .dll is in LOCATION, .lib is in IMPLIB. Yay, useful! + get_target_property(GLFW_DLL_DEBUG glfw IMPORTED_LOCATION_DEBUG) + get_target_property(GLFW_DLL_RELEASE glfw IMPORTED_LOCATION_RELEASE) + endif() + + return() +endif() + +if(CORRADE_TARGET_WINDOWS) + if(MSVC) + if(MSVC_VERSION VERSION_LESS 1910) + set(_GLFW_LIBRARY_PATH_SUFFIX lib-vc2015) + elseif(MSVC_VERSION VERSION_LESS 1920) + set(_GLFW_LIBRARY_PATH_SUFFIX lib-vc2017) + elseif(MSVC_VERSION VERSION_LESS 1930) + set(_GLFW_LIBRARY_PATH_SUFFIX lib-vc2019) + elseif(MSVC_VERSION VERSION_LESS 1940) + set(_GLFW_LIBRARY_PATH_SUFFIX lib-vc2022) + else() + message(FATAL_ERROR "Unsupported MSVC version") + endif() + elseif(MINGW) + set(_GLFW_LIBRARY_PATH_SUFFIX lib-mingw-w64) + else() + message(FATAL_ERROR "Unsupported compiler") + endif() +endif() + +# In case no config file was found, try manually finding the library. Prefer +# the glfw3dll as it's a dynamic library. +find_library(GLFW_LIBRARY + NAMES glfw glfw3dll glfw3 + PATH_SUFFIXES ${_GLFW_LIBRARY_PATH_SUFFIX}) + +if(CORRADE_TARGET_WINDOWS AND GLFW_LIBRARY MATCHES "glfw3dll.(lib|a)$") + # TODO: debug? + find_file(GLFW_DLL_RELEASE + NAMES glfw3.dll + PATH_SUFFIXES ${_GLFW_LIBRARY_PATH_SUFFIX}) +endif() + +# Include dir +find_path(GLFW_INCLUDE_DIR + NAMES GLFW/glfw3.h) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args("GLFW" DEFAULT_MSG + GLFW_LIBRARY + GLFW_INCLUDE_DIR) + +if(NOT TARGET GLFW::GLFW) + add_library(GLFW::GLFW UNKNOWN IMPORTED) + + # Work around BUGGY framework support on macOS + # https://cmake.org/Bug/view.php?id=14105 + if(CORRADE_TARGET_APPLE AND GLFW_LIBRARY MATCHES "\\.framework$") + set_property(TARGET GLFW::GLFW PROPERTY IMPORTED_LOCATION ${GLFW_LIBRARY}/GLFW) + else() + set_property(TARGET GLFW::GLFW PROPERTY IMPORTED_LOCATION ${GLFW_LIBRARY}) + endif() + + set_property(TARGET GLFW::GLFW PROPERTY + INTERFACE_INCLUDE_DIRECTORIES ${GLFW_INCLUDE_DIR}) +endif() + +mark_as_advanced(GLFW_LIBRARY GLFW_INCLUDE_DIR) \ No newline at end of file diff --git a/cmake/modules/FindYara.cmake b/cmake/modules/FindYara.cmake new file mode 100644 index 000000000..db2778610 --- /dev/null +++ b/cmake/modules/FindYara.cmake @@ -0,0 +1,4 @@ +find_file(libyara.a YARA_LIBRARIES) +find_file(yara.h YARA_INCLUDE_DIRS) + +mark_as_advanced(YARA_LIBRARIES YARA_INCLUDE_DIRS) \ No newline at end of file diff --git a/cmake/modules/FindZSTD.cmake b/cmake/modules/FindZSTD.cmake new file mode 100644 index 000000000..b7aa3804d --- /dev/null +++ b/cmake/modules/FindZSTD.cmake @@ -0,0 +1,41 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# +# - Try to find Facebook zstd library +# This will define +# ZSTD_FOUND +# ZSTD_INCLUDE_DIR +# ZSTD_LIBRARY +# + +find_path(ZSTD_INCLUDE_DIR NAMES zstd.h) + +find_library(ZSTD_LIBRARY_DEBUG NAMES zstdd zstd_staticd) +find_library(ZSTD_LIBRARY_RELEASE NAMES zstd zstd_static) + +include(SelectLibraryConfigurations) +SELECT_LIBRARY_CONFIGURATIONS(ZSTD) + +include(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS( + ZSTD DEFAULT_MSG + ZSTD_LIBRARY ZSTD_INCLUDE_DIR +) + +if (ZSTD_FOUND) + message(STATUS "Found Zstd: ${ZSTD_LIBRARY}") +endif() + +mark_as_advanced(ZSTD_INCLUDE_DIR ZSTD_LIBRARY) \ No newline at end of file diff --git a/lib/libimhex/CMakeLists.txt b/lib/libimhex/CMakeLists.txt index 96baa4286..a7c501e09 100644 --- a/lib/libimhex/CMakeLists.txt +++ b/lib/libimhex/CMakeLists.txt @@ -84,13 +84,12 @@ setupCompilerFlags(libimhex) include(GenerateExportHeader) generate_export_header(libimhex) -target_include_directories(libimhex ${LIBIMHEX_LIBRARY_TYPE} include ${XDGPP_INCLUDE_DIRS} ${MBEDTLS_INCLUDE_DIR} ${MAGIC_INCLUDE_DIRS} ${LLVM_INCLUDE_DIRS} ${FMT_INCLUDE_DIRS} ${CURL_INCLUDE_DIRS} ${LIBBACKTRACE_INCLUDE_DIRS}) +target_include_directories(libimhex ${LIBIMHEX_LIBRARY_TYPE} include ${XDGPP_INCLUDE_DIRS} ${MBEDTLS_INCLUDE_DIR} ${MAGIC_INCLUDE_DIRS} ${LLVM_INCLUDE_DIRS} ${FMT_INCLUDE_DIRS} ${LIBBACKTRACE_INCLUDE_DIRS}) target_link_directories(libimhex ${LIBIMHEX_LIBRARY_TYPE} ${MBEDTLS_LIBRARY_DIR} ${MAGIC_LIBRARY_DIRS}) if (NOT EMSCRIPTEN) # curl is only used in non-emscripten builds - target_include_directories(libimhex ${LIBIMHEX_LIBRARY_TYPE} ${CURL_INCLUDE_DIRS}) - target_link_libraries(libimhex ${LIBIMHEX_LIBRARY_TYPE} ${LIBCURL_LIBRARIES}) + target_link_libraries(libimhex ${LIBIMHEX_LIBRARY_TYPE} ${CURL_LIBRARIES}) endif() diff --git a/lib/third_party/imgui/custom/CMakeLists.txt b/lib/third_party/imgui/custom/CMakeLists.txt index 615f90906..90c75b9ec 100644 --- a/lib/third_party/imgui/custom/CMakeLists.txt +++ b/lib/third_party/imgui/custom/CMakeLists.txt @@ -17,16 +17,25 @@ target_link_libraries(imgui_custom PRIVATE imgui_includes) set_property(TARGET imgui_custom PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(imgui_all_includes INTERFACE include) -find_package(PkgConfig REQUIRED) find_package(OpenGL REQUIRED) find_package(Freetype REQUIRED) -pkg_search_module(GLFW REQUIRED glfw3) -# pkgsearch somehow reports the glfw3 library as glfw3dll in Release builds on MinGW which is not correct +find_package(GLFW QUIET) +if (NOT GLFW_FOUND OR "${GLFW_LIBRARIES}" STREQUAL "") + find_package(glfw3 QUIET) + set(GLFW_INCLUDE_DIRS ${glfw3_INCLUDE_DIRS}) + set(GLFW_LIBRARIES ${glfw3_LIBRARIES}) + + if (NOT glfw3_FOUND OR "${GLFW_LIBRARIES}" STREQUAL "") + find_package(PkgConfig REQUIRED) + pkg_search_module(GLFW REQUIRED glfw3) + endif () +endif() + if ("${GLFW_LIBRARIES}" MATCHES ".+dll") set(GLFW_LIBRARIES "glfw3") endif () -target_include_directories(imgui_custom PUBLIC ${FREETYPE_INCLUDE_DIRS} ${GLFW_INCLUDE_DIRS} ${OpenGL_INCLUDE_DIRS}) -target_link_directories(imgui_custom PUBLIC ${FREETYPE_LIBRARY_DIRS} ${GLFW_LIBRARY_DIRS} ${OpenGL_LIBRARY_DIRS}) +target_include_directories(imgui_custom PUBLIC ${FREETYPE_INCLUDE_DIRS} ${OpenGL_INCLUDE_DIRS}) +target_link_directories(imgui_custom PUBLIC ${FREETYPE_LIBRARY_DIRS} ${OpenGL_LIBRARY_DIRS}) target_link_libraries(imgui_custom PUBLIC ${GLFW_LIBRARIES} ${OPENGL_LIBRARIES}) \ No newline at end of file diff --git a/plugins/disassembler/CMakeLists.txt b/plugins/disassembler/CMakeLists.txt index c3c3e311b..996d282bf 100644 --- a/plugins/disassembler/CMakeLists.txt +++ b/plugins/disassembler/CMakeLists.txt @@ -9,11 +9,10 @@ if (NOT USE_SYSTEM_CAPSTONE) add_subdirectory(${THIRD_PARTY_LIBS_FOLDER}/capstone ${CMAKE_CURRENT_BINARY_DIR}/capstone EXCLUDE_FROM_ALL) set_target_properties(capstone PROPERTIES POSITION_INDEPENDENT_CODE ON) target_compile_options(capstone PRIVATE -Wno-unused-function) - set(CAPSTONE_LIBRARIES "capstone") - set(CAPSTONE_INCLUDE_DIRS ${THIRD_PARTY_LIBS_FOLDER}/capstone/include) + set(CAPSTONE_LIBRARY "capstone") + set(CAPSTONE_INCLUDE_DIR ${THIRD_PARTY_LIBS_FOLDER}/capstone/include) else() - find_package(PkgConfig REQUIRED) - pkg_search_module(CAPSTONE 4.0.2 REQUIRED capstone) + find_package(Capstone REQUIRED) endif() add_imhex_plugin( @@ -27,7 +26,8 @@ add_imhex_plugin( source/content/pl_visualizers/disassembler.cpp INCLUDES include + ${CAPSTONE_INCLUDE_DIR} LIBRARIES - ${CAPSTONE_LIBRARIES} + ${CAPSTONE_LIBRARY} ui ) diff --git a/plugins/visualizers/CMakeLists.txt b/plugins/visualizers/CMakeLists.txt index ff2f266bc..c7b4b4468 100644 --- a/plugins/visualizers/CMakeLists.txt +++ b/plugins/visualizers/CMakeLists.txt @@ -7,8 +7,7 @@ if (NOT USE_SYSTEM_MINIAUDIO) set_target_properties(miniaudio PROPERTIES POSITION_INDEPENDENT_CODE ON) set(MINIAUDIO_LIBRARIES miniaudio) else() - find_package(PkgConfig REQUIRED) - pkg_check_modules(miniaudio REQUIRED IMPORTED_TARGET miniaudio) + find_package(miniaudio REQUIRED) endif() add_imhex_plugin( diff --git a/plugins/yara_rules/CMakeLists.txt b/plugins/yara_rules/CMakeLists.txt index 0110cadf9..092b9b16b 100644 --- a/plugins/yara_rules/CMakeLists.txt +++ b/plugins/yara_rules/CMakeLists.txt @@ -7,8 +7,7 @@ if (NOT USE_SYSTEM_YARA) set_target_properties(libyara PROPERTIES POSITION_INDEPENDENT_CODE ON) set(YARA_LIBRARIES libyara) else() - find_package(PkgConfig REQUIRED) - pkg_check_modules(YARA REQUIRED IMPORTED_TARGET yara) + find_package(Yara REQUIRED) endif() add_imhex_plugin(