<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Modern App Packaging]]></title><description><![CDATA[<p dir="auto">Hi, everyone! I’d like to ask the Qt development pros, in as much detail as possible, <em>how you package your applications</em>??</p>
<p dir="auto">Let me explain what I mean by “<em>package</em>.” For Windows, this means a single .exe file that, when run, starts the installation. For macOS, it’s a single .dmg file.</p>
<p dir="auto">So, I have some code. There's a standard “src” folder and a standard “CMakeLists.txt” file. Now I need to take certain steps to end up with all the possible installers for Windows, Mac, and Linux at once. My question is: what exactly are those steps?</p>
<p dir="auto"><img src="https://ddgobkiprc33d.cloudfront.net/6426edf4-d6fa-474b-a8f6-8a867fe2ce15.png" alt="image-2025-02-08-2036.png" class=" img-fluid img-markdown" /><br />
To be honest, I don't really get the big picture. I understand some of the steps—for example, you can create an installer simply by following the guides from Inno Setup itself. But the exact sequence of steps is a mystery to me. By the way, on Windows, simply running <code>windeployqt</code> doesn’t work—it doesn’t bundle the dependencies. So, developers, please share your experiences and how you make this process easier for yourselves! Based on the responses, I plan to write a guide on GitHub so that others can use it. I think packaging an application is a tricky topic full of nuances.</p>
]]></description><link>https://forum.qt.io/topic/164937/modern-app-packaging</link><generator>RSS for Node</generator><lastBuildDate>Sun, 13 Sep 2026 03:20:06 GMT</lastBuildDate><atom:link href="https://forum.qt.io/topic/164937.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 26 Jul 2026 22:23:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Modern App Packaging on Mon, 07 Sep 2026 07:46:57 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/sales99">@<bdi>sales99</bdi></a> said in <a href="/post/839981">Modern App Packaging</a>:</p>
<blockquote>
<p dir="auto">mani mani, but apps dont deploy, waste of time</p>
</blockquote>
<p dir="auto">So, what do you think <code>windeployqt</code>, <code>linuxdeployqt</code>, and <code>macdeployqt</code> are doing?</p>
]]></description><link>https://forum.qt.io/post/840019</link><guid isPermaLink="true">https://forum.qt.io/post/840019</guid><dc:creator><![CDATA[SimonSchroeder]]></dc:creator><pubDate>Mon, 07 Sep 2026 07:46:57 GMT</pubDate></item><item><title><![CDATA[Reply to Modern App Packaging on Fri, 04 Sep 2026 12:21:40 GMT]]></title><description><![CDATA[<p dir="auto">mani mani, but apps dont deploy, waste of time</p>
]]></description><link>https://forum.qt.io/post/839981</link><guid isPermaLink="true">https://forum.qt.io/post/839981</guid><dc:creator><![CDATA[sales99]]></dc:creator><pubDate>Fri, 04 Sep 2026 12:21:40 GMT</pubDate></item><item><title><![CDATA[Reply to Modern App Packaging on Wed, 29 Jul 2026 06:36:28 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/paul-colby">@<bdi>Paul-Colby</bdi></a> said in <a href="/post/839425">Modern App Packaging</a>:</p>
<blockquote>
<p dir="auto">Using one of my open source projects as an example, the steps are roughly as follows:</p>
</blockquote>
<p dir="auto">That is a great overview. I would upvote more than once if I could!</p>
<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/paul-colby">@<bdi>Paul-Colby</bdi></a> said in <a href="/post/839425">Modern App Packaging</a>:</p>
<blockquote>
<p dir="auto">except instead of producing a Windows *.exe installer, I produce a "portable app" - which is a single archive (you can just unzip it), containing everything the app needs to runs</p>
</blockquote>
<p dir="auto">For years we had problems with DLLs on Windows (which was before I got to work at this company and before they/we used Qt). The problem is when users want to switch out the executable, but developers might have slightly incompatible Qt versions on their machines. That is one big reason why we chose to compile Qt statically ourselves (and also using static Windows runtime). With 3rd party libraries it is sometimes hard to convince them to link against the static Windows runtime as well, but it is certainly worth it. The main software is just a single executable without any DLL dependencies. We do need some config files in specific directories. These we just put into the exectuable as well and check on startup if they exist and copy them to the right folder if necessary. For some users a portable app inside a ZIP file is still too complicated because they wouldn't know where to put it. I'm still playing with the idea to not just copy config files to the correct folder, but also to have an install button inside the app itself which will automatically copy it into "Program Files" directory, put it into the start menu and maybe register file extensions. This is so much easier with macOS or with AppImages/xdg on Linux. I believe this is how apps should work on Windows as well–no extra installer. I wish there would be something like AppImages for Windows as well (then I would be willing to use DLLs again).</p>
<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/paul-colby">@<bdi>Paul-Colby</bdi></a> said in <a href="/post/839435">Modern App Packaging</a>:</p>
<blockquote>
<p dir="auto">Locally, I just use the OS-provided versions of GCC and Clang on the latest LTS (work) and non-LTS (personal) Ubuntu.</p>
</blockquote>
<p dir="auto">Isn't there some requirement for linuxdeploy that you cannot use the most recent version of the OS (in order to provide the best backwards compatility across most distros)? Or is there a specific switch to override this? I couldn't see anything from your linked CMake files. Or were you just lucky so far?</p>
]]></description><link>https://forum.qt.io/post/839439</link><guid isPermaLink="true">https://forum.qt.io/post/839439</guid><dc:creator><![CDATA[SimonSchroeder]]></dc:creator><pubDate>Wed, 29 Jul 2026 06:36:28 GMT</pubDate></item><item><title><![CDATA[Reply to Modern App Packaging on Wed, 29 Jul 2026 04:11:37 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/jksh">@<bdi>JKSH</bdi></a> said in <a href="/post/839436">Modern App Packaging</a>:</p>
<blockquote>
<p dir="auto">Could this part be replaced by the official <code>qt_generate_deploy_app_script()</code> command?</p>
</blockquote>
<p dir="auto">Absolutely! If you only need/want to support Qt 6.3+ 🙂</p>
<p dir="auto">Some of my projects are still supporting Qt 5.x, and 6.2, so I haven't adopted <code>qt_generate_deploy_app_script()</code> yet, nor a few other nice things that Qt6+ has added.  I will sometime 🤞(yes, I know Qt 5.x is soooo old 😅)</p>
]]></description><link>https://forum.qt.io/post/839437</link><guid isPermaLink="true">https://forum.qt.io/post/839437</guid><dc:creator><![CDATA[Paul Colby]]></dc:creator><pubDate>Wed, 29 Jul 2026 04:11:37 GMT</pubDate></item><item><title><![CDATA[Reply to Modern App Packaging on Wed, 29 Jul 2026 03:41:24 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/paul-colby">@<bdi>Paul-Colby</bdi></a> said in <a href="/post/839425">Modern App Packaging</a>:</p>
<blockquote>
<ol>
<li><a href="https://github.com/pcolby/dokit/blob/25f6a1f1842d86cdab4c5d163d5b63aa13eb9f15/src/cli/CMakeLists.txt#L132" target="_blank" rel="noopener noreferrer nofollow ugc">add custom "portable" targets to <code>CMakefileLists.txt</code></a>, so cmake knows how to copy the required binaries, resources, and run <code>windeployqt</code> for my setup.</li>
</ol>
</blockquote>
<p dir="auto">Could this part be replaced by the official <code>qt_generate_deploy_app_script()</code> command? <a href="https://doc.qt.io/qt-6/qt-generate-deploy-app-script.html" target="_blank" rel="noopener noreferrer nofollow ugc">https://doc.qt.io/qt-6/qt-generate-deploy-app-script.html</a></p>
]]></description><link>https://forum.qt.io/post/839436</link><guid isPermaLink="true">https://forum.qt.io/post/839436</guid><dc:creator><![CDATA[JKSH]]></dc:creator><pubDate>Wed, 29 Jul 2026 03:41:24 GMT</pubDate></item><item><title><![CDATA[Reply to Modern App Packaging on Tue, 28 Jul 2026 23:41:17 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/markoprog">@<bdi>MarkoProg</bdi></a> said in <a href="/post/839430">Modern App Packaging</a>:</p>
<blockquote>
<p dir="auto">Thank you so much! This is exactly what I was looking for</p>
</blockquote>
<p dir="auto">You're very welcome :)</p>
<blockquote>
<p dir="auto">What compiler do you use when developing with Qt?</p>
</blockquote>
<p dir="auto">Locally, I just use the OS-provided versions of GCC and Clang on the latest LTS (work) and non-LTS (personal) Ubuntu.  And occasionally the current Clang, and MSVC on macOS and Windows respectively (especially when CI alerts me to issues on those platforms).</p>
<p dir="auto">On GitHub Workflows, I use the current GitHub-provided versions of Clang, GCC, and MSVC - the actual versions depend on the GitHub runner, for example currently GitHub's Windows runners provide MSVC 19, Clang 17, and MinGW 13 - and I use all three, for x86, x86-64 and ARM64 builds, except where not supported by Qt.  Whereas the Ubuntu runners use the versions provided by Ubuntu LTS, which are typically older.</p>
<p dir="auto">You an see the compilers / toolchains in the GitHub Workflows <a href="https://github.com/pcolby/dokit/blob/main/.github/workflows/build.yaml" target="_blank" rel="noopener noreferrer nofollow ugc"><code>build.yaml</code></a> file, specifically:</p>
<ul>
<li><a href="https://github.com/pcolby/dokit/blob/25f6a1f1842d86cdab4c5d163d5b63aa13eb9f15/.github/workflows/build.yaml#L59" target="_blank" rel="noopener noreferrer nofollow ugc"><code>jobs.linux.strategy.matrix.cc</code></a></li>
<li><a href="https://github.com/pcolby/dokit/blob/25f6a1f1842d86cdab4c5d163d5b63aa13eb9f15/.github/workflows/build.yaml#L278" target="_blank" rel="noopener noreferrer nofollow ugc"><code>jobs.mac.strategy.matrix.cc</code></a></li>
<li><a href="https://github.com/pcolby/dokit/blob/main/.github/workflows/build.yaml#L475" target="_blank" rel="noopener noreferrer nofollow ugc"><code>jobs.win.strategy.matrix.toolchain</code></a></li>
</ul>
<p dir="auto">And the actual versions that end up being found (by CMake) and thus used, is in the output of the "Build w/o coverage instrumentation" steps, <a href="https://github.com/pcolby/dokit/actions/runs/30374701202/job/90436504603#step:10:31" target="_blank" rel="noopener noreferrer nofollow ugc">like</a>:</p>
<pre><code>-- CMake version is 3.31.6
-- CMake build type is Release
-- The CXX compiler identification is GNU 13.1.0
</code></pre>
<p dir="auto">Cheers.</p>
]]></description><link>https://forum.qt.io/post/839435</link><guid isPermaLink="true">https://forum.qt.io/post/839435</guid><dc:creator><![CDATA[Paul Colby]]></dc:creator><pubDate>Tue, 28 Jul 2026 23:41:17 GMT</pubDate></item><item><title><![CDATA[Reply to Modern App Packaging on Tue, 28 Jul 2026 18:48:10 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/sgaist">@<bdi>SGaist</bdi></a> said in <a href="/post/839415">Modern App Packaging</a>:</p>
<blockquote>
<p dir="auto">Hi and welcome to devnet,</p>
<p dir="auto">Might be a silly question but did you read through the <a href="https://doc.qt.io/qt-6/windows-deployment.html" target="_blank" rel="noopener noreferrer nofollow ugc">windeployqt</a> and <a href="https://doc.qt.io/qt-6/macos-deployment.html" target="_blank" rel="noopener noreferrer nofollow ugc">macdeployqt</a> documentation ?<br />
These pages already covers quite a lot of the things you are mentioning.</p>
</blockquote>
<p dir="auto">I'm more interested in hearing about developers' real-world experiences than just links. Of course I've read that documentation!</p>
<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/paul-colby">@<bdi>Paul-Colby</bdi></a> said in <a href="/post/839425">Modern App Packaging</a>:</p>
<blockquote>
<p dir="auto">There's lots of way to do it, for exampling using Qt Installer Framework, as <a class="plugin-mentions-user plugin-mentions-a" href="/user/simonschroeder">@<bdi>SimonSchroeder</bdi></a> suggested.<br />
Cheers.</p>
</blockquote>
<p dir="auto">Thank you so much! This is exactly what I was looking for—a detailed description of your experience. What compiler do you use when developing with Qt? Your approach of calling <code>windeployqt</code> directly from CMake is interesting.</p>
]]></description><link>https://forum.qt.io/post/839430</link><guid isPermaLink="true">https://forum.qt.io/post/839430</guid><dc:creator><![CDATA[MarkoProg]]></dc:creator><pubDate>Tue, 28 Jul 2026 18:48:10 GMT</pubDate></item><item><title><![CDATA[Reply to Modern App Packaging on Tue, 28 Jul 2026 09:46:00 GMT]]></title><description><![CDATA[<p dir="auto">There's lots of way to do it, for exampling using Qt Installer Framework, as <a class="plugin-mentions-user plugin-mentions-a" href="/user/simonschroeder">@<bdi>SimonSchroeder</bdi></a> suggested.</p>
<p dir="auto">For my open source projects, I do something very similar to your diagram, except instead of producing a Windows <code>*.exe</code> installer, I produce a "<a href="https://en.wikipedia.org/wiki/Portable_application" target="_blank" rel="noopener noreferrer nofollow ugc">portable app</a>" - which is a single archive (you can just unzip it), containing everything the app needs to runs - all the libraries, etc, which are installed via <code>windeployqt</code>.  If you want to use something like Inno, it would be just one more step.</p>
<p dir="auto">Using one of my open source projects as an example, the steps are roughly as follows:</p>
<h1>Linux</h1>
<ol>
<li>install <a href="https://github.com/linuxdeploy/linuxdeploy" target="_blank" rel="noopener noreferrer nofollow ugc">linuxdeploy</a>, and <a href="https://github.com/linuxdeploy/linuxdeploy-plugin-qt" target="_blank" rel="noopener noreferrer nofollow ugc">linuxdeploy-plugin-qt</a>.</li>
<li><a href="https://github.com/pcolby/dokit/blob/25f6a1f1842d86cdab4c5d163d5b63aa13eb9f15/src/cli/CMakeLists.txt#L95" target="_blank" rel="noopener noreferrer nofollow ugc">tell cmake how to produce an AppImage using <code>linuxdeploy</code></a></li>
<li><a href="https://github.com/pcolby/dokit/blob/25f6a1f1842d86cdab4c5d163d5b63aa13eb9f15/.github/workflows/build.yaml#L147" target="_blank" rel="noopener noreferrer nofollow ugc">configure and build with cmake</a></li>
<li><a href="https://github.com/pcolby/dokit/blob/25f6a1f1842d86cdab4c5d163d5b63aa13eb9f15/.github/workflows/build.yaml#L171" target="_blank" rel="noopener noreferrer nofollow ugc">run tests</a>, of course ;)</li>
<li><a href="https://github.com/pcolby/dokit/blob/25f6a1f1842d86cdab4c5d163d5b63aa13eb9f15/.github/workflows/build.yaml#L227" target="_blank" rel="noopener noreferrer nofollow ugc">build an AppImage via cmake</a></li>
</ol>
<h1>macOS</h1>
<ol>
<li><a href="https://github.com/pcolby/dokit/blob/25f6a1f1842d86cdab4c5d163d5b63aa13eb9f15/src/cli/CMakeLists.txt#L50" target="_blank" rel="noopener noreferrer nofollow ugc">tell cmake to produce an <code>Info.plist</code> file</a></li>
<li><a href="https://github.com/pcolby/dokit/blob/25f6a1f1842d86cdab4c5d163d5b63aa13eb9f15/.github/workflows/build.yaml#L369" target="_blank" rel="noopener noreferrer nofollow ugc">configure and build with cmake</a></li>
<li><a href="https://github.com/pcolby/dokit/blob/25f6a1f1842d86cdab4c5d163d5b63aa13eb9f15/.github/workflows/build.yaml#L382" target="_blank" rel="noopener noreferrer nofollow ugc">run tests</a>, of course ;)</li>
<li><a href="https://github.com/pcolby/dokit/blob/25f6a1f1842d86cdab4c5d163d5b63aa13eb9f15/.github/workflows/build.yaml#L431" target="_blank" rel="noopener noreferrer nofollow ugc">use <code>macdeployqt</code> to produce a dmg</a></li>
</ol>
<h1>Windows</h1>
<ol>
<li><a href="https://github.com/pcolby/dokit/blob/25f6a1f1842d86cdab4c5d163d5b63aa13eb9f15/src/cli/CMakeLists.txt#L132" target="_blank" rel="noopener noreferrer nofollow ugc">add custom "portable" targets to <code>CMakefileLists.txt</code></a>, so cmake knows how to copy the required binaries, resources, and run <code>windeployqt</code> for my setup.</li>
<li><a href="https://github.com/pcolby/dokit/blob/25f6a1f1842d86cdab4c5d163d5b63aa13eb9f15/.github/workflows/build.yaml#L774" target="_blank" rel="noopener noreferrer nofollow ugc">configure and build with cmake</a></li>
<li><a href="https://github.com/pcolby/dokit/blob/25f6a1f1842d86cdab4c5d163d5b63aa13eb9f15/.github/workflows/build.yaml#L806" target="_blank" rel="noopener noreferrer nofollow ugc">run tests</a>, of course ;)</li>
<li><a href="https://github.com/pcolby/dokit/blob/25f6a1f1842d86cdab4c5d163d5b63aa13eb9f15/.github/workflows/build.yaml#L830" target="_blank" rel="noopener noreferrer nofollow ugc">package portable apps via cmake</a> - this step uses <code>windeployqt</code>.</li>
<li>I don't do this, but you could run Inno Setup to package the files from the portable apps in the previous step.</li>
</ol>
<p dir="auto">Of course, using Qt Install Framework would be great too, but is a very different approach - ie producing installers, as opposed to self-contains AppImage/dmg/Portable App files.  There's not right or wrong - just whatever suits your scenario/s.</p>
<p dir="auto">Cheers.</p>
]]></description><link>https://forum.qt.io/post/839425</link><guid isPermaLink="true">https://forum.qt.io/post/839425</guid><dc:creator><![CDATA[Paul Colby]]></dc:creator><pubDate>Tue, 28 Jul 2026 09:46:00 GMT</pubDate></item><item><title><![CDATA[Reply to Modern App Packaging on Tue, 28 Jul 2026 07:14:02 GMT]]></title><description><![CDATA[<p dir="auto">There is a Qt Installer Framework that could be used with all operating systems. However, I didn't figure out yet how to force running the installer as root on Linux. We actually use different ways on Windows (NSIS Installer), macOS (dmg), and Linux (Qt Installer Framework). But, for us this is done by the CI/CD and not as part of the regular build script.</p>
<p dir="auto">If you want to go with CMake, isn't there also CPack?</p>
<p dir="auto">As I'm not a CMake expert and if there is no specific way, you can certainly conditionally (dependent on the OS) execute deploy scripts.</p>
<p dir="auto">BTW, we've landed on AppImages for Linux to create portable executables. If you want I can share how the couple of steps we do. We had to use both linuxdeploy and linuxdeployqt to get it working properly with AppImages.</p>
]]></description><link>https://forum.qt.io/post/839422</link><guid isPermaLink="true">https://forum.qt.io/post/839422</guid><dc:creator><![CDATA[SimonSchroeder]]></dc:creator><pubDate>Tue, 28 Jul 2026 07:14:02 GMT</pubDate></item><item><title><![CDATA[Reply to Modern App Packaging on Mon, 27 Jul 2026 18:22:25 GMT]]></title><description><![CDATA[<p dir="auto">Hi and welcome to devnet,</p>
<p dir="auto">Might be a silly question but did you read through the <a href="https://doc.qt.io/qt-6/windows-deployment.html" target="_blank" rel="noopener noreferrer nofollow ugc">windeployqt</a> and <a href="https://doc.qt.io/qt-6/macos-deployment.html" target="_blank" rel="noopener noreferrer nofollow ugc">macdeployqt</a> documentation ?<br />
These pages already covers quite a lot of the things you are mentioning.</p>
]]></description><link>https://forum.qt.io/post/839415</link><guid isPermaLink="true">https://forum.qt.io/post/839415</guid><dc:creator><![CDATA[SGaist]]></dc:creator><pubDate>Mon, 27 Jul 2026 18:22:25 GMT</pubDate></item></channel></rss>