【CMake 语法】(9) CMake 路径操作

get_filename_component 形式一

获取完整文件名路径的特定部分。

get_filename_component(<var> <FileName> <mode> [CACHE])

文件名 <FileName> 根据处理模式 <mode>,结果保存到 <var> 中。

<mode> 表示处理模式,是以下值之一:

PATH      = Legacy alias for DIRECTORY (use for CMake <= 2.8.11)
DIRECTORY = Directory without file name
NAME      = File name without directory
EXT       = File name longest extension (.b.c from d/a.b.c)
NAME_WE   = File name with neither the directory nor the longest extension
LAST_EXT  = File name last extension (.c from d/a.b.c)
NAME_WLE  = File name with neither the directory nor the last extension

PATHDIRECTORY 表示文件路径名,PATH 是历史遗留。
NAME 表示文件名。
EXT 表示最长扩展名,NAME_WE 表示最短文件名
LAST_EXT 表示最短扩展名,NAME_WLE 表示最长文件名

CACHE 参数,则结果变量添加到缓存中。

案例,获取完整文件名路径的特定部分。

cmake_minimum_required(VERSION 3.9.0)

set(FileName C:\\Windows\\System32\\drivers\\etc\\lmhosts.sam)
message("FileName: ${FileName}")

get_filename_component(VAR ${FileName} PATH)
message("PATH: ${VAR}")
get_filename_component(VAR ${FileName} DIRECTORY)
message("DIRECTORY: ${VAR}")
get_filename_component(VAR ${FileName} NAME)
message("NAME: ${VAR}")
get_filename_component(VAR ${FileName} EXT)
message("EXT: ${VAR}")
get_filename_component(VAR ${FileName} NAME_WE)
message("NAME_WE: ${VAR}")
get_filename_component(VAR ${FileName} LAST_EXT)
message("LAST_EXT: ${VAR}")
get_filename_component(VAR ${FileName} NAME_WLE)
message("NAME_WLE: ${VAR}")

输出结果

FileName: C:\Windows\System32\drivers\etc\lmhosts.sam
PATH: C:/Windows/System32/drivers/etc
DIRECTORY: C:/Windows/System32/drivers/etc
NAME: lmhosts.sam
EXT: .sam
NAME_WE: lmhosts
LAST_EXT: .sam
NAME_WLE: lmhosts

文件路径名: C:\Windows\System32\drivers\etc\lmhosts.sam
目录路径: C:/Windows/System32/drivers/etc
文件名: lmhosts.sam
最长扩展名: .sam
最短文件名: lmhosts
最短扩展名: .sam
最长文件名: lmhosts

如果文件路径为 C:\Windows\System32\drivers\etc\hosts,输出结果为

FileName: C:\Windows\System32\drivers\etc\hosts
PATH: C:/Windows/System32/drivers/etc
DIRECTORY: C:/Windows/System32/drivers/etc
NAME: hosts
EXT:
NAME_WE: hosts
LAST_EXT:
NAME_WLE: hosts

如果文件路径为 C:\Windows\System32\drivers\etc\hosts,输出结果为

FileName: C:\Windows\System32\drivers\etc\hosts
PATH: C:/Windows/System32/drivers/etc
DIRECTORY: C:/Windows/System32/drivers/etc
NAME: hosts
EXT:
NAME_WE: hosts
LAST_EXT:
NAME_WLE: hosts

如果文件路径为 C:\Windows\System32\Windows.UI.dll,输出结果为

FileName: C:\Windows\System32\Windows.UI.dll
PATH: C:/Windows/System32
DIRECTORY: C:/Windows/System32
NAME: Windows.UI.dll
EXT: .UI.dll
NAME_WE: Windows
LAST_EXT: .dll
NAME_WLE: Windows.UI

get_filename_component 形式二

获取相对路径的绝对路径。

get_filename_component(<var> <FileName> <mode> [BASE_DIR <dir>] [CACHE])

获取文件 <FileName> 的绝对路径,结果保存到 <var> 中。

<mode> 是以下值之一:

ABSOLUTE  = Full path to file
REALPATH  = Full path to existing file with symlinks resolved

ABSOLUTE 表示绝对路径,REALPATH 表示已存在的符号链接。

如果提供文件路径 <FileName> 是相对路径,则它相对于给定的基本目录 <dir> 进行评估,基本目录默认值为 CMAKE_CURRENT_SOURCE_DIR

CACHE 参数,则结果变量添加到缓存中。

案例,将相对路径转换为绝对路径

cmake_minimum_required(VERSION 3.9.0)
get_filename_component(VAR "Windows.UI.dll" ABSOLUTE)
message("ABSOLUTE: ${VAR}")
get_filename_component(VAR "Windows.UI.dll" ABSOLUTE BASE_DIR "C:\\Windows\\System32")
message("ABSOLUTE_BASE_DIR: ${VAR}")

get_filename_component 形式三

获取程序的路径

get_filename_component(<var> <FileName> PROGRAM [PROGRAM_ARGS <arg_var>] [CACHE])

如果给定 <FileName> 仅为程序名,在系统中搜索并获取完整的程序路径,结果保存到 <var> 中。

如果给定 <FileName> 包括程序名和参数,<var> 保存程序路径,<arg_var> 保存程序参数。

CACHE 参数,则结果变量添加到缓存中。

案例,获取程序的路径

get_filename_component(PROGRAM_VAR "shutdown" PROGRAM)
message("PROGRAM: ${PROGRAM_VAR}")
get_filename_component(PROGRAM_VAR "shutdown -s -t" PROGRAM PROGRAM_ARGS ARG_VAR)
message("PROGRAM: ${PROGRAM_VAR}, ARG: ${ARG_VAR}")

REALPATHPROGRAM 子命令已分别被 file(REAL_PATH)separate_arguments(PROGRAM) 命令取代

https://cmake.org/cmake/help/v3.19/command/file.html#real-path
https://cmake.org/cmake/help/v3.19/command/separate_arguments.html

案例: 判断文件是否存在

cmake_minimum_required(VERSION 3.9.0)

set(FILENAME_VAR CMakeLists.txt)
get_filename_component(FILENAME_VAR ${FILENAME_VAR} ABSOLUTE)

if(EXISTS "${FILENAME_VAR}")
 message("${FILENAME_VAR} is exists...")
else()
 message("${FILENAME_VAR} is not exists...")
endif()
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值