CMake安装目标给定的目标不是可执行文件、库或模块
我正在尝试构建一个包含单个bash脚本的debian包。脚本由以下程序生成:CMake安装目标给定的目标不是可执行文件、库或模块,cmake,deb,cpack,Cmake,Deb,Cpack,我正在尝试构建一个包含单个bash脚本的debian包。脚本由以下程序生成: go.sh: #!/bin/bash cat >main <<EOF #!/bin/bash echo $@ EOF chmod +x main 这只会给我一条神秘的错误信息: CMake Error at CMakeLists.txt:7 (install): install TARGETS given target "main" which is not an executable, l
go.sh
:
#!/bin/bash
cat >main <<EOF
#!/bin/bash
echo $@
EOF
chmod +x main
这只会给我一条神秘的错误信息:
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
但是,我的构建仍然不起作用。在这种情况下,不会生成我的main
目标。如果我跑步:
rm-rf./*&&cmake.&&制作包装
我收到一个关于文件安装找不到程序的错误
我认为我从根本上误解了文件和目标之间的区别。我无法想象,使用cmake
,人们会为每个生成的文件命名,然后为每个生成的文件指定一个不同的目标名称,以避免命名冲突。这对我来说毫无意义。命令流安装(目标)
仅适用于使用添加可执行文件()
或添加库()创建的目标
对于使用自定义目标生成的文件使用安装(文件)
:
修好了。我不得不将add_custom_命令
折叠到add_custom_目标
:
cmake_minimum_required(VERSION 3.5)
add_custom_target(
main ALL
COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/go.sh ${PROJECT_NAME}
)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/main DESTINATION /usr/local/bin/)
set(CPACK_GENERATOR "DEB")
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Me")
include(CPack)
@tsyvarev的回答为您指出了正确的方向,您编辑的问题几乎是正确的。您遗漏了add_custom_target()
的ALL
选项,这就是默认情况下未生成main
目标的原因。更正您的CMakeLists.txt
文件以解决此问题,以下操作应满足您的要求:
cmake_minimum_required(VERSION 3.5)
add_custom_target(
main ALL
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)
这是CMake的一个非常标准的模式,使用自定义命令创建文件,自定义目标依赖于该文件,以便根据需要触发该文件。使用相同的目标名称和输出文件名对某些生成器不起作用:对于每个目标,CMake在生成树中使用相同的名称创建目录,所以它会与生成的文件冲突。我不明白。如果不是目标结果文件的名称,那么目标名称是什么?在CMake中,目标名称只是出于某种目的的抽象标识符。它与它生成的文件不同。此外,单个目标可能会生成多个文件。。。或者一个也没有。顺便说一句,您的add_custom_命令
不起作用:您的忘记为自定义目标添加依赖项选项。根据CMake文档,依赖项用于“指定命令依赖的文件”。在我的情况下,该命令不依赖任何文件,因此,我不确定我会在该子句中添加什么。您需要确定与add\u custom\u命令
的输出相对应的add\u custom\u目标是否无效。本例中的install命令找不到目标。它找不到文件,因为add\u custom\u命令
不起作用。请参阅我对问题帖子的评论。这将导致在每个构建中重新生成main
脚本。对于这样的小脚本来说,这可能不是什么大问题,但通常不是您想要的。根据CMake文档,ALL
表示“应该将此目标添加到默认构建目标中,以便每次都运行它”。那么,附加的add_custom_命令的区别是什么呢。它取决于自定义输出,因此,如果输出过期,将重新生成输出。因此,如果自定义输出已经存在,则不会重新生成。另一个问题:在add\u custom\u target
子句中的main
的用途是什么?我知道它是目标名称,但没有任何东西将目标称为main
,只有${CMAKE\u CURRENT\u BINARY\u DIR}/program
。所有目标都隐式引用它。如果使用Unix Makefile
作为生成器,则可以加载Makefile
文件并查看其中的依赖关系。即使没有这些,也可以创建没有任何引用的自定义目标。例如,这对于创建按需目标非常有用,开发人员可以要求仅在需要时构建这些目标,例如运行某种清理任务或特殊工具。
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/main DESTINATION /usr/local/lib/)
cmake_minimum_required(VERSION 3.5)
add_custom_target(
main ALL
COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/go.sh ${PROJECT_NAME}
)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/main DESTINATION /usr/local/bin/)
set(CPACK_GENERATOR "DEB")
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Me")
include(CPack)
cmake_minimum_required(VERSION 3.5)
add_custom_target(
main ALL
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)