installation - 使用 CMake,我如何连接文件并安装它们

标签 installation cmake

我是 CMake 的新手,我遇到了一个无法解决的问题。我正在使用 CMake 编译一个带有一堆可选子目录的项目,并按预期构建共享库文件。这部分似乎工作正常。这些子目录中的每一个都包含一个 sql 文件。我需要将所有选定的 sql 文件连接到一个 sql 头文件并安装结果。所以一个文件像:

sql_header.sql
sub_dir_A.sql
sub_dir_C.sql
sub_dir_D.sql

如果我直接在 make 文件中执行此操作,我可能会执行以下操作,只会更聪明地仅处理选定的子目录:
cat sql_header.sql  > "${INSTALL_PATH}/somefile.sql"
cat sub_dir_A.sql  >> "${INSTALL_PATH}/somefile.sql"
cat sub_dir_C.sql  >> "${INSTALL_PATH}/somefile.sql"
cat sub_dir_D.sql  >> "${INSTALL_PATH}/somefile.sql"

我已经弄清楚了这一点,就像我可以使用的那样:
LIST(APPEND PACKAGE_SQL_FILES "some_file.sql")

我假设我可以将它放在每个子目录 CMakeLists.txt 文件中以收集文件名。我可以创建一个宏,如:
CAT(IN "${PACKAGE_SQL_FILES}" OUT "${INSTALL_PATH}/somefile.sql")

但是我在 CMake 最初运行和从 make install 运行之间迷失了方向。也许有更好的方法来做到这一点。我需要它在 Windows 和 Linux 上工作。

我会很高兴有一些提示来指出我正确的方向。

最佳答案

您可以主要使用 CMake 的 file 创建连接文件。和 function 命令。

首先,创建一个cat功能:

function(cat IN_FILE OUT_FILE)
  file(READ ${IN_FILE} CONTENTS)
  file(APPEND ${OUT_FILE} "${CONTENTS}")
endfunction()

假设您在变量 PACKAGE_SQL_FILES 中有输入文件列表,你可以像这样使用这个函数:

# Prepare a temporary file to "cat" to:
file(WRITE somefile.sql.in "")

# Call the "cat" function for each input file
foreach(PACKAGE_SQL_FILE ${PACKAGE_SQL_FILES})
  cat(${PACKAGE_SQL_FILE} somefile.sql.in)
endforeach()

# Copy the temporary file to the final location
configure_file(somefile.sql.in somefile.sql COPYONLY)

写入临时文件的原因是真正的目标文件只有在其内容发生更改时才会更新。见 this answer为什么这是一件好事。

您应该注意,如果您通过 add_subdirectory 包含子目录命令,就 CMake 变量而言,子目录都有自己的范围。在子目录中,使用 list只会影响该子目录范围内的变量。

如果你想创建一个在父作用域中可用的列表,你需要使用 set(... PARENT_SCOPE) ,例如
set(PACKAGE_SQL_FILES
    ${PACKAGE_SQL_FILES}
    ${CMAKE_CURRENT_SOURCE_DIR}/some_file.sql
    PARENT_SCOPE)

到目前为止,所有这些都只是在构建树的根目录中创建了连接文件。要安装它,您可能想使用 install(FILES ...) 命令:
install(FILES ${CMAKE_BINARY_DIR}/somefile.sql
        DESTINATION ${INSTALL_PATH})

因此,每当 CMake 运行时(因为您手动调用它或因为它在您执行“make”时检测到更改),它会更新构建树中的连接文件。只有运行“make install”后,文件才会最终从构建根目录复制到安装位置。

关于installation - 使用 CMake,我如何连接文件并安装它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15282444/

相关文章:

PHP 作为独立应用程序(二进制、编译、打包、主机上没有 php)

CMake - 如何为目标可执行文件设置多个编译定义?

android - 使用 CMake 在 Android Studio 中未生成 SO 文件

c++ - 我的 MouseInteractorStyle : undefined reference to `vtkInteractorStyleZoom::New()'

c - 包括 cmakelists 中已安装的库

python - PyCharm 未找到 Anaconda Python,给出 "can' t 打开文件 'python' : [Errno 2] No such file or directory?“

air - 当我已经安装了 AIR 应用程序时,为什么 AIR 徽章总是显示 'install'?

Kubernetes Master Worker Node Kubeadm Join 问题

jquery - 如何在多个页面上正确动态地包含 jQuery 和 jQueryUI

cmake - CMake 的 find_package 的 Build2 模拟