11

私はCMakeが初めてで、解決策がわからないという問題があります。CMake を使用して、一連のオプションのサブディレクトリを含むプロジェクトをコンパイルしています。共有ライブラリ ファイルが期待どおりにビルドされます。その部分はうまく機能しているようです。これらの各サブディレクトリには、sql ファイルが含まれています。選択したすべての SQL ファイルを 1 つの SQL ヘッダー ファイルに連結し、結果をインストールする必要があります。したがって、次のような1つのファイル:

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 の両方で動作する必要があります。

正しい方向に向けるためのヒントがあれば幸いです。

4

2 に答える 2

5

CMake 3.18 の時点で、CMakeコマンド ライン ツールは を使用してファイルを連結できますcat。したがって、ファイルのリストを含む変数を想定すると、次を使用してコマンドをPACKAGE_SQL_FILES実行できます。catexecute_process

# Concatenate the sql files into a variable 'FINAL_FILE'.
execute_process(COMMAND ${CMAKE_COMMAND} -E cat ${PACKAGE_SQL_FILES}
    OUTPUT_VARIABLE FINAL_FILE
    WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
)
# Write out the concatenated contents to 'final.sql.in'.
file(WRITE final.sql.in ${FINAL_FILE})

解決策の残りの部分は、Fraser の応答に似ています。configure_file結果ファイルが必要な場合にのみ更新されるように使用できます。

configure_file(final.sql.in final.sql COPYONLY)

installファイルをインストールするには、同じ方法で引き続き使用できます。

install(FILES ${CMAKE_CURRENT_BINARY_DIR}/final.sql
    DESTINATION ${INSTALL_PATH})
于 2020-06-13T16:46:32.093 に答える