CMake使用make clean时会删除Qt翻译文件。

3
我想生成和更新Qt翻译文件,使用CMake。我的问题是,当我调用“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

我考虑将翻译文件复制到构建目录中,并在此副本上进行操作,但这意味着源中发现的任何新翻译都会被放置在副本中,而不是初始文件。我必须手动将副本复制到源目录中。 此解决方案建议调用set_directory_properties(PROPERTIES CLEAN_NO_CUSTOM 1),它可以起作用,但仅适用于Makefile生成器。此外,该文件不存在于属性ADDITIONAL_MAKE_CLEAN_FILES中。
为什么文件会首先被删除,如何避免这种行为而不禁用清理自定义文件?
谢谢,

1
尝试将 COMMANDadd_custom_command 移动到 add_custom_target,并完全摆脱 add_custom_command - arrowd
@arrowd,它有效了,感谢您的建议。我会检查是否可以为所有翻译设置一个单一目标,因为我想避免每个翻译文件都有一个目标。 - piwi
2个回答

4

您可能希望添加一个自定义目标并显式地调用其构建:

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)

3

CMake会清理你的文件,因为它被标记为自定义命令的OUTPUT。如果让自定义目标生成该文件,CMake就不会知道它的存在,在执行make clean时也不会去清除它。在调用add_custom_target时,你还可以指定多个COMMAND bla bla参数来生成多个文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接