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

Jul*_*ian 8 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)
Run Code Online (Sandbox Code Playgroud)

然后我想banana.cppgrape.hs通常的方式进行编译,而我想要的文件扩展名orange.py,并strawberry.lua有条件地剥离,根据不同的平台上.因此,bin目录应该在unixy系统上包含以下文件:

banana grape orange strawberry
Run Code Online (Sandbox Code Playgroud)

以及Windows上的以下内容:

banana.exe grape.exe orange.py strawberry.lua
Run Code Online (Sandbox Code Playgroud)

我怎么做?

Fra*_*ser 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 ()
Run Code Online (Sandbox Code Playgroud)


如果你想使用一个函数而不是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)
Run Code Online (Sandbox Code Playgroud)