我正在尝试使用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
我考虑过复制build目录中的翻译文件并处理此副本,但这意味着在源代码中找到的任何新翻译都将放入副本中,而不是初始文件中。我将不得不手动复制源目录中的副本。
This solution建议调用set_directory_properties(PROPERTIES CLEAN_NO_CUSTOM 1)
,这是可行的,但仅适用于Makefile生成器。此外,该文件不存在于属性ADDITIONAL_MAKE_CLEAN_FILES
中。
为什么文件在第一次被删除,我如何避免这种行为,而不禁用清理自定义文件?
谢谢,
发布于 2018-01-10 22:37:15
CMake会清理您的文件,因为它被标记为自定义命令的OUTPUT
。让自定义目标生成该文件,而CMake永远不会知道它,因此在make clean
期间让它保持原样。在调用add_custom_target
生成多个文件时,您还可以指定许多COMMAND bla bla
参数。
发布于 2018-01-10 22:38:34
您可能只想添加一个自定义目标并显式地调用它的构建:
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)
https://stackoverflow.com/questions/48187569
复制相似问题