ld指令
条件判断
if (NOT (DEFINED PICO_COMPILER OR DEFINED CMAKE_TOOLCHAIN_FILE))
endif()
if (NOT "${PICO_TOOLCHAIN_PATH}" STREQUAL "")
endif()
if (NOT (DEFINED PICO_COMPILER OR DEFINED CMAKE_TOOLCHAIN_FILE))
endif()
if (NOT "${PICO_TOOLCHAIN_PATH}" STREQUAL "")
endif()
函数与宏的区别
• 如果在宏中执行return命令之后,整个CMake进程会退出执行,不再继续执行其他语 • 函数会产生新的作用域,在函数中return只意味着退出函数作用域 • 函数中有一些特有的默认变量 • 函数会产生新的作用域,同时会默认生成新的变量即ARGN、ARGC、ARGV等等。 • 在函数中调用宏时,仅仅只是把宏的实现语句往函数中拷贝了一份(即宏替换),所以,宏中语句的执行都基础函数变量的基础上
函数相关变量
TIP
CMAKE_CURRENT_FUNCTION CMAKE_CURRENT_FUNCTION_LIST_DIR CMAKE_CURRENT_FUNCTION_LIST_FILE CMAKE_CURRENT_FUNCTION_LIST_LINE ARGC函数实参的个数 ARGV所有实参列表 ARGN所有额外实参列表, 即ARGV去掉函数声明时显示指定的实参,剩余的实参 ARGV0函数第1个实参 ARGV1函数第2个实参 依次类推依次类推
FUNCTION 引用来传递参数
set(var "abc") # 定义一个变量var,初值为abc
function(f1 arg)
set(${arg} "ABC" PARENT_SCOPE) # ${arg} == var, 于是相当于set(var "ABC" PARENT_SCOPE)
endfunction()
f1(var)
f1(${var}) ???
#函数调用处用变量的名字var,而不是它的值${var}
#如果写成了 f1(${var}), 那么先计算表达式${var}, 即相当于调用f1(abc), 调用结果是在函数的父作用域定义了一个abc变量.
set(var "abc") # 定义一个变量var,初值为abc
function(f1 arg)
set(${arg} "ABC" PARENT_SCOPE) # ${arg} == var, 于是相当于set(var "ABC" PARENT_SCOPE)
endfunction()
f1(var)
f1(${var}) ???
#函数调用处用变量的名字var,而不是它的值${var}
#如果写成了 f1(${var}), 那么先计算表达式${var}, 即相当于调用f1(abc), 调用结果是在函数的父作用域定义了一个abc变量.
目录相关变量
- PROJECT_NAME
- PROJECT_SOURCE_DIR #This is the source directory of the last call to the project()
- PROJECT_BINARY_DIR:当前最近的 project() 命令对应 binary 目录
- PROJECT_IS_TOP_LEVEL
- CMAKE_CURRENT_LIST_DIR
- CMAKE_CURRENT_SOURCE_DIR
- CMAKE_SOURCE_DIR:当前 CMake source tree 的顶层
- CMAKE_BINARY_DIR:当前 CMake build tree 的顶层
- CMAKE_CURRENT_SOURCE_DIR:当前正在处理的 source 目录
- CMAKE_CURRENT_BINARY_DIR:当前正在处理的 binary 目录
- CMAKE_CURRENT_LIST_FILE:当前正在处理的 CMake list 文件(CMakeLists.txt 或 *.cmake)
- CMAKE_CURRENT_LIST_DIR:当前正在处理的 CMake list 文件所在目录
project(MyProject)...
if(PROJECT_IS_TOP_LEVEL)
include(CTest)
endif()
project(MyProject)...
if(PROJECT_IS_TOP_LEVEL)
include(CTest)
endif()
LIBRARY_OUTPUT_PATH
,EXECUTABLE_OUTPUT_PATH
和 CMAKE_BINARY_DIR
是 CMake 中用于指定输出路径的两个变量,它们的作用有一些区别:
EXECUTABLE_OUTPUT_PATH
:EXECUTABLE_OUTPUT_PATH
是一个用于指定可执行文件输出路径的变量。- 通过设置
EXECUTABLE_OUTPUT_PATH
,你可以将生成的可执行文件(即最终的目标二进制文件)放置在指定的目录中。 - 该变量的作用范围是当前
CMakeLists.txt
文件以及其子目录。也就是说,它具有局部作用域。 - 例如:cmake
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin)
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin)
CMAKE_BINARY_DIR
:CMAKE_BINARY_DIR
是 CMake 的内置变量,表示构建过程中的根目录。- 通常,
CMAKE_BINARY_DIR
包含生成的可执行文件、库以及其他构建目标的输出路径。 - 在使用
CMAKE_BINARY_DIR
时,你可以直接在路径后面追加目标的子目录,而不需要使用EXECUTABLE_OUTPUT_PATH
。 - 该变量的作用范围是整个项目,具有全局作用域。
- 例如:cmake
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin)
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin)
在实践中,你可以选择使用其中一个或结合使用,具体取决于你的项目结构和组织方式。使用 CMAKE_BINARY_DIR
通常更为灵活,因为它可以同时用于管理可执行文件、库文件等的输出路径。而 EXECUTABLE_OUTPUT_PATH
提供了一种更具体的、局部的方式来设置可执行文件的输出路径。
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/build)
查找目录
CMAKE_MODULE_PATH
include() or find_package() 查找目录
命令表
- add_compile_definitions
- add_compile_options
- add_custom_command
- add_custom_target
- add_definitions
- add_dependencies
- add_executable
- add_library
- add_link_options
- add_subdirectory
- add_test
- aux_source_directory
- build_command
- create_test_sourcelist
- define_property
- enable_language
- enable_testing
- export
- fltk_wrap_ui
- get_source_file_property
- get_target_property
- get_test_property
- include_directories
- include_external_msproject
- include_regular_expression
- install
- link_directories
- link_libraries
- load_cache
- project
- remove_definitions
- set_source_files_properties
- set_target_properties
- set_tests_properties
- source_group
- target_compile_definitions
- target_compile_features
- target_compile_options
- target_include_directories
- target_link_directories
- target_link_libraries
- target_link_options
- target_precompile_headers
- target_sources
- try_compile
- try_run
模块
可以使用INTERFACE ,PUBLIC, PRIVATE三种类型。
- INTERFACE作用是在编译ibhello.so的时候,不使用这些参数,但是在编译需要链接libhello.so的目标(应用程序或者库)时,编译指令中加入这些参数。换句话说就是把这些参数传给这个库的使用者。
- PUBLIC 是INTERFACE 和 PRIVATE的两种功能的合并。也就是编译当前目标使用这个参数,编译这个目标的使用者时,也使用这个参数
#目标library也需加上intterface
add_library(disassembler INTERFACE)
target_include_directories(disassembler INTERFACE ${CMAKE_CURRENT_LIST_DIR}/module)
target_sources(disassembler INTERFACE
${CMAKE_CURRENT_LIST_DIR}/module/armdisasm.c
${CMAKE_CURRENT_LIST_DIR}/module/armdisasm.h)
#目标library也需加上intterface
add_library(disassembler INTERFACE)
target_include_directories(disassembler INTERFACE ${CMAKE_CURRENT_LIST_DIR}/module)
target_sources(disassembler INTERFACE
${CMAKE_CURRENT_LIST_DIR}/module/armdisasm.c
${CMAKE_CURRENT_LIST_DIR}/module/armdisasm.h)
条件
• if()/elseif()/else()/endif() • foreach()/endforeach() • while()/endwhile()
命令定义
- macro()/endmacro(),
- function()/endfunction()
变量
- set() and unset()
set(mylist a "b|c")
foreach(entry IN LISTS mylist)
string(REPLACE "|" ";" entry "${entry}")
# use "${entry}" normallyendforeach()
endforeach()
set(mylist a "b|c")
foreach(entry IN LISTS mylist)
string(REPLACE "|" ";" entry "${entry}")
# use "${entry}" normallyendforeach()
endforeach()
执行命令
execute_process(commnad cmd1 working_directory dir [OUTPUT_VARIABLE var]
文件操作
Read • file(read file.txt store_var [offset 0 limit max_len] #读文件内容存在变量store_var • file(strings file.txt store_lst) #读取每一行存储于 list中in which each item is a line from the input file • file(md5|sha1|SHA224|SHA256|SHA384|SHA512 filename store_val) # 计算hash值
Write • file(write filename [content]) • file(append filename [content]) • file(touch filename) ; file(touch_nocreate filename) • file(glob var_list [list_directories true|false] [relative dir] expression • file(glob_recurse var_list [relative dir] expression
Delete • file(remove file...) • file(remove_recurse file...)
Rename • file(rename oldname newname)
Copy • file(copy_file oldname newname) • file(copy file... destination dir)
Size • file(size filename var_store)
Else • file(read_symlink line_file var_store) • file(create_link original_file linkname) • file(chmod file... permission)
HTTP • file(download url save_file options) • file(upload file url options) options : log show_progress status (timeout seconds) userpwd name:passwd httpheader header
list 操作
• 读取
- list(length LIST [out_var])
- list(get LIST index [out_var])
- list(join LIST [glue] [out_var])
- list(sublist LIST [begin] [length] [out_var]) • 修改
- list(apped LIST a b c)
- list(filter LIST {include|exclude} regex)
- list(insert LIST [index] element....)
- list(pop_back LIST [out-var])
- list(pop_front LIST [out-var])
- list(prepend LIST element...)
- list(remove_item LIST value)
- list(remote_at LIST index)
- list(remote_duplicates LIST)
- list(transform LIST [actions]) • 排序
- list(reverse LIST)
- list(SORT [LIST] COMPARE[STRING|FILE_BASENAME|NATURAL] CASE[SENSITIVE|INSENSITIVE] ORDER[ASCENDING|DESCENDING])
• 查找 list(find LIST [value] [out_var]) #Returns the index of the element specified in the list or -1 if it wasn't found.
# Remove duplicates from a string containing compilation flags
function(remove_duplicated_flags FLAGS UNIQFLAGS)
set(FLAGS_LIST "${FLAGS}")
# Convert the given flags, as a string, into a CMake list type
separate_arguments(FLAGS_LIST)
# Remove all the duplicated flags
list(REMOVE_DUPLICATES FLAGS_LIST)
# Convert the list back to a string
string(REPLACE ";" " " FLAGS_LIST "${FLAGS_LIST}")
# Return that string to the caller
set(${UNIQFLAGS} "${FLAGS_LIST}" PARENT_SCOPE)
endfunction()
# Remove duplicates from a string containing compilation flags
function(remove_duplicated_flags FLAGS UNIQFLAGS)
set(FLAGS_LIST "${FLAGS}")
# Convert the given flags, as a string, into a CMake list type
separate_arguments(FLAGS_LIST)
# Remove all the duplicated flags
list(REMOVE_DUPLICATES FLAGS_LIST)
# Convert the list back to a string
string(REPLACE ";" " " FLAGS_LIST "${FLAGS_LIST}")
# Return that string to the caller
set(${UNIQFLAGS} "${FLAGS_LIST}" PARENT_SCOPE)
endfunction()
环境变量
$ENV