我有多个CMake项目,每个项目都创建一个debian包.我一直在尝试创建一个顶级项目,在每个'子'项目上调用add_subdirectory().所有子项目都会构建,但"make project"会创建一个包含最后一个子项目规范的项目,并包含来自所有其他项目的文件.
基本上,每个集合(CPACK _...)都被下一个项目覆盖,直到最后一个项目和'install()'调用被累积.如何在使用顶级项目时分离包创建?
编辑:添加了代码段.所有"孩子"项目都是相似的.
# build a CPack driven installer package
if(CMAKE_BUILD_TYPE STREQUAL "release")
set(CPACK_STRIP_FILES TRUE)
endif()
set(CPACK_GENERATOR DEB)
set(CPACK_PACKAGE_NAME ${PROJECT_NAME})
set(CPACK_PACKAGE_VENDOR Acme)
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "acme <support@acme.com>")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Acme daemon")
message(STATUS "CPACK_PACKAGE_DESCRIPTION_SUMMARY: " ${CPACK_PACKAGE_DESCRIPTION_SUMMARY})
if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
set(SYSTEM_PROCESSOR amd64)
elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "arm")
set(SYSTEM_PROCESSOR armhf)
else()
message(FATAL_ERROR "CMAKE_SYSTEM_PROCESSOR: " ${CMAKE_SYSTEM_PROCESSOR})
endif()
set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE ${SYSTEM_PROCESSOR})
message(STATUS "CPACK_DEBIAN_PACKAGE_ARCHITECTURE: " ${CPACK_DEBIAN_PACKAGE_ARCHITECTURE})
include(InstallRequiredSystemLibraries)
set(CPACK_PACKAGE_VERSION_MAJOR ${${PROJECT_NAME}_VERSION_MAJOR})
set(CPACK_PACKAGE_VERSION_MINOR ${${PROJECT_NAME}_VERSION_MINOR})
set(CPACK_PACKAGE_VERSION_PATCH ${${PROJECT_NAME}_VERSION_PATCH})
set(CPACK_PACKAGE_VERSION ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH})
set(CPACK_PACKAGE_FILE_NAME ${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}-${SYSTEM_PROCESSOR})
message(STATUS "CPACK_PACKAGE_FILE_NAME: " ${CPACK_PACKAGE_FILE_NAME})
set(CPACK_DEBIAN_PACKAGE_PRIORITY optional)
include(CPack)
Run Code Online (Sandbox Code Playgroud) 与此处描述的问题相同,我想将Shell脚本作为TARGET“ package”的POST_BUILD命令执行。目标平台是Debian / Ubuntu。
我将以下内容添加到CMakeLists的末尾:
add_custom_command(
TARGET package
POST_BUILD
COMMAND bash ${PROJECT_BINARY_DIR}/fixup_deb.sh
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
COMMENT "Fix file-permissions of md5sum files in debian package"
)
Run Code Online (Sandbox Code Playgroud)
但这是行不通的。当我调用“ make package”时,脚本不会更改。
目前,我有一个针对自定义目标的解决方法:
add_custom_target(
correctDeb
COMMAND bash ${PROJECT_BINARY_DIR}/fixup_deb.sh
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
)
Run Code Online (Sandbox Code Playgroud)
但是,如果在调用“ make package”时自动完成此操作,则对我来说将更加舒适和更加故障安全。
顺便说一下,$ {PROJECT_BINARY_DIR} /fixup_deb.sh的生成也可以很好地与以下对象配合使用:
configure_file( "${CMAKE_CURRENT_LIST_DIR}/debian/fixup_deb.sh.in" "${PROJECT_BINARY_DIR}/fixup_deb.sh" @ONLY IMMEDIATE )
Run Code Online (Sandbox Code Playgroud) 我见过许多 Linux 应用程序将其二进制文件打包在某些路径中,/opt/mypkg/myexecutable例如/usr/bin. 我在打包文件中看到了这些符号链接。
我想在使用 cpack 打包我的软件、使用 CPackDEB 和 CPackRPM 创建 deb 和 rpm 包时执行相同的操作。
是否可以创建指向任意(可能不存在)路径的符号链接?
那我可以使用吗INSTALL(FILES "mysymlink" DESTINATION /usr/bin/myapp COMPONENT MyComponent)?(当目的地实际存在时,遵循符号链接是否会出现问题?)
我可以用类似的东西更改链接目的地吗CONFIGURE_FILE()
或者我只是缺少一个可以正确完成工作的 cpack 指令?
我正在尝试调试我在以下过程中遇到的问题make package:
CMake Error at /usr/local/Cellar/cmake/3.4.3/share/cmake/Modules/BundleUtilities.cmake:861 (message):
error: fixup_bundle: not a valid bundle
Run Code Online (Sandbox Code Playgroud)
我看到message(STATUS ....)里面有一些,但没有打印出来。
例如,在fixup_bundle该文件 ( /usr/local/Cellar/cmake/3.4.3/share/cmake/Modules/BundleUtilities.cmake) 中包含的函数的开头有以下几行:
message(STATUS "fixup_bundle")
message(STATUS " app='${app}'")
message(STATUS " libs='${libs}'")
message(STATUS " dirs='${dirs}'")
Run Code Online (Sandbox Code Playgroud)
但是当我运行 cmake 时,即使使用make package VERBOSE=1.
但如果我删除那些STATUS被打印的内容,那么我想知道如何“激活”这些STATUS消息
我有一个 cmake 项目,它使用 cpack 生成 zip 文件和 debian 软件包,我希望能够为这两个版本的软件包安装不同的文件。
更具体地说,这是一个生成 zip 和 debian 包的示例 CMake 文件:
cmake_minimum_required(VERSION 3.5)
project(test_packaging)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(SOURCE_FILES main.cpp)
add_executable(test_packaging ${SOURCE_FILES})
install(FILES test.txt DESTINATION auxilliary/)
set(CPACK_GENERATOR "ZIP;DEB")
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Ford Prefect")
include(CPack)
Run Code Online (Sandbox Code Playgroud)
我想做的是test.txt在两个不同的包中安装该文件的两个不同版本?就像是
if(packaging zip)
install(FILES test_zip.txt DESTINATION auxilliary/)
elseif(packaging deb)
install(FILES test_deb.txt DESTINATION auxilliary/)
endif(expression)
Run Code Online (Sandbox Code Playgroud) 我正在使用CPack WIX生成器来创建安装程序.安装程序需要在目标系统上的%ALLUSERSPROFILE%\ foo \文件夹中安装文件.
我找不到在安装树之外安装文件的方法(C:\ Program Files\foo ...)
如何实现这一目标?
我正在使用我的目标二进制文件和随之而来的头文件创建一个 zip 文件。我正在尝试找到一种方法来使其正常工作,而无需在 zip 中创建自命名的文件夹,并且让 zip 在其根目录中仅包含目标二进制文件和头文件。
这是 dropbox 上一个小 zip (5k) 中的整个项目:链接
以下是我的构建和打包方式:
cd Build
cmake ..
make
make package
Run Code Online (Sandbox Code Playgroud)
> cmake --版本
cmake版本3.10.2
CMake 套件由 Kitware (kitware.com/cmake) 维护和支持。
> cpack --版本
cpack版本3.10.2
CMake 套件由 Kitware (kitware.com/cmake) 维护和支持。
> gcc --版本
gcc (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0 版权所有 (C) 2017 Free Software Foundation, Inc. 这是免费软件;请参阅复制条件的来源。> 无保修;甚至不是为了适销性或特定用途的适用性。
cmake_minimum_required(VERSION 3.2)
###################################################################### PROJECT
project(sis_cg_lib)
###################################################################### FILES
file(GLOB_RECURSE SIS_CG_LIB_INC "deps/*.h" "deps/*.inl" )
file(GLOB_RECURSE SIS_CG_LIB_SRC "sources/*.cpp" )
###################################################################### TARGET
add_library(SIS_CG_Lib ${SIS_CG_LIB_INC} ${SIS_CG_LIB_SRC})
###################################################################### …Run Code Online (Sandbox Code Playgroud) 我创建了一个用 C++17 编写的应用程序,并在使用最新编译器和 Catalina 版本的 MacOS 的 Mac 上编译。我正在使用 CMake 和 CPack 创建一个包并将其打包到.dmg. 当我使用 Catalina 在另一台计算机上获取生成的文件时,一切正常。但是当尝试在装有 MacOS 10.12 的机器上运行时,会出现错误:
dyld: Symbol not found: __ZNSt19bad_optional_accessD1Ev
Expected in: /usr/lib/libc++.1.dylib
Run Code Online (Sandbox Code Playgroud)
在对符号进行解构时,它实际上是bad_optional_access异常的析构函数:std::bad_optional_access::~bad_optional_access()
的std::optional是在C ++ 17导入。因此,装有 MacOS 10.12 的计算机在其 libc++ 中没有该符号。我试图找出如何将libc++.1.dylibfor C++17打包到包中,以便它不会使用系统一。
要创建我的包,我有:
# Installation
set(prefix "${PROJECT_NAME}.app/Contents")
set(INSTALL_RUNTIME_DIR "${prefix}/MacOS")
set(INSTALL_CMAKE_DIR "${prefix}/Resources")
set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR})
# based on code from CMake's QtDialog/CMakeLists.txt
macro(install_qt5_plugin _qt_plugin_name _qt_plugins_var _prefix)
get_target_property(_qt_plugin_path "${_qt_plugin_name}" LOCATION)
if(EXISTS "${_qt_plugin_path}")
get_filename_component(_qt_plugin_file "${_qt_plugin_path}" NAME)
get_filename_component(_qt_plugin_type "${_qt_plugin_path}" PATH)
get_filename_component(_qt_plugin_type …Run Code Online (Sandbox Code Playgroud) 我最近开始学习介子,我正在我的一个项目中测试切换到它(从CMake)。问题是我通常使用cpack来构建项目的包/安装程序,在搜索介子文档以查找类似于cpack 的内容后,我找不到任何东西。
要求/我目前使用cpack做什么
有关于构建发布档案,然后使用脚本使用打包工具(例如inno)处理它们的信息。然而,这并不是我真正想要的,因为它比cpack更笨拙和不灵活(即,如果目录结构发生变化,我必须更改 3 个不同的脚本)。
最终我可以学习使用介子系统并手动编写打包脚本,毫无疑问这会让我成为一个更好的脚本编写者,但是,我很想知道是否有更好的方法来做到这一点,这在文档中没有公布,或者有一些非官方项目可以使该过程自动化。
编辑
包我的意思是像一个 deb 包 - 一个系统包管理器的包,而不是像柯南这样的包
我有一个托管 C++/CLR 库,它是使用 CMake 3.17 构建的,并使用 CPack 打包到 NuGet 包中。生成的 nupkg 文件无法导入到 C# 项目中,因为包管理器会发出以下错误:“[snip] 包不包含与 [.NETFramework,Version=v4.5.2] 兼容的任何程序集引用或内容文件”。但是,添加对添加到解决方案时的项目或构建生成的相应库文件的引用可以按预期工作。
代码本身非常基本,当通过 Visual Studio 2017 手动添加引用时,它会生成一个可以从另一个项目引用的有效库 -> 添加引用(项目或相应的库都可以通过这种方式添加,并且它可以在所有情况下工作)相同的)。
代码由类本身组成,AssemblyInfo.cpp 提供仅描述元数据和版本信息的属性。依赖项仅包括 System、System::Runtime::InteropServices 和大量预构建的本机库。
我没有添加 .nuspec 文件,也没有添加 nuget.config 文件,我相信后者是在构建包时由 CPack NuGet 生成器生成的。
CPack NuGet 支持相对较新,我未能成功找到工作示例,但我成功生成了 nupkg 文件。首先,指示 CMake 使用包含的源文件构建托管 C++ 库,并在相应的目标上设置以下属性ManagedLibrary:
set_target_properties (ManagedLibrary PROPERTIES DOTNET_TARGET_FRAMEWORK_VERSION "v4.5.2")
set_target_properties (ManagedLibrary PROPERTIES COMMON_LANGUAGE_RUNTIME "")
Run Code Online (Sandbox Code Playgroud)
文档指出,这将生成 CLR/混合代码并按照宣传的那样工作,因此我能够成功地针对目标框架进行构建。下一步是将库安装在我认为正确的位置:
install (TARGET ManagedLibrary DESTINATION . COMPONENT MixedCLR)
Run Code Online (Sandbox Code Playgroud)
支持(本机 C++)库的安装方式类似:
install (FILES [various..] DESTINATION …Run Code Online (Sandbox Code Playgroud)