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
PATH
和 DIRECTORY
表示文件路径名,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}")
REALPATH
和 PROGRAM
子命令已分别被 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()