我使用CMake和CPack配置和打包我的库.我已经编写了自己的find-module FindMyLib.cmake.
如何告诉CMake/CPack将此文件添加到CMake模块目录中,以便将来的开发人员可以简单地指定FIND_PACKAGE(MyLib)来使用我的库?
我想为我正在构建的基于C++的系统创建一个跨平台的安装程序.
我使用CMake构建所有内容,如果我可以使用CPack来制作安装程序,那将会很棒.我已经有CPack在OSX上工作,但我不能让它在Windows上工作.为了简化操作,我尝试在http://www.cmake.org/Wiki/CMake:Packaging_With_CPack上获取示例以使用NSIS安装程序软件.配置完成后,我无法在任何地方找到NSIS安装程序(使用VS 2010 Win64生成器).
也许我很困惑,但我认为只需要源代码,CMake,CPack和NSIS就可以创建安装包而无需Visual Studio.这可能吗?
完整教程的链接(http://www.cmake.org/Wiki/CMake:Component_Install_With_CPack跳过相关信息以获得NSIS工作而不提及生成器或编译器)将非常有用,或者我如何能够获得这个神秘的NSIS安装程序的基本解释会很棒.
以下示例为CMakeLists.txt:
cmake_minimum_required(VERSION 2.6.0 FATAL_ERROR)
project(StPMS)
add_library(mylib mylib.cpp)
add_executable(mylibapp mylibapp.cpp)
target_link_libraries(mylibapp mylib)
install(TARGETS mylib
ARCHIVE
DESTINATION lib
COMPONENT libraries)
install(TARGETS mylibapp
RUNTIME
DESTINATION bin
COMPONENT applications)
install(FILES mylib.h
DESTINATION include
COMPONENT headers)
set(CPACK_GENERATOR NSIS)
set(CPACK_PACKAGE_NAME "MyLib")
set(CPACK_PACKAGE_VENDOR "CMake.org")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "MyLib - CPack Component Installation Example")
set(CPACK_PACKAGE_VERSION "1.0.0")
set(CPACK_PACKAGE_VERSION_MAJOR "1")
set(CPACK_PACKAGE_VERSION_MINOR "0")
set(CPACK_PACKAGE_VERSION_PATCH "0")
set(CPACK_PACKAGE_INSTALL_DIRECTORY "CPack Component Example")
SET(CPACK_NSIS_MODIFY_PATH ON)
INCLUDE(CPack)
Run Code Online (Sandbox Code Playgroud) tl; dr版本: 是否可以使用CMake(> = 2.8)从某些文件生成zip文件并将打包的zip文件放在特定位置?
更长版本: 我有一个CMakeLists.txt,可以将我的项目构建为.exe文件.此exe文件将从zip文件中读取数据.现在,要在zip文件中打包的内容在我的git存储库中,以便它也可以编辑.但程序需要这个数据在一个zip文件中.因此,如果cmake脚本可以获取数据,将其放在zip文件中并将其放在exe旁边,那将是很好的.我已经听说过CPack,但我没有找到简单的例子,也不确定这是否适合我的任务.
这可能吗?如果是的话:怎么样?
我已经被CMake-CPack感到沮丧了将近一周.
不好的是CMake-CPack在线文档没有很好地记录这部分内容.
谷歌搜索后,我发现这个变量使用:
CPACK_PACKAGING_PREFIX # NOT documented
CMAKE_INSTALL_PREFIX # Documented, but the behavior seems weird
CPACK_INSTALL_PREFIX # NOT documented
CPACK_PACKAGE_INSTALL_DIRECTORY # Documented, but this variable does NOT work as the online document described
CPACK_PACKAGING_INSTALL_PREFIX # NOT documented
Run Code Online (Sandbox Code Playgroud)
我想要做的是:打包Debian软件包fakeroot make package,当安装软件包时,使用子目录sudo dpkg -i MyProgramPackageName安装它.也就是说,应该安装所有文件./usr/localMyProgramPackageName/usr/local/MyProgramPackageName-V.1.2.3
我一直在尝试(CMake 2.8.3和CMake 2.8.5)来调整这些变量.我尝试了很多组合,但都失败了.
唯一成功的方法是:
Set(CPACK_PACKAGING_INSTALL_PREFIX /usr/local/MyProgramPackageName-V.1.2.3)
Run Code Online (Sandbox Code Playgroud)
但是这个变量甚至没有记录,并且无法保证行为.如果您对我的问题感到困惑,请告诉我何时使用CPACK_PACKAGE_INSTALL_DIRECTORY?因为关于这个变量的文档描述真的很有吸引力,而且它确实是我想要的,但我无法让它工作.
请建议我.
彼得
到目前为止,我的项目只有.cpp 文件被编译成不同的二进制文件,我设法配置CPack来构建一个正确的debian包,没有任何问题.
最近我写了几个python应用程序并将它们添加到项目中,以及一些我想要合并到包中的自定义模块.
编写setup.py脚本之后,我想知道如何将这些文件添加到CPack配置中,setup.py以便在用户在系统上安装软件包时自动执行dpkg -i package.deb.
我很难找到有关如何配置CPack以安装自定义python应用程序/模块的相关信息.有没人试过这个?
我正在尝试将我们的构建系统转换为cmake并且使用它生成的RPM(通过cpack)遇到了一个有趣的问题:它会自动将它认为你的RPM所具有的所有依赖项添加到其所需的列表中库.
总的来说,这很好,但就我而言,这是灾难性的.不幸的是,我们构建的开发包最终安装了一个我们自己开发的工具,它使用rpm将它们安装在一个独立的RPM数据库中.这是愚蠢的,但我无法改变它.这意味着任何普通库将依赖的所有系统库(如libc或libpthread)都不在我们的开发包中使用的RPM数据库中.因此,如果我们的某个开发包的RPM列出了所需的系统库,那么我们就无法安装它,因为rpm会认为它们没有安装(因为它们列在普通数据库而不是正常数据库中)它被告知在安装我们的包时使用).我们当前构建的东西处理得很好,因为它没有列出任何系统库作为RPM中的依赖项,但是cpack会自动填充RPM的所需库列表并将系统库放在那里.我需要一种方法来阻止它这样做.
我尝试设置CPACK_RPM_PACKAGE_REQUIRES到"",但没有效果.RPM cpack生成仍然最终会列出所需的系统库.在这一点上,我所能想到的就是复制RPM cpack生成器并将其破解以实现我想要的并使用它而不是标准的生成器,但我宁愿避免这种情况.有没有人知道如何让cpack停止使用所需的库填充RPM?
EDIT ===================
Run Code Online (Sandbox Code Playgroud)
apr-1是apache可移植运行时,我自己下载并编译以创建共享库(因此它不是由cmake创建的).在目标系统上运行CPack后,我需要链接到这个库.
我的开发项目目录:
read_config/bin
/libs
/include
/src
/build
Run Code Online (Sandbox Code Playgroud)
对于我的CMakeLists.txt,一切安装正常,但现在我有一个链接问题,因为它找不到库的新位置.
我已经删除了,LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/libs)因为我现在不需要这个,因为我正在使用FIND_LIBRARY.
并添加了以下内容:
# Find the library in the libs folder
FIND_LIBRARY(APR_LIBS NAMES "apr-1" PATHS ${PROJECT_SOURCE_DIR}/libs)
# Print out the path to see if its correct
MESSAGE(${APR_LIBS})
# Link the library with the executable
TARGET_LINK_LIBRARIES(cfg ${APR_LIBS})
# Install the libs folder
INSTALL(DIRECTORY ${PROJECT_SOURCE_DIR}/libs/
DESTINATION libs)
# Install the executable in the bin folder
INSTALL(TARGETS cfg
RUNTIME DESTINATION bin)
Run Code Online (Sandbox Code Playgroud)
一切都安装正常,但是当我检查可执行文件以查看它链接的库时,它找不到apr-1它在错误的地方看起来.
libapr-1.so.0 => not found
Run Code Online (Sandbox Code Playgroud)
这是因为我已将安装包解压缩到一个新位置,该位置与编译它的位置不同.从编译目录我得到这个,运行正常:
libapr-1.so.0 …Run Code Online (Sandbox Code Playgroud) 我在Mac OS X 10.7.5上使用CMake 2.8.10.2.
我已经配置CMake用Xcode构建一个简单的应用程序,创建一个空窗口.然后我尝试配置CMake以构建程序的DMG安装,使用以下命令指定背景图像:
设置(CPACK_DMG_BACKGROUND_IMAGE/path/to/image)
和自定义.DS_Store使用以下方法设置窗口大小和图标位置:
设置(CPACK_DMG_DS_STORE/path/to/DS_Store文件)
Xcode将成功构建应用程序并创建磁盘映像.当我安装图像时,它会显示正确的大小和图标位置,但背景始终设置为白色而不是指定的背景图像.
需要什么才能让背景在磁盘映像中正确显示?
根据FAQ,CMake不会创建make dist目标,可以使用CPack创建源包.但是CPack只是使用与模式不匹配的所有文件制作源目录的tarball CPACK_SOURCE_IGNORE_FILES.
另一方面,make dist由autotools生成的文件只包含它所知道的文件,主要是编译所需的文件.
任何人都有一种聪明的方法来制作一个只包含在CMakeLists.txt(及其依赖项)中指定的文件的源包?
CentOS6.9/cmake 3.6.1
在我的项目中,我正在尝试创建几个组件,而不是为它们构建运行时,开发和调试包,但是我无法为每个组件生成超过一个rpm.我创建了一个小项目来显示问题:
./include/Box.hpp
namespace room {
class Box {
public:
Box(int volume);
int get_volume() const;
private:
int m_volume;
};
}
Run Code Online (Sandbox Code Playgroud)
./source/Box.cpp
#include "Box.hpp"
namespace room {
Box::Box(int volume)
: m_volume(volume)
{
}
int Box::get_volume() const
{
return this->m_volume;
}
}
Run Code Online (Sandbox Code Playgroud)
./source/app.cpp
#include "Box.hpp"
int main() {
room::Box box(5);
return box.get_volume();
}
Run Code Online (Sandbox Code Playgroud)
./CMakeLists.txt
cmake_minimum_required(VERSION 3.6)
project (home)
set(CMAKE_INSTALL_PREFIX "/usr/local")
set(CMAKE_BUILD_TYPE "RelWithDebInfo")
include_directories("include")
file(GLOB SRC_FILES "source/*.cpp")
file(GLOB HDR_FILES "include/*.hpp")
add_executable(${PROJECT_NAME} ${SRC_FILES})
install(FILES ${HDR_FILES} DESTINATION "include" COMPONENT devel)
install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION …Run Code Online (Sandbox Code Playgroud)