Search code examples
visual-studioqtqt-vs-addin

Qt Visual Studio Tools moc and qrc don't respect pre-build events


I'd like to use a script to build translations (convert from .ts to .qm, using Qt's lrelease.exe) before compiling the resource file (QRC) where they are included. In this way I know they are always updated, not to mention to avoid including binary files in the repository.

I use Visual Studio and have installed the Qt Visual Studio Tools. Normally, I'd do this through a pre-build step in the project, but it is not being executed and the compilation of the QRC file always fails.

enter image description here

1>------ Build started: Project: MyApp, Configuration: Release Win32 ------
1>Rcc'ing MyApp.qrc...
1> RCC: Error in 'C:\src\MyApp\MyApp\MyApp.qrc': Cannot find file 'translations/myapp_en.qm'
1>MyApp.qrc : error 1: rcc (c:\Qt\qt_5_12_3\v141\Win32\bin\rcc.exe)
1>Done building project "MyApp.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 12 up-to-date, 1 skipped ==========

The script works correctly and it is called successfully either if placed as a post-build event or from command line.

@echo off

pushd "%1"
for %%F in (*.ts) do (
    c:\Qt\qt_5_12_3\v141\Win32\bin\lrelease -compress %%F -qm %%~nF.qm
)
popd

exit /b 0

What I'm I doing wrong?


Solution

  • It happened that I was using the new Qt/MSBuild mode of Qt VS Tools. Internally it generates several hidden targets in the MSBuild workflow, which are executed before the pre-build events.

    The solution was to use a custom build step instead, with some specific settings:

    • Execute before the QtRcc target (the one that actually compiles the resource file)
    • The Qt VS Tools parses QRC files to check if the resources have been modified, so it can skip compiling them. It is necessary to add the .qm translation files as output of the custom build step.
    • Similarly, to guarantee translations are always compiled, set dependencies of the custom build step to the .ts source files.

    enter image description here