Qt 翻译文件在 make clean 上被删除,使用 CMake

Qt translation file is removed on make clean, using CMake

我正在尝试使用 CMake 生成和更新 Qt 翻译文件。 我的问题是,当我调用 make clean 时,我的 .ts 文件被删除了。

我可以很容易地重现问题。这是 CMakeLists.txt:

cmake_minimum_required(VERSION 3.7)

find_package(Qt5LinguistTools)

add_custom_command(OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/tr.ts
  COMMAND ${Qt5_LUPDATE_EXECUTABLE} -target-language en main.cpp -ts tr.ts
  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
  DEPENDS main.cpp
)

add_custom_target(foo DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/tr.ts)

和翻译文件tr.ts

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="en">
<context>
    <name>QObject</name>
    <message>
        <location filename="main.cpp" line="8"/>
        <source>%_foo</source>
        <translation>Foo</translation>
    </message>
</context>
</TS>

我的源文件main.cpp:

#include <QCoreApplication>
#include <QString>

#include <iostream>

int main(int argc, char* argv[])
{
  QCoreApplication app(argc, argv);

  QString what(QObject::tr("%_foo"));
  std::cout << what.toStdString() << std::endl;
  return app.exec();
}

只需配置构建目录并调用clean目标:

mkdir build && cd build
cmake ..
make clean

我考虑过复制构建目录中的翻译文件并处理此副本,但这意味着在源代码中找到的任何新翻译都将放入副本中,而不是初始文件。我将不得不手动复制源目录中的副本。

This solution 表示调用 set_directory_properties(PROPERTIES CLEAN_NO_CUSTOM 1),这有效,但仅适用于 Makefile 生成器。此外,该文件不在 属性 ADDITIONAL_MAKE_CLEAN_FILES.

为什么文件首先被删除?如何在不禁用清理自定义文件的情况下避免这种行为?

谢谢,

CMake 会清理您的文件,因为它被标记为自定义命令的 OUTPUT。让自定义目标生成该文件,CMake 永远不会知道它,因此在 make clean 期间保持原样。您还可以在调用 add_custom_target 以生成许多文件时指定许多 COMMAND bla bla 个参数。

您可能只想添加自定义目标并显式调用其构建:

cmake_minimum_required(VERSION 3.7)

find_package(Qt5LinguistTools)

add_custom_target(foo COMMAND ${Qt5_LUPDATE_EXECUTABLE} -target-language en ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp -ts tr.ts)

因此要构建 ts 文件:

make foo

任何后续的 make clean 调用都不会影响 ts 文件。您最终可以添加另一个目标来明确清理 ts 文件:

add_custom_target(foo-clean COMMAND rm tr.ts)