Skip to content

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_PATHCMAKE_BINARY_DIR 是 CMake 中用于指定输出路径的两个变量,它们的作用有一些区别:

  1. 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)
  2. 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