install(CODE) 和 execute_process 配合
确保 WORKING_DIRECTORY 存在
示例代码:
1 | set(CMAKE_INSTALL_PREFIX ${PROJECT_BINARY_DIR}/export) |
注意确保 CMAKE_INSTALL_PREFIX 存在,可能执行这段代码时还没有 install target 导致 CMAKE_INSTALL_PREFIX 还没有生成。
注意变量转义
不转义容易在 package 时,执行 execute_process 因为路径问题出错。
示例代码:
1 | set(CMAKE_INSTALL_PREFIX ${PROJECT_BINARY_DIR}/export) |
注意 ${WORKING_DIRECTORY} 之前是有 \ 转义,当没有转义时,CMAKE_INSTALL_PREFIX会直接替换,此时 CMAKE_INSTALL_PREFIX 表示的 install 路径。 make package时会到一个临时目录处理,其中的 CMAKE_INSTALL_PREFIX 跟 install 路径是不一样的,所以执行 execute_process 会出问题。当转义了表示 execute_process时再去获取 CMAKE_INSTALL_PREFIX, 这时能获取到正确路径。可以在 cmake_install.cmake 查看生成的代码。注意 WORKING_DIRECTORY 的值。
不转义生成代码:
1 | if(CMAKE_INSTALL_COMPONENT STREQUAL "rel" OR NOT CMAKE_INSTALL_COMPONENT) |
转义生成代码:
1 | if(CMAKE_INSTALL_COMPONENT STREQUAL "rel" OR NOT CMAKE_INSTALL_COMPONENT) |
在 MacOS 上 No CMAKE_CXX_COMPILER could be found
1 | sudo xcode-select -s /Applications/Xcode.app/Contents/Developer |
CMAKE_OSX_ARCHITECTURES
- 设置
macOS和iOS的特定架构 - 应在第一次
project()或enable_language()命令之前设置 - 应设置为
CACHE条目, 除非策略CMP0126设置为NEW - 在
Apple以外的平台上被忽略
1 | if (APPLE) |
cmakedefine 的使用例子
#cmakedefine 用于 configure_file() 中用于生成头文件的文件中,只有当 CMakeLists.txt 中的同名变量为真时才会在生成的头文件中定义,区别于 #define 无论何时都会定义。
例如:
1 | cat config.h.cmake |
1 | cat CMakeLists.txt |
只有当 mach/mach_time.h 存在时,在 config.h 才会定义 HAVE_MACH_MACH_TIME_H 。