使用CMake,如何合并文件并进行安装

问题描述 投票:11回答:2

我是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上都可以使用。

我很高兴能得到一些提示,以指出正确的方向。

install cmake
2个回答
15
投票

您可以主要使用CMake的filefile命令创建并置文件。

首先,创建一个function函数:

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) 命令包括子目录,那么就CMake变量而言,所有子目录都有其自己的范围。在子目录中,使用this answer仅会影响该子目录范围内的变量。]​​>

如果要创建在父范围中可用的列表,则需要使用add_subdirectory,例如

list

到目前为止,所有这些都只是在构建树的根目录中创建了级联文件。要安装它,您可能要使用set(... PARENT_SCOPE)命令:

set(... PARENT_SCOPE)

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


0
投票

从CMake 3.18开始,CMake set(PACKAGE_SQL_FILES ${PACKAGE_SQL_FILES} ${CMAKE_CURRENT_SOURCE_DIR}/some_file.sql PARENT_SCOPE) 可以使用install(FILES ...)连接文件。因此,假设包含文件列表的变量install(FILES ...),可以使用install(FILES ${CMAKE_BINARY_DIR}/somefile.sql DESTINATION ${INSTALL_PATH}) 运行command line tool命令行:

© www.soinside.com 2019 - 2024. All rights reserved.