9

我正在开发一个由多个小型可执行文件组成的项目。可执行文件旨在从终端(或命令提示符)运行,并且可以用任何编程语言编写。那些用解释语言编写的文件有一个适用于 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.cppgrape.hs以通常的方式编译,而我希望根据平台有条件地剥离orange.py和的文件扩展名。strawberry.lua因此,该bin目录应包含 unixy 系统上的以下文件:

banana grape orange strawberry

以及 Windows 上的以下内容:

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

我怎么做?

4

1 回答 1

7

如果您不将这些脚本文件视为 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)
于 2012-04-25T17:49:50.280 回答