gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 08:13:20 25 4
gpt4 key购买 nike

我正在一个由多个小型可执行文件组成的项目中。可执行文件应从终端(或命令提示符)运行,并且可以用任何编程语言编写。那些使用解释语言编写的文件在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的文件扩展名。因此,unit系统上的 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)

关于build - 如何使用cmake(或任何其他可移植构建工具)剥离文件扩展名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10320002/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com