首页 > 解决方案 > 如何完整且完整地配置 WxWidgets 的 CMake 安装/构建目录?

问题描述

我正在尝试将 WxWidgets (3.1.5) 集成到 macOS (10.15 [Catalina]) 上现有 CMake 项目的构建链 (CMake 3.21.2) 中,以使 WxWidgets 完全从属于主项目的 CMake 设置/变量(并且什么都没有项目的目录[我正在做源代码构建])。我正在努力控制 WxWidgets 的 CMake 脚本中的所有内容,但由于某种原因它仍然希望继续将库放入usr/local/lib并在usr/local/bin. 我不确定 WxWidgets CMake 构建脚本中缺少什么变量,因为所有内容都应该路由到我覆盖的位置。

这是我更改的相关文件和行。

CMakeLists.txt (WxWidgets Root, Lines 43 ~ 46 Original Lines )

set(wxSOURCE_DIR "path/to/my/project/libs/wxWidgets_src")
set(wxBINARY_DIR "path/to/my/project/build/libs/wxWidgets")
set(wxOUTPUT_DIR "${wxBINARY_DIR}/wxWidgets")

我也注释掉了该CMAKE_CONFIGURATION_TYPES块,但这不会影响任何事情。

install.cmake (build/cmake/install.cmake, Lines 16 - 78 Original Lines )

wx_install(
        DIRECTORY "${wxSOURCE_DIR}/include/wx"
        DESTINATION "path/to/my/project/install/wxWidgets/include")
    if(MSVC)
        wx_install(
            DIRECTORY "${wxSOURCE_DIR}/include/msvc"
            DESTINATION "path/to/my/project/install/wxWidgets/include")
    endif()
else()
    wx_get_flavour(lib_flavour "-")
    wx_install(
        DIRECTORY "${wxSOURCE_DIR}/include/wx"
        DESTINATION "path/to/my/project/install/wxWidgets/include/wx-${wxMAJOR_VERSION}.${wxMINOR_VERSION}${lib_flavour}")
endif()

# setup header and wx-config
if(WIN32_MSVC_NAMING)
    wx_install(
        DIRECTORY "${wxSETUP_HEADER_PATH}"
        DESTINATION "path/to/my/project/install/wxWidgets/lib${wxPLATFORM_LIB_DIR}")
else()
    wx_install(
        DIRECTORY "${wxSETUP_HEADER_PATH}"
        DESTINATION "path/to/my/project/install/wxWidgets/lib/wx/include")

    wx_install(
        FILES "${wxOUTPUT_DIR}/wx/config/${wxBUILD_FILE_ID}"
        DESTINATION "path/to/my/project/install/wxWidgets/lib/wx/config"
        PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ
                    GROUP_EXECUTE GROUP_READ
                    WORLD_EXECUTE WORLD_READ
        )

    install(DIRECTORY DESTINATION "path/to/my/project/install/wxWidgets/bin")
    # Disable symlinks
    # install(CODE "execute_process( \
    #     COMMAND ${CMAKE_COMMAND} -E create_symlink \
    #     ${CMAKE_INSTALL_PREFIX}/lib/wx/config/${wxBUILD_FILE_ID} \
    #     ${CMAKE_INSTALL_PREFIX}/bin/wx-config \
    #     )"
    # )
endif()

# uninstall target
if(MSVC_IDE)
    set(UNINST_NAME UNINSTALL)
else()
    set(UNINST_NAME uninstall)
endif()

if(NOT TARGET ${UNINST_NAME})
    # these symlinks are not included in the install manifest
    set(WX_EXTRA_UNINSTALL_FILES)
    if(NOT WIN32_MSVC_NAMING)
        if(IPHONE)
            set(EXE_SUFFIX ".app")
        else()
            set(EXE_SUFFIX ${CMAKE_EXECUTABLE_SUFFIX})
        endif()

        set(WX_EXTRA_UNINSTALL_FILES
            "path/to/my/project/install/wxWidgets/bin/wx-config"
            "path/to/my/project/install/wxWidgets/bin/wxrc${EXE_SUFFIX}"
            )

对于不影响 MacOS 构建的部分,某些编辑似乎过于热情,但我只是想确定一下。

我能找到的一些可疑目录工作正在进行的唯一其他迹象是在 config.cmake (第 140 ~ 150 行)中使用,wxBUILD_TOOLKIt但是这个(在 toolkit.cmake 内部设置)似乎没有做任何相关的事情安装文件(它只是将其设置为osx-cocoa, Lines 29 ~ 44)并且似乎与构建过程的库链接有关,与安装无关。

我不确定/usr/local在安装过程中还有什么可能触及目录。这里的理想目标是 WxWidgets 不是我的项目单独构建的依赖项(即不要只是添加一些.dll/.dylib文件和.h文件然后离开),而是从源代码构建的完整子库(作为静态库或共享库)并在主项目自己的 CMake 构建链旁边完成(即我的项目的构建文件夹将驻留或安装目标将指向的位置)。我不想在项目目录之外泄漏任何东西(安装命令有点危险,因为它们可以将东西放在系统目录的深处)并且在任何 3rd 方库上运行 make 命令都是非常危险的,因为你从来没有真正知道东西的去向(即更改/创建了哪些目录、需要的权限、全局公开的库等)。

附言

以防万一,这就是我链接它的方式(是的,我知道它不合Modern CMake规......它只是为了让它在此刻集成/工作):

来源/署名学分:doxygen/overviews/cmake.md,第 114 ~ 126 行

# WxWidgets
add_subdirectory("path/to/my/project/libs/wxWidgets_src")
target_link_libraries(MyExe PUBLIC wx::net wx::core wx::base)

标签: macoscmakebuildgnu-makewxwidgets

解决方案


推荐阅读