Add qmake feature for advanced source distribution package generation Author: Peter Seiderer (for http://www.ciselant.de) Date: 3 March 2012 A. Rational On Unix systems qmake generated Makefiles have a 'dist' target which should pack all relevant source, header, project files into an compressed tar file. Extra files can be included with the variable 'DISTFILES' in the project file . This feature seems to be without active development and there are several bugs and deficients (Qt-4.7.4/QMake-2.01a): - The distribution file is named after the given 'TARGET' name in the project file. If the target 'TARGET=mytarget' is given in an application project file after 'make dist' all files are packed into 'mytarget1.0.0.tar.gz' distribution file. One would expect (as autoconf/automake projects do) the filename and path to be 'mytarget-1.0.0.tar.gz' - There are several additional .conf/.prf files packed into the 'mytarget1.0.0.tar.gz' tar file : $ tar -tvzf mytarget1.0.0.tar.gz mytarget1.0.0/usr/share/qt4/mkspecs/common/linux.conf mytarget1.0.0/usr/share/qt4/mkspecs/common/unix.conf mytarget1.0.0/usr/share/qt4/mkspecs/common/g++.conf mytarget1.0.0/usr/share/qt4/mkspecs/features/qt_config.prf mytarget1.0.0/usr/share/qt4/mkspecs/features/default_post.prf mytarget1.0.0/usr/share/qt4/mkspecs/features/qt_functions.prf mytarget1.0.0/usr/share/qt4/mkspecs/features/exclusive_builds.prf mytarget1.0.0/usr/share/qt4/mkspecs/features/qt.prf mytarget1.0.0/usr/share/qt4/mkspecs/features/unix/thread.prf mytarget1.0.0/usr/share/qt4/mkspecs/features/release.prf mytarget1.0.0/usr/share/qt4/mkspecs/features/default_pre.prf mytarget1.0.0/usr/share/qt4/mkspecs/features/moc.prf mytarget1.0.0/usr/share/qt4/mkspecs/features/include_source_dir.prf mytarget1.0.0/usr/share/qt4/mkspecs/qconfig.pri mytarget1.0.0/pro1.h mytarget1.0.0/pro1.cpp mytarget1.0.0/pro1.pro The last three are the (minimal) example project files. - The 'dist' target is only provided for 'app', 'lib' and 'aux' qmake templates, no support for the 'subdirs' template . There exists already a patch , but this is not yet on the mainline (Qt-4.8.0). B. The edist (extended dist) feature Put the downloaded edist.prf file into your project root directory (or somewhere else into the feature/spec search path of qmake, as described in ). Add 'CONFIG += edist' to all your project files. Now generate the Unix Makefiles with 'QMAKEFEATURES=`pwd` qmake -recursive' (see D.) and test the source distribution package generation with 'make edist'. There should be the generated '
- .tar.gz' file in your project directory. C. Run the example $ wget http://www.ciselant.de/projects/qt-edist/qt-edist-1.0.0.tar.gz $ tar -tvzf qt_example-1.0.0.tgz $ cd qt_example-1.0.0 $ QMAKEFEATURES=`pwd` qmake -recursive $ make edist $ tar -tvzf qt_example-1.0.0.tgz D. Why a simple qmake is not enough As described in , the project's root directory should be included in the qmake configuration/feature search path. So a simple 'qmake' should be enough. But there seems to be a bug in the current qmake implementation (Qt-4.7.4/Qt-4.8.0, QMake-2.01a). To work around this the project root/current path is added to 'QMAKEFEATURES' environment variable and the '-recursive' option is given to qmake, so all Makefiles in the project subdirectories are generated. Without this workaround the edist.prf feature file is not found by qmake: $ cd qt_example-1.0.0 $ strace -f qmake 2>& | grep edist.prf stat("/edist.prf", 0x96d8c8) = -1 ENOENT (No such file or directory) stat("/usr/share/qt4//mkspecs/default/features/edist.prf", 0x96d8c8) = -1 ENOENT (No such file or directory) stat("/usr/share/qt4/mkspecs/features/unix/edist.prf", 0x961fe8) = -1 ENOENT (No such file or directory) stat("/usr/share/qt4/mkspecs/features/edist.prf", 0x961fe8) = -1 ENOENT (No such file or directory) stat("/usr/mkspecs/features/unix/edist.prf", 0x961fe8) = -1 ENOENT (No such file or directory) stat("/usr/mkspecs/features/edist.prf", 0x961fe8) = -1 ENOENT (No such file or directory) stat("/usr/share/qt4//mkspecs/features/unix/edist.prf", 0x961fe8) = -1 ENOENT (No such file or directory) stat("/usr/share/qt4//mkspecs/features/edist.prf", 0x961fe8) = -1 ENOENT (No such file or directory) E. References  http://qt-project.org/doc/qt-4.8/qmake-variable-reference.html#distfiles  https://qt.gitorious.org/qt/qt/merge_requests/1048  https://bugreports.qt-project.org/browse/QTBUG-3124  https://bugreports.qt-project.org/browse/QTBUG-21910  http://qt.gitorious.org/~jpnurmi/qt/jpnurmi-qt/commit/8c4ef198d88ceceb7b94526c1602ffff66225ae0  http://qt-project.org/doc/qt-4.8/qmake-advanced-usage.html#adding-new-configuration-features
<< back to projects page