如何使用cmake(或任何其他可移植构建工具)剥离文件扩展名?

时间:2012-04-25 16:37:31

标签: build cmake

我正在开发一个由多个小型可执行文件组成的项目。可执行文件旨在从终端(或命令提示符)运行,并且可以用任何编程语言编写。用解释语言编写的那些用于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.pystrawberry.lua的文件扩展名,具体取决于该平台。因此,bin目录应该在unixy系统上包含以下文件:

banana grape orange strawberry

以及Windows上的以下内容:

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

我该怎么做?

1 个答案:

答案 0 :(得分:6)

如果您不将这些脚本文件视为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)