【发布时间】:2017-05-26 21:06:42
【问题描述】:
我正在尝试构建一个包含单个 bash 脚本的 debian 包。该脚本由以下人员生成:
go.sh:
#!/bin/bash
cat >main <<EOF
#!/bin/bash
echo $@
EOF
chmod +x main
还有我的CMakeLists.txt:
cmake_minimum_required(VERSION 3.5)
add_custom_command(OUTPUT main ${CMAKE_CURRENT_SOURCE_DIR}/go.sh ${PROJECT_NAME})
add_custom_target(main ALL)
install(
TARGETS main
DESTINATION /usr/local/lib/
)
set(CPACK_GENERATOR "DEB")
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Me")
include(CPack)
这只是给我一个神秘的错误消息:
CMake Error at CMakeLists.txt:7 (install):
install TARGETS given target "main" which is not an executable, library, or
module.
有谁知道这个错误信息是什么意思,我应该怎么做?
编辑 - 我很迷茫。
我已将go.sh 生成的脚本重命名为program,这样它就不会与应该生成文件的目标名称冲突:
#!/bin/bash
MAIN=program
cat >$MAIN <<EOF
#!/bin/bash
echo $@
EOF
chmod 'x $MAIN
我还更改了我的CMakeLists.txt 文件:
cmake_minimum_required(VERSION 3.5)
add_custom_target(
main
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/program
)
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/program
COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/go.sh ${PROJECT_NAME}
)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/program DESTINATION /usr/local/lib/)
set(CPACK_GENERATOR "DEB")
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Me")
include(CPack)
但是,我的构建仍然无法正常工作。在这种情况下,我的 main 目标没有建立。如果我跑:
rm -rf ./* && cmake .. && make package
我收到一个关于 file INSTALL cannot find program 的错误
我认为我从根本上误解了文件和目标之间的区别。我无法想象,使用cmake,可以为每个生成的文件命名,然后为每个生成的文件指定一个不同的目标名称来回避命名冲突。这对我来说没有任何意义。
【问题讨论】:
-
目标名称和输出文件名相同对于某些生成器不起作用:对于每个目标,CMake 在构建树中创建具有相同名称的目录,因此它会与生成的文件冲突。
-
我不明白。如果不是作为目标结果的文件的名称,那么目标名称是什么?
-
在 CMake 中,目标名称只是出于某种目的的抽象标识符。它与它生成的文件不同。此外,单个目标可能会生成多个文件……或者一个都不会。顺便说一句,您的
add_custom_command不起作用:您忘记为自定义目标添加 DEPENDS 选项 as here。 -
根据 CMake 文档,DEPENDS 用于“指定命令所依赖的文件”。就我而言,该命令不依赖于任何文件,所以我不确定我会在该子句中添加什么。
-
您需要 add_custom_target 的 DEPENDS 对应于
add_custom_command的 OUTPUT。