首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用CMake在make clean时删除Qt转换文件

使用CMake在make clean时删除Qt转换文件
EN

Stack Overflow用户
提问于 2018-01-10 20:32:01
回答 2查看 591关注 0票数 3

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

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

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
<?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

代码语言:javascript
运行
复制
#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目标:

代码语言:javascript
运行
复制
mkdir build && cd build
cmake ..
make clean

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

This solution建议调用set_directory_properties(PROPERTIES CLEAN_NO_CUSTOM 1),这是可行的,但仅适用于Makefile生成器。此外,该文件不存在于属性ADDITIONAL_MAKE_CLEAN_FILES中。

为什么文件在第一次被删除,我如何避免这种行为,而不禁用清理自定义文件?

谢谢,

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-10 22:37:15

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

票数 3
EN

Stack Overflow用户

发布于 2018-01-10 22:38:34

您可能只想添加一个自定义目标并显式地调用它的构建:

代码语言:javascript
运行
复制
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文件:

代码语言:javascript
运行
复制
make foo

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

代码语言:javascript
运行
复制
add_custom_target(foo-clean COMMAND rm tr.ts)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48187569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档