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)
我正在尝试使用 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)