CMake安装目标给定的目标不是可执行文件、库或模块

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

我正在尝试构建一个包含单个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, 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)