From c4d7d649f1596f80a9bd6dc5ddadf67df85c4cf4 Mon Sep 17 00:00:00 2001 From: karliss Date: Sun, 15 Mar 2020 15:43:42 +0200 Subject: [PATCH] Add installing to CMake (#2084) --- .gitignore | 4 ++ src/CMakeLists.txt | 71 +++++++++++++++++++++++++------ src/Cutter.pro | 2 +- src/cmake/BundledRadare2.cmake | 50 ++++++++++++++++++---- src/cmake/CutterConfig.cmake | 1 + src/cmake/CutterInstallDirs.cmake | 10 +++++ src/cmake/FindGraphviz.cmake | 16 ++++--- src/cmake/FindRadare2.cmake | 34 +++++++-------- src/common/ColorThemeWorker.cpp | 3 +- src/core/CutterCommon.h | 6 +++ 10 files changed, 149 insertions(+), 48 deletions(-) create mode 100644 src/cmake/CutterConfig.cmake create mode 100644 src/cmake/CutterInstallDirs.cmake diff --git a/.gitignore b/.gitignore index f3d07391..be75ee14 100644 --- a/.gitignore +++ b/.gitignore @@ -74,6 +74,10 @@ compile_commands.json # vscode **/.vscode +# Visual Studio CMake +src/out +.vs + # cutter-deps /cutter-deps diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 85cfb52f..5f4fe03d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -7,6 +7,7 @@ endif() list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") include(DisallowInSource) include(Utils) +include(CutterInstallDirs) set(CUTTER_PYTHON_MIN 3.5) @@ -44,7 +45,6 @@ project(Cutter VERSION "${CUTTER_VERSION_FULL}") set(CMAKE_CXX_STANDARD 11) -include_directories(core widgets common plugins menus) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) @@ -169,38 +169,56 @@ add_executable(Cutter MACOSX_BUNDLE ${UI_FILES} ${QRC_FILES} ${SOURCE_FILES} ${H set_target_properties(Cutter PROPERTIES ENABLE_EXPORTS ON MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/macos/Info.plist") +target_compile_definitions(Cutter PRIVATE CUTTER_SOURCE_BUILD) + +set(CUTTER_INCLUDE_DIRECTORIES core widgets common plugins menus .) +foreach(_dir ${CUTTER_INCLUDE_DIRECTORIES}) + target_include_directories(Cutter PUBLIC + $ + $ + ) +endforeach() if (TARGET Graphviz::GVC) - target_link_libraries(Cutter Graphviz::GVC) + target_link_libraries(Cutter PRIVATE Graphviz::GVC) target_compile_definitions(Cutter PRIVATE CUTTER_ENABLE_GRAPHVIZ) endif() if(CUTTER_ENABLE_CRASH_REPORTS) set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads REQUIRED) - target_link_libraries(Cutter Threads::Threads) - + target_link_libraries(Cutter PRIVATE Threads::Threads) + add_definitions(-DCUTTER_ENABLE_CRASH_REPORTS) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g ") if(DEFINED BREAKPAD_FRAMEWORK_DIR) include_directories("${BREAKPAD_FRAMEWORK_DIR}/Breakpad.framework/Headers") set_target_properties(Cutter PROPERTIES LINK_FLAGS "-Wl,-F${BREAKPAD_FRAMEWORK_DIR}") - target_link_libraries(Cutter "-framework Breakpad") + target_link_libraries(Cutter PRIVATE "-framework Breakpad") else() find_package(Breakpad REQUIRED) include_directories(${BREAKPAD_INCLUDE_DIRS}) - target_link_libraries(Cutter ${BREAKPAD_LINK_LIBRARIES}) + target_link_libraries(Cutter PRIVATE ${BREAKPAD_LINK_LIBRARIES}) endif() endif() -target_link_libraries(Cutter Qt5::Core Qt5::Widgets Qt5::Gui Qt5::Svg Qt5::Network) -target_link_libraries(Cutter ${RADARE2_TARGET}) +target_link_libraries(Cutter PUBLIC Qt5::Core Qt5::Widgets Qt5::Gui PRIVATE Qt5::Svg Qt5::Network) +target_link_libraries(Cutter PUBLIC ${RADARE2_TARGET}) if(CUTTER_ENABLE_PYTHON) - target_link_libraries(Cutter ${PYTHON_LIBRARIES}) + target_link_libraries(Cutter PRIVATE ${PYTHON_LIBRARIES}) if(CUTTER_ENABLE_PYTHON_BINDINGS) - target_link_libraries(Cutter Shiboken2::libshiboken PySide2::pyside2) + target_link_libraries(Cutter PRIVATE Shiboken2::libshiboken PySide2::pyside2) + + get_target_property(RAW_BINDINGS_INCLUDE_DIRS Cutter INCLUDE_DIRECTORIES) + set(BINDINGS_INCLUDE_DIRS "") + foreach(_dir ${RAW_BINDINGS_INCLUDE_DIRS}) + string(REGEX REPLACE "\\$" "\\1" _dir ${_dir}) + string(REGEX REPLACE "\\$" "" _dir ${_dir}) + if (NOT "${_dir}" STREQUAL "") + list(APPEND BINDINGS_INCLUDE_DIRS "${_dir}") + endif() + endforeach() - get_target_property(BINDINGS_INCLUDE_DIRS Cutter INCLUDE_DIRECTORIES) if(APPLE AND _qt5Core_install_prefix) list(APPEND BINDINGS_INCLUDE_DIRS "${_qt5Core_install_prefix}/include") list(APPEND BINDINGS_INCLUDE_DIRS "${_qt5Core_install_prefix}/include/QtCore") @@ -217,7 +235,36 @@ if(CUTTER_ENABLE_PYTHON) endif() if(TARGET KF5::SyntaxHighlighting) - target_link_libraries(Cutter KF5::SyntaxHighlighting) + target_link_libraries(Cutter PRIVATE KF5::SyntaxHighlighting) target_compile_definitions(Cutter PRIVATE CUTTER_ENABLE_KSYNTAXHIGHLIGHTING) endif() +# Install files +install(TARGETS Cutter + EXPORT CutterTargets + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" + BUNDLE DESTINATION "." # needs to be tested + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT Devel +) +install(EXPORT CutterTargets + NAMESPACE Cutter:: + DESTINATION "${ConfigPackageLocation}" + COMPONENT Devel) +install(FILES + cmake/CutterConfig.cmake + DESTINATION ${ConfigPackageLocation} + COMPONENT Devel +) +foreach(_file ${HEADER_FILES}) + # Can't use target PUBLIC_HEADER option for installing due to multiple directories + get_filename_component(_header_dir "${_file}" DIRECTORY) + install (FILES "${_file}" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/cutter/${_header_dir}" COMPONENT Devel) +endforeach() + +if(UNIX AND NOT APPLE) + install (FILES "img/cutter.svg" + DESTINATION "share/icons/hicolor/scalable/apps/") + install(FILES "org.radare.Cutter.desktop" + DESTINATION "share/applications" + COMPONENT Devel) +endif() diff --git a/src/Cutter.pro b/src/Cutter.pro index 3502a585..43bf92f3 100644 --- a/src/Cutter.pro +++ b/src/Cutter.pro @@ -533,7 +533,7 @@ HEADERS += \ widgets/ListDockWidget.h \ widgets/AddressableItemList.h \ dialogs/MultitypeFileSaveDialog.h \ - widgets/BoolToggleDelegate.cpp + widgets/BoolToggleDelegate.h GRAPHVIZ_HEADERS = widgets/GraphGridLayout.h diff --git a/src/cmake/BundledRadare2.cmake b/src/cmake/BundledRadare2.cmake index 1b521fdc..101f2520 100644 --- a/src/cmake/BundledRadare2.cmake +++ b/src/cmake/BundledRadare2.cmake @@ -2,8 +2,17 @@ include(ExternalProject) set(RADARE2_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../radare2") -set(RADARE2_INSTALL_DIR "${CMAKE_CURRENT_BINARY_DIR}/Radare2-prefix") -set(MESON_OPTIONS "--prefix=${RADARE2_INSTALL_DIR}" --libdir=lib) +if(WIN32) + set(RADARE2_INSTALL_DIR "${CMAKE_CURRENT_BINARY_DIR}") + if ("${CMAKE_GENERATOR}" MATCHES "Visual Studio") + set(RADARE2_INSTALL_DIR "${CMAKE_CURRENT_BINARY_DIR}/$") + endif() + set(RADARE2_INSTALL_BINPATH ".") + set(MESON_OPTIONS "--prefix=${RADARE2_INSTALL_DIR}" "--bindir=${RADARE2_INSTALL_BINPATH}" "-Dr2_incdir=include/libr") +else() + set(RADARE2_INSTALL_DIR "${CMAKE_CURRENT_BINARY_DIR}/Radare2-prefix") + set(MESON_OPTIONS "--prefix=${RADARE2_INSTALL_DIR}" --libdir=lib) +endif() find_program(MESON meson) if(NOT MESON) @@ -17,8 +26,7 @@ endif() ExternalProject_Add(Radare2-Bundled SOURCE_DIR "${RADARE2_SOURCE_DIR}" - INSTALL_DIR "${RADARE2_INSTALL_DIR}" - CONFIGURE_COMMAND "${MESON}" "${RADARE2_SOURCE_DIR}" ${MESON_OPTIONS} && "${MESON}" configure ${MESON_OPTIONS} + CONFIGURE_COMMAND "${MESON}" "" ${MESON_OPTIONS} && "${MESON}" configure ${MESON_OPTIONS} BUILD_COMMAND "${NINJA}" INSTALL_COMMAND "${NINJA}" install) @@ -27,12 +35,38 @@ set(Radare2_INCLUDE_DIRS "${RADARE2_INSTALL_DIR}/include/libr") add_library(Radare2 INTERFACE) add_dependencies(Radare2 Radare2-Bundled) if(NOT (${CMAKE_VERSION} VERSION_LESS "3.13.0")) - target_link_directories(Radare2 INTERFACE "${RADARE2_INSTALL_DIR}/lib") + target_link_directories(Radare2 INTERFACE + $ + $) else() link_directories("${RADARE2_INSTALL_DIR}/lib") endif() -target_link_libraries(Radare2 INTERFACE - r_core r_config r_cons r_io r_util r_flag r_asm r_debug + +set (R2_LIBS r_core r_config r_cons r_io r_util r_flag r_asm r_debug r_hash r_bin r_lang r_io r_anal r_parse r_bp r_egg r_reg r_search r_syscall r_socket r_fs r_magic r_crypto) -target_include_directories(Radare2 INTERFACE "${Radare2_INCLUDE_DIRS}") +set (R2_EXTRA_LIBS r_main) +set (R2_BIN r2agent rabin2 radare2 radiff2 rafind2 ragg2 rahash2 rarun2 rasm2 rax2) + +target_link_libraries(Radare2 INTERFACE + ${R2_LIBS}) +target_include_directories(Radare2 INTERFACE $ $) + +install(TARGETS Radare2 EXPORT CutterTargets) +if (APPLE) +elseif (WIN32) + foreach(_lib ${R2_LIBS} ${R2_EXTRA_LIBS}) + install(FILES "${RADARE2_INSTALL_DIR}/${R2_INSTALL_BINPATH}/${_lib}.dll" DESTINATION "${CMAKE_INSTALL_BINDIR}") + endforeach() + foreach(_exe ${R2_BIN}) + install(FILES "${RADARE2_INSTALL_DIR}/${R2_INSTALL_BINPATH}/${_exe}.exe" DESTINATION "${CMAKE_INSTALL_BINDIR}") + endforeach() + install(DIRECTORY "${RADARE2_INSTALL_DIR}/share" DESTINATION ".") + install(DIRECTORY "${RADARE2_INSTALL_DIR}/include" DESTINATION "." + COMPONENT Devel) + install(DIRECTORY "${RADARE2_INSTALL_DIR}/lib" DESTINATION "." + COMPONENT Devel + PATTERN "*.pdb" EXCLUDE) +else () + install(DIRECTORY "${RADARE2_INSTALL_DIR}/" DESTINATION ".") +endif() \ No newline at end of file diff --git a/src/cmake/CutterConfig.cmake b/src/cmake/CutterConfig.cmake new file mode 100644 index 00000000..926efecf --- /dev/null +++ b/src/cmake/CutterConfig.cmake @@ -0,0 +1 @@ +include("${CMAKE_CURRENT_LIST_DIR}/CutterTargets.cmake") \ No newline at end of file diff --git a/src/cmake/CutterInstallDirs.cmake b/src/cmake/CutterInstallDirs.cmake new file mode 100644 index 00000000..cf03f771 --- /dev/null +++ b/src/cmake/CutterInstallDirs.cmake @@ -0,0 +1,10 @@ +if(WIN32) + set(CMAKE_INSTALL_BINDIR "." CACHE PATH "Executable install directory") + set(CMAKE_INSTALL_INCLUDEDIR "include" CACHE PATH "Include install directory") + set(CMAKE_INSTALL_LIBDIR "lib" CACHE PATH "Library install directory") +elseif(APPLE) + include(GNUInstallDirs) #TODO: use appropriate paths for macOS +else() + include(GNUInstallDirs) +endif() +set(ConfigPackageLocation "${CMAKE_INSTALL_LIBDIR}/Cutter" CACHE PATH "Cmake file install location") \ No newline at end of file diff --git a/src/cmake/FindGraphviz.cmake b/src/cmake/FindGraphviz.cmake index 5043ed4c..365422a0 100644 --- a/src/cmake/FindGraphviz.cmake +++ b/src/cmake/FindGraphviz.cmake @@ -1,12 +1,14 @@ set (_module Graphviz) -find_package(PkgConfig REQUIRED) -if (NOT (CMAKE_VERSION VERSION_LESS "3.12.0")) - pkg_check_modules(GVC IMPORTED_TARGET GLOBAL libgvc) -elseif (NOT (CMAKE_VERSION VERSION_LESS "3.11.0")) - pkg_check_modules(GVC IMPORTED_TARGET libgvc) -else() - pkg_check_modules(GVC libgvc) +find_package(PkgConfig) +if (PkgConfig_FOUND) + if (NOT (CMAKE_VERSION VERSION_LESS "3.12.0")) + pkg_check_modules(GVC IMPORTED_TARGET GLOBAL libgvc) + elseif (NOT (CMAKE_VERSION VERSION_LESS "3.11.0")) + pkg_check_modules(GVC IMPORTED_TARGET libgvc) + else() + pkg_check_modules(GVC libgvc) + endif() endif() include(FindPackageHandleStandardArgs) diff --git a/src/cmake/FindRadare2.cmake b/src/cmake/FindRadare2.cmake index 65ce3be6..77c649e6 100644 --- a/src/cmake/FindRadare2.cmake +++ b/src/cmake/FindRadare2.cmake @@ -77,32 +77,28 @@ else() list(APPEND CMAKE_PREFIX_PATH "$ENV{HOME}/bin/prefix/radare2") find_package(PkgConfig REQUIRED) - pkg_search_module(Radare2 IMPORTED_TARGET REQUIRED r_core) + if(CMAKE_VERSION VERSION_LESS "3.6") + pkg_search_module(Radare2 REQUIRED r_core) + else() + pkg_search_module(Radare2 IMPORTED_TARGET REQUIRED r_core) + endif() # reset CMAKE_PREFIX_PATH set(CMAKE_PREFIX_PATH ${Radare2_CMAKE_PREFIX_PATH_TEMP}) - mark_as_advanced(Radare2_CMAKE_PREFIX_PATH_TEMP) - if(TARGET PkgConfig::Radare2) - if (CMAKE_VERSION VERSION_LESS "3.11.0") - add_library(Radare2::libr INTERFACE IMPORTED) - set_target_properties(Radare2::libr PROPERTIES - INTERFACE_INCLUDE_DIRECTORIES "${Radare2_INCLUDE_DIRS}") - set_target_properties(Radare2::libr PROPERTIES - INTERFACE_LINK_LIBRARIES "${Radare2_LIBRARIES}") - link_directories("${Radare2_LIBDIR}") # target specific link directory or flags require even newer cmake - else() - set_target_properties(PkgConfig::Radare2 PROPERTIES IMPORTED_GLOBAL ON) - add_library(Radare2::libr ALIAS PkgConfig::Radare2) - endif() + if((TARGET PkgConfig::Radare2) AND (NOT CMAKE_VERSION VERSION_LESS "3.11.0")) + set_target_properties(PkgConfig::Radare2 PROPERTIES IMPORTED_GLOBAL ON) + add_library(Radare2::libr ALIAS PkgConfig::Radare2) + set(Radare2_TARGET Radare2::libr) + elseif(Radare2_FOUND) + add_library(Radare2::libr INTERFACE IMPORTED) + set_target_properties(Radare2::libr PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${Radare2_INCLUDE_DIRS}") + set_target_properties(Radare2::libr PROPERTIES + INTERFACE_LINK_LIBRARIES "${Radare2_LIBRARIES}") set(Radare2_TARGET Radare2::libr) - else() - set(Radare2_TARGET Radare2_TARGET-NOTFOUND) endif() - endif() include(FindPackageHandleStandardArgs) find_package_handle_standard_args(Radare2 REQUIRED_VARS Radare2_TARGET Radare2_LIBRARIES Radare2_INCLUDE_DIRS) - -mark_as_advanced(Radare2_LIBRARIES_VARS Radare2_CORE_LIBRARY Radare2_TARGET) diff --git a/src/common/ColorThemeWorker.cpp b/src/common/ColorThemeWorker.cpp index 7e3cb086..6c782821 100644 --- a/src/common/ColorThemeWorker.cpp +++ b/src/common/ColorThemeWorker.cpp @@ -76,8 +76,9 @@ ColorThemeWorker::ColorThemeWorker(QObject *parent) : QObject (parent) } else { QMessageBox::critical(nullptr, tr("Standard themes not found"), - tr("The radare2 standard themes could not be found. " + tr("The radare2 standard themes could not be found in '%1'. " "Most likely, radare2 is not properly installed.") + .arg(currDir.path()) ); } } diff --git a/src/core/CutterCommon.h b/src/core/CutterCommon.h index 494c4a2c..e59fc251 100644 --- a/src/core/CutterCommon.h +++ b/src/core/CutterCommon.h @@ -55,5 +55,11 @@ inline QString RHexString(RVA size) return QString::asprintf("%#llx", size); } +#ifdef CUTTER_SOURCE_BUILD +#define CUTTER_EXPORT Q_DECL_EXPORT +#else +#define CUTTER_EXPORT Q_DECL_IMPORT +#endif + #endif // CUTTERCORE_H