Build 如何使用cmake(或任何其他便携式构建工具)剥离文件扩展名?

Build 如何使用cmake(或任何其他便携式构建工具)剥离文件扩展名?,build,cmake,Build,Cmake,我正在从事一个由多个小型可执行文件组成的项目。可执行文件是从终端(或命令提示符)运行的,可以用任何编程语言编写。对于unixy系统,那些用解释语言编写的文件有一行shebang行,而它们的文件扩展名被添加到Windows上的PATHEXT环境变量中 为了使可执行文件在所有编程语言和两个主要平台组中的使用保持一致,我需要从unixy系统上解释程序的文件名中去掉文件扩展名。(我所说的“一致使用”是指:只需键入要启动的程序的名称,而无需指定其文件扩展名。) 为了更深入地了解具体情况,假设我编写了如下C

我正在从事一个由多个小型可执行文件组成的项目。可执行文件是从终端(或命令提示符)运行的,可以用任何编程语言编写。对于unixy系统,那些用解释语言编写的文件有一行shebang行,而它们的文件扩展名被添加到Windows上的PATHEXT环境变量中

为了使可执行文件在所有编程语言和两个主要平台组中的使用保持一致,我需要从unixy系统上解释程序的文件名中去掉文件扩展名。(我所说的“一致使用”是指:只需键入要启动的程序的名称,而无需指定其文件扩展名。)

为了更深入地了解具体情况,假设我编写了如下CMakeLists文件:

project (Mixed Example)

add_executable (banana banana.cpp)
add_executable (grape grape.hs)
add_script? (orange orange.py)
add_script? (strawberry strawberry.lua)

install (TARGETS banana grape orange strawberry DESTINATION bin)
然后我希望
banana.cpp
grape.hs
以通常的方式编译,而
orange.py
草莓.lua
的文件扩展名根据平台有条件地剥离。因此,unixy系统上的
bin
目录应包含以下文件:

banana grape orange strawberry
以及Windows上的以下内容:

banana.exe grape.exe orange.py strawberry.lua

如何做到这一点?

如果您不将这些脚本文件视为CMake目标,而是将它们视为文件,那么您应该能够做到:

project (Mixed Example)

add_executable (banana banana.cpp)
add_executable (grape grape.hs)

install (TARGETS banana grape DESTINATION bin)
if (UNIX)
  install (FILES orange.py DESTINATION bin RENAME orange)
  install (FILES strawberry.lua DESTINATION bin RENAME strawberry)
else (WIN32)
  install (FILES orange.py strawberry.lua DESTINATION bin)
endif ()

如果要使用函数而不是多次调用
install(FILES…
),可以执行以下操作:

function (install_files)
  if (UNIX)
    foreach (file ${ARGV})
      get_filename_component (name_without_extension ${file} NAME_WE)
      install (FILES ${file} DESTINATION bin RENAME ${name_without_extension})
    endforeach ()
  else (WIN32)
    install (FILES ${ARGV} DESTINATION bin)
  endif ()
endfunction ()

install (TARGETS banana grape DESTINATION bin)
install_files (orange.py strawberry.lua)

是否还有一种方法可以将其变成一个新的规则,这样我就不必为每个脚本手动指定重命名?更重要的是,我是否可以省去为每个脚本定义两次安装方法的工作(即,一次用于UNIX,一次用于WIN32)?谢谢,这似乎正是我想要的!