This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "CMake".
The branch, next has been updated via 25b5e76e15b3b5fe6e0aacd5345ecd1f3d360e5b (commit) via b393e63bc9b98b429dc1bbaf21a4e2d481dfec4b (commit) via 331eb74b795cae914ec88e58f2c0bec69c17a853 (commit) via cbc07d331d1d5429dc1e0b7c6c7949ff8d9efdf1 (commit) via c17e0a3ad58f06fcb0827910af520405670b3d51 (commit) via 53787bf8de2d3981f650e9036bb89cb6ed884a75 (commit) via 8dbdd3e726ead25c179e6eb4ffab212a1db3aba8 (commit) via 0699760d5c8b644242ddd4ac6d07d8c4c68f2b94 (commit) via a84f0bb726ebcc8e9bf3db0b99e5b6fd8a720045 (commit) via 7b766b83952ec4c431a55d2f6e589a5f806834c9 (commit) via 2964b8cca4155fa318722f6ef17f0d4d56ee2f29 (commit) via d58b6bf31c18cfedd4a2f15e009b8e5cbdc21b6e (commit) via 94c319f93309ff4cddd0280cdcbd48b50492db36 (commit) via 966be439e07131c3ff84175c1a9e3b6336908d8e (commit) via de531432887487943dbe4ae5a1bde762d5582e06 (commit) via d8e45536fb3637454cf17a638dcd9fc236e94660 (commit) via d9313a82906ced0ff3c76828e86d9d7a248a5e49 (commit) via 32d3540e090c4a24d55b99c49c094a9cb574c9b3 (commit) via e7280a7f1743d73cdab41ed709a9e1d0f99b6342 (commit) via 63d3ca4c1cab0c7b9c71d6c051c3b4c053eb7627 (commit) via 6ae19bf32e232beb59a0c427d82c0761e8248ab8 (commit) via 9986da4f0f2f49c0d7d260f9d21deaa906708376 (commit) via d51cc88e844c78c01c1616e6a2fb102c0682dd00 (commit) via cf1d5a9cdba49a2e9f08879d756ae118b22bfc6a (commit) via f962275987e17cf94da663a919f52b6d0c8f44f4 (commit) via c736c41ad192c89e1c74751a8f401c75955f5f3b (commit) via cbd650c2642e40369eaa53d20dafee6cdccae4af (commit) via 0b1527ff3d1781380756ee72a9641b7c5c7c87cc (commit) via 2b9d795e63acf723a6abd79f3195ec70476442a5 (commit) via 2cfcdf757d032cdea8b980792007a6f9d749e6fb (commit) via 2f67aef23d4192fadb222dc79311fb5ffbbc36ce (commit) via 794fdf40a1bc85dded519d7c737f73690e3a6e42 (commit) via a1e49bb155132606ed9f590c0b62e68f2e288d0b (commit) from b526e70725cc58b1bc51c0d5c4f3f9c00a908387 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=25b5e76e15b3b5fe6e0aacd5345ecd1f3d360e5b commit 25b5e76e15b3b5fe6e0aacd5345ecd1f3d360e5b Merge: b526e70 b393e63 Author: Brad King <brad.k...@kitware.com> AuthorDate: Tue Jan 10 14:32:45 2017 -0500 Commit: CMake Topic Stage <kwro...@kitware.com> CommitDate: Tue Jan 10 14:32:45 2017 -0500 Merge topic 'Autogen_Simplify' into next b393e63b AUTOGEN: Release notes for SKIP_AUTOX 331eb74b AUTOGEN: Documentation update: cmake-qt, AUTOMOC, AUTOUIC, AUTORCC cbc07d33 AUTOGEN: Documentation for SKIP_AUTOX source file properties c17e0a3a AUTOGEN: Tests: AUTORCC SKIP_AUTORCC and SKIP_AUTOGEN test 53787bf8 AUTOGEN: Tests: AUTOUIC SKIP_AUTOUIC and SKIP_AUTOGEN test 8dbdd3e7 AUTOGEN: Tests: AUTOMOC SKIP_AUTOMOC and SKIP_AUTOGEN test 0699760d AUTOGEN: Generators: Do moc/uic skip test during file list generation a84f0bb7 AUTOGEN: Generators: Message upper/lower case unification 7b766b83 AUTOGEN: Generators: Use single moc/uic skip test method only 2964b8cc AUTOGEN: Generators: Use AUTOMOC/UIC/RCC instead of AUTOGEN in messages d58b6bf3 AUTOGEN: Generators: Moc/UicSkipTest methods 94c319f9 AUTOGEN: Generators: Use separate header lists for MOC and UIC 966be439 AUTOGEN: Generators: Be verbose about skipping files de531432 AUTOGEN: Generators: Remove unused variable d8e45536 AUTOGEN: Initializer: Always remember skipped files d9313a82 AUTOGEN: Initializer: Enable SKIP_AUTOGEN on all AUTOGEN generated sources ... https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=b393e63bc9b98b429dc1bbaf21a4e2d481dfec4b commit b393e63bc9b98b429dc1bbaf21a4e2d481dfec4b Author: Sebastian Holtermann <sebh...@xwmw.org> AuthorDate: Mon Jan 2 18:02:53 2017 +0100 Commit: Sebastian Holtermann <sebh...@xwmw.org> CommitDate: Tue Jan 10 12:49:17 2017 +0100 AUTOGEN: Release notes for SKIP_AUTOX diff --git a/Help/release/dev/QtAutogen_Skip.rst b/Help/release/dev/QtAutogen_Skip.rst new file mode 100644 index 0000000..37f795c --- /dev/null +++ b/Help/release/dev/QtAutogen_Skip.rst @@ -0,0 +1,12 @@ +QtAutogen_Skip +-------------- + +* The source file properties + :prop_sf:`SKIP_AUTOMOC`, + :prop_sf:`SKIP_AUTOUIC`, + :prop_sf:`SKIP_AUTORCC` and + :prop_sf:`SKIP_AUTOGEN` + allow to exclude files from + :prop_tgt:`AUTOMOC`, + :prop_tgt:`AUTOUIC` and + :prop_tgt:`AUTORCC` processing. https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=331eb74b795cae914ec88e58f2c0bec69c17a853 commit 331eb74b795cae914ec88e58f2c0bec69c17a853 Author: Sebastian Holtermann <sebh...@xwmw.org> AuthorDate: Mon Jan 2 17:45:17 2017 +0100 Commit: Sebastian Holtermann <sebh...@xwmw.org> CommitDate: Tue Jan 10 12:49:17 2017 +0100 AUTOGEN: Documentation update: cmake-qt, AUTOMOC, AUTOUIC, AUTORCC diff --git a/Help/manual/cmake-qt.7.rst b/Help/manual/cmake-qt.7.rst index 80b0f49..c348f3f 100644 --- a/Help/manual/cmake-qt.7.rst +++ b/Help/manual/cmake-qt.7.rst @@ -83,6 +83,9 @@ following targets by setting the :variable:`CMAKE_AUTOMOC` variable. The options to pass to ``moc``. The :variable:`CMAKE_AUTOMOC_MOC_OPTIONS` variable may be populated to pre-set the options for all following targets. +Source C++ files can be excluded from :prop_tgt:`AUTOMOC` processing by +enabling :prop_sf:`SKIP_AUTOMOC` or the broader :prop_sf:`SKIP_AUTOGEN`. + .. _`Qt AUTOUIC`: AUTOUIC @@ -151,6 +154,9 @@ result of linking with the :prop_tgt:`IMPORTED` target: .. _`Qt AUTORCC`: +Source files can be excluded from :prop_tgt:`AUTOUIC` processing by +enabling :prop_sf:`SKIP_AUTOUIC` or the broader :prop_sf:`SKIP_AUTOGEN`. + AUTORCC ^^^^^^^ @@ -171,6 +177,9 @@ populated to pre-set the options for all following targets. The ``<name>.qrc`` file to set particular options for the file. This overrides options from the :prop_tgt:`AUTORCC_OPTIONS` target property. +Source files can be excluded from :prop_tgt:`AUTORCC` processing by +enabling :prop_sf:`SKIP_AUTORCC` or the broader :prop_sf:`SKIP_AUTOGEN`. + qtmain.lib on Windows ===================== diff --git a/Help/prop_tgt/AUTOMOC.rst b/Help/prop_tgt/AUTOMOC.rst index 30a39b1..b42643f 100644 --- a/Help/prop_tgt/AUTOMOC.rst +++ b/Help/prop_tgt/AUTOMOC.rst @@ -47,5 +47,8 @@ See the documentation for this variable for more details. The global property :prop_gbl:`AUTOGEN_TARGETS_FOLDER` can be used to group the automoc targets together in an IDE, e.g. in MSVS. +Source C++ files can be excluded from :prop_tgt:`AUTOMOC` processing by +enabling :prop_sf:`SKIP_AUTOMOC` or the broader :prop_sf:`SKIP_AUTOGEN`. + See the :manual:`cmake-qt(7)` manual for more information on using CMake with Qt. diff --git a/Help/prop_tgt/AUTORCC.rst b/Help/prop_tgt/AUTORCC.rst index 158fdf8..1ad0895 100644 --- a/Help/prop_tgt/AUTORCC.rst +++ b/Help/prop_tgt/AUTORCC.rst @@ -24,5 +24,8 @@ generate unspecified unique names for ``rcc``. Therefore if ``Q_INIT_RESOURCE()`` or ``Q_CLEANUP_RESOURCE()`` need to be used the ``.qrc`` file name must be unique. +Source files can be excluded from :prop_tgt:`AUTORCC` processing by +enabling :prop_sf:`SKIP_AUTORCC` or the broader :prop_sf:`SKIP_AUTOGEN`. + See the :manual:`cmake-qt(7)` manual for more information on using CMake with Qt. diff --git a/Help/prop_tgt/AUTOUIC.rst b/Help/prop_tgt/AUTOUIC.rst index 4e60ec3..fbf24c3 100644 --- a/Help/prop_tgt/AUTOUIC.rst +++ b/Help/prop_tgt/AUTOUIC.rst @@ -20,5 +20,8 @@ Additional command line options for ``uic`` can be set via the The global property :prop_gbl:`AUTOGEN_TARGETS_FOLDER` can be used to group the autouic targets together in an IDE, e.g. in MSVS. +Source files can be excluded from :prop_tgt:`AUTOUIC` processing by +enabling :prop_sf:`SKIP_AUTOUIC` or the broader :prop_sf:`SKIP_AUTOGEN`. + See the :manual:`cmake-qt(7)` manual for more information on using CMake with Qt. https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=cbc07d331d1d5429dc1e0b7c6c7949ff8d9efdf1 commit cbc07d331d1d5429dc1e0b7c6c7949ff8d9efdf1 Author: Sebastian Holtermann <sebh...@xwmw.org> AuthorDate: Mon Jan 2 17:28:36 2017 +0100 Commit: Sebastian Holtermann <sebh...@xwmw.org> CommitDate: Tue Jan 10 12:49:17 2017 +0100 AUTOGEN: Documentation for SKIP_AUTOX source file properties diff --git a/Help/manual/cmake-properties.7.rst b/Help/manual/cmake-properties.7.rst index 971834e..c93ace1 100644 --- a/Help/manual/cmake-properties.7.rst +++ b/Help/manual/cmake-properties.7.rst @@ -357,6 +357,10 @@ Properties on Source Files /prop_sf/MACOSX_PACKAGE_LOCATION /prop_sf/OBJECT_DEPENDS /prop_sf/OBJECT_OUTPUTS + /prop_sf/SKIP_AUTOGEN + /prop_sf/SKIP_AUTOMOC + /prop_sf/SKIP_AUTORCC + /prop_sf/SKIP_AUTOUIC /prop_sf/SYMBOLIC /prop_sf/VS_DEPLOYMENT_CONTENT /prop_sf/VS_DEPLOYMENT_LOCATION diff --git a/Help/prop_sf/SKIP_AUTOGEN.rst b/Help/prop_sf/SKIP_AUTOGEN.rst new file mode 100644 index 0000000..6bf2409 --- /dev/null +++ b/Help/prop_sf/SKIP_AUTOGEN.rst @@ -0,0 +1,8 @@ +SKIP_AUTOGEN +------------ + +Exclude the source file from :prop_tgt:`AUTOMOC`, :prop_tgt:`AUTOUIC` and +:prop_tgt:`AUTORCC` processing (for Qt projects). + +For finer control see :prop_sf:`SKIP_AUTOMOC`, :prop_sf:`SKIP_AUTOUIC` and +:prop_sf:`SKIP_AUTORCC`. diff --git a/Help/prop_sf/SKIP_AUTOMOC.rst b/Help/prop_sf/SKIP_AUTOMOC.rst new file mode 100644 index 0000000..2245ca6 --- /dev/null +++ b/Help/prop_sf/SKIP_AUTOMOC.rst @@ -0,0 +1,6 @@ +SKIP_AUTOMOC +------------ + +Exclude the source file from :prop_tgt:`AUTOMOC` processing (for Qt projects). + +For broader control see :prop_sf:`SKIP_AUTOGEN` diff --git a/Help/prop_sf/SKIP_AUTORCC.rst b/Help/prop_sf/SKIP_AUTORCC.rst new file mode 100644 index 0000000..394d8f8 --- /dev/null +++ b/Help/prop_sf/SKIP_AUTORCC.rst @@ -0,0 +1,6 @@ +SKIP_AUTORCC +------------ + +Exclude the source file from :prop_tgt:`AUTORCC` processing (for Qt projects). + +For broader control see :prop_sf:`SKIP_AUTOGEN` diff --git a/Help/prop_sf/SKIP_AUTOUIC.rst b/Help/prop_sf/SKIP_AUTOUIC.rst new file mode 100644 index 0000000..50f78ef --- /dev/null +++ b/Help/prop_sf/SKIP_AUTOUIC.rst @@ -0,0 +1,6 @@ +SKIP_AUTOUIC +------------ + +Exclude the source file from :prop_tgt:`AUTOUIC` processing (for Qt projects). + +For broader control see :prop_sf:`SKIP_AUTOGEN` https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=c17e0a3ad58f06fcb0827910af520405670b3d51 commit c17e0a3ad58f06fcb0827910af520405670b3d51 Author: Sebastian Holtermann <sebh...@xwmw.org> AuthorDate: Sun Jan 1 16:45:40 2017 +0100 Commit: Sebastian Holtermann <sebh...@xwmw.org> CommitDate: Tue Jan 10 12:49:17 2017 +0100 AUTOGEN: Tests: AUTORCC SKIP_AUTORCC and SKIP_AUTOGEN test diff --git a/Tests/QtAutogen/CMakeLists.txt b/Tests/QtAutogen/CMakeLists.txt index 045f5b9..4b90ad8 100644 --- a/Tests/QtAutogen/CMakeLists.txt +++ b/Tests/QtAutogen/CMakeLists.txt @@ -181,6 +181,27 @@ set_property(TARGET skipUicB PROPERTY AUTOUIC ON) set_property(TARGET skipUicB PROPERTY AUTOMOC ON) target_link_libraries(skipUicB ${QT_LIBRARIES}) +# -- Test: AUTORCC, SKIP_AUTORCC +# Test for SKIP_AUTORCC and SKIP_AUTOGEN on an AUTORCC enabled target +set(skipRccSources + skipRcc.cpp + skipSource/skipRccBad1.qrc + skipSource/skipRccBad2.qrc + skipSource/skipRccGood.qrc +) +set_property(SOURCE skipSource/skipRccBad1.qrc PROPERTY SKIP_AUTORCC ON) +set_property(SOURCE skipSource/skipRccBad2.qrc PROPERTY SKIP_AUTOGEN ON) +# AUTORCC enabled +add_executable(skipRccA ${skipRccSources}) +set_property(TARGET skipRccA PROPERTY AUTORCC ON) +target_link_libraries(skipRccA ${QT_LIBRARIES}) +# AUTORCC, AUTOUIC and AUTOMOC enabled +add_executable(skipRccB ${skipRccSources}) +set_property(TARGET skipRccB PROPERTY AUTORCC ON) +set_property(TARGET skipRccB PROPERTY AUTOUIC ON) +set_property(TARGET skipRccB PROPERTY AUTOMOC ON) +target_link_libraries(skipRccB ${QT_LIBRARIES}) + # -- Test: AUTOMOC AUTORCC # Source files with the same basename in different subdirectories add_subdirectory(sameName) diff --git a/Tests/QtAutogen/skipRcc.cpp b/Tests/QtAutogen/skipRcc.cpp new file mode 100644 index 0000000..ec57110 --- /dev/null +++ b/Tests/QtAutogen/skipRcc.cpp @@ -0,0 +1,9 @@ + +extern int qInitResources_skipRccGood(); + +int main(int, char**) +{ + // Fails to link if the symbol is not present. + qInitResources_skipRccGood(); + return 0; +} diff --git a/Tests/QtAutogen/skipSource/skipRccBad1.qrc b/Tests/QtAutogen/skipSource/skipRccBad1.qrc new file mode 100644 index 0000000..6cbd9ed --- /dev/null +++ b/Tests/QtAutogen/skipSource/skipRccBad1.qrc @@ -0,0 +1,5 @@ +<!DOCTYPE RCC><RCC version="1.0"> +<qresource> + <file>skipRccGood.cpp</file>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +</qresource> +</RCC> diff --git a/Tests/QtAutogen/skipSource/skipRccBad2.qrc b/Tests/QtAutogen/skipSource/skipRccBad2.qrc new file mode 100644 index 0000000..b32c589 --- /dev/null +++ b/Tests/QtAutogen/skipSource/skipRccBad2.qrc @@ -0,0 +1,5 @@ +<!DOCTYPE RCC><RCC version="1.0">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>< +<qresource> + <file>skipRccGood.cpp</file> +</qresource> +</RCC> diff --git a/Tests/QtAutogen/skipSource/skipRccGood.qrc b/Tests/QtAutogen/skipSource/skipRccGood.qrc new file mode 100644 index 0000000..21a94b0 --- /dev/null +++ b/Tests/QtAutogen/skipSource/skipRccGood.qrc @@ -0,0 +1,6 @@ +<!DOCTYPE RCC><RCC version="1.0"> +<qresource> + <file>skipRccBad1.qrc</file> + <file>skipRccBad2.qrc</file> +</qresource> +</RCC> https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=53787bf8de2d3981f650e9036bb89cb6ed884a75 commit 53787bf8de2d3981f650e9036bb89cb6ed884a75 Author: Sebastian Holtermann <sebh...@xwmw.org> AuthorDate: Sun Jan 1 15:42:32 2017 +0100 Commit: Sebastian Holtermann <sebh...@xwmw.org> CommitDate: Tue Jan 10 12:49:16 2017 +0100 AUTOGEN: Tests: AUTOUIC SKIP_AUTOUIC and SKIP_AUTOGEN test diff --git a/Tests/QtAutogen/CMakeLists.txt b/Tests/QtAutogen/CMakeLists.txt index 068b037..045f5b9 100644 --- a/Tests/QtAutogen/CMakeLists.txt +++ b/Tests/QtAutogen/CMakeLists.txt @@ -161,6 +161,26 @@ set_property(TARGET skipMocB PROPERTY AUTOMOC ON) set_property(TARGET skipMocB PROPERTY AUTOUIC ON) target_link_libraries(skipMocB ${QT_LIBRARIES}) +# -- Test: AUTOUIC, SKIP_AUTOUIC +# Test for SKIP_AUTOUIC and SKIP_AUTOGEN on an AUTOUIC enabled target +set(skipUicSources + skipUic.cpp + skipSource/skipUicGen.cpp + skipSource/skipUicNoGen1.cpp + skipSource/skipUicNoGen2.cpp +) +set_property(SOURCE skipSource/skipUicNoGen1.cpp PROPERTY SKIP_AUTOUIC ON) +set_property(SOURCE skipSource/skipUicNoGen2.cpp PROPERTY SKIP_AUTOGEN ON) +# AUTOUIC enabled +add_executable(skipUicA ${skipUicSources}) +set_property(TARGET skipUicA PROPERTY AUTOUIC ON) +target_link_libraries(skipUicA ${QT_LIBRARIES}) +# AUTOUIC and AUTOMOC enabled +add_executable(skipUicB ${skipUicSources}) +set_property(TARGET skipUicB PROPERTY AUTOUIC ON) +set_property(TARGET skipUicB PROPERTY AUTOMOC ON) +target_link_libraries(skipUicB ${QT_LIBRARIES}) + # -- Test: AUTOMOC AUTORCC # Source files with the same basename in different subdirectories add_subdirectory(sameName) diff --git a/Tests/QtAutogen/skipSource/skipUicGen.cpp b/Tests/QtAutogen/skipSource/skipUicGen.cpp new file mode 100644 index 0000000..d2a55a6 --- /dev/null +++ b/Tests/QtAutogen/skipSource/skipUicGen.cpp @@ -0,0 +1,7 @@ + +#include "skipUicGen.hpp" +#include "ui_uigen2.h" + +void skipGen() +{ +} diff --git a/Tests/QtAutogen/skipSource/skipUicGen.hpp b/Tests/QtAutogen/skipSource/skipUicGen.hpp new file mode 100644 index 0000000..3669f0e --- /dev/null +++ b/Tests/QtAutogen/skipSource/skipUicGen.hpp @@ -0,0 +1,8 @@ +#ifndef SKIPUICGEN_HPP +#define SKIPUICGEN_HPP + +#include "ui_uigen1.h" + +void skipGen(); + +#endif diff --git a/Tests/QtAutogen/skipSource/skipUicNoGen1.cpp b/Tests/QtAutogen/skipSource/skipUicNoGen1.cpp new file mode 100644 index 0000000..f591a42 --- /dev/null +++ b/Tests/QtAutogen/skipSource/skipUicNoGen1.cpp @@ -0,0 +1,7 @@ + +#include "skipUicNoGen1.hpp" +#include "ui_nogen2.h" + +void skipNoGen1() +{ +} diff --git a/Tests/QtAutogen/skipSource/skipUicNoGen1.hpp b/Tests/QtAutogen/skipSource/skipUicNoGen1.hpp new file mode 100644 index 0000000..2864695 --- /dev/null +++ b/Tests/QtAutogen/skipSource/skipUicNoGen1.hpp @@ -0,0 +1,8 @@ +#ifndef SKIPUICNOGEN1_H +#define SKIPUICNOGEN1_H + +#include "ui_nogen1.h" + +void skipNoGen1(); + +#endif diff --git a/Tests/QtAutogen/skipSource/skipUicNoGen2.cpp b/Tests/QtAutogen/skipSource/skipUicNoGen2.cpp new file mode 100644 index 0000000..8c1c324 --- /dev/null +++ b/Tests/QtAutogen/skipSource/skipUicNoGen2.cpp @@ -0,0 +1,7 @@ + +#include "skipUicNoGen2.hpp" +#include "ui_nogen2.h" + +void skipNoGen2() +{ +} diff --git a/Tests/QtAutogen/skipSource/skipUicNoGen2.hpp b/Tests/QtAutogen/skipSource/skipUicNoGen2.hpp new file mode 100644 index 0000000..7c38193 --- /dev/null +++ b/Tests/QtAutogen/skipSource/skipUicNoGen2.hpp @@ -0,0 +1,8 @@ +#ifndef SKIPUICNOGEN2_H +#define SKIPUICNOGEN2_H + +#include "ui_nogen1.h" + +void skipNoGen2(); + +#endif diff --git a/Tests/QtAutogen/skipSource/ui_nogen1.h b/Tests/QtAutogen/skipSource/ui_nogen1.h new file mode 100644 index 0000000..a7be52b --- /dev/null +++ b/Tests/QtAutogen/skipSource/ui_nogen1.h @@ -0,0 +1,6 @@ +#ifndef UI_NOGEN1_H +#define UI_NOGEN1_H + +void ui_nogen1(); + +#endif diff --git a/Tests/QtAutogen/skipSource/ui_nogen2.h b/Tests/QtAutogen/skipSource/ui_nogen2.h new file mode 100644 index 0000000..5d547d4 --- /dev/null +++ b/Tests/QtAutogen/skipSource/ui_nogen2.h @@ -0,0 +1,6 @@ +#ifndef UI_NOGEN2_H +#define UI_NOGEN2_H + +void ui_nogen2(); + +#endif \ No newline at end of file diff --git a/Tests/QtAutogen/skipSource/uigen1.ui b/Tests/QtAutogen/skipSource/uigen1.ui new file mode 100644 index 0000000..fc7cb82 --- /dev/null +++ b/Tests/QtAutogen/skipSource/uigen1.ui @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>UiGen1</class> + <widget class="QWidget" name="UiGen1"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>400</width> + <height>300</height> + </rect> + </property> + <property name="windowTitle"> + <string>Form</string> + </property> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QTreeView" name="treeView"/> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui> diff --git a/Tests/QtAutogen/skipSource/uigen2.ui b/Tests/QtAutogen/skipSource/uigen2.ui new file mode 100644 index 0000000..01f08d2 --- /dev/null +++ b/Tests/QtAutogen/skipSource/uigen2.ui @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>UiGen2</class> + <widget class="QWidget" name="UiGen2"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>400</width> + <height>300</height> + </rect> + </property> + <property name="windowTitle"> + <string>Form</string> + </property> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QTreeView" name="treeView"/> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui> diff --git a/Tests/QtAutogen/skipUic.cpp b/Tests/QtAutogen/skipUic.cpp new file mode 100644 index 0000000..0adf011 --- /dev/null +++ b/Tests/QtAutogen/skipUic.cpp @@ -0,0 +1,22 @@ + +#include "skipSource/skipUicGen.hpp" +#include "skipSource/skipUicNoGen1.hpp" +#include "skipSource/skipUicNoGen2.hpp" + +int main(int, char**) +{ + skipGen(); + skipNoGen1(); + skipNoGen2(); + + return 0; +} + +// -- Function definitions +void ui_nogen1() +{ +} + +void ui_nogen2() +{ +} https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=8dbdd3e726ead25c179e6eb4ffab212a1db3aba8 commit 8dbdd3e726ead25c179e6eb4ffab212a1db3aba8 Author: Sebastian Holtermann <sebh...@xwmw.org> AuthorDate: Sat Dec 31 10:25:38 2016 +0100 Commit: Sebastian Holtermann <sebh...@xwmw.org> CommitDate: Tue Jan 10 12:49:16 2017 +0100 AUTOGEN: Tests: AUTOMOC SKIP_AUTOMOC and SKIP_AUTOGEN test diff --git a/Tests/QtAutogen/CMakeLists.txt b/Tests/QtAutogen/CMakeLists.txt index 6d4e2c4..068b037 100644 --- a/Tests/QtAutogen/CMakeLists.txt +++ b/Tests/QtAutogen/CMakeLists.txt @@ -139,6 +139,28 @@ if (automoc_rerun_result) message(SEND_ERROR "Second build of automoc_rerun failed.") endif() +# -- Test: AUTOMOC, SKIP_AUTOMOC +# Test for SKIP_AUTOMOC and SKIP_AUTOGEN on an AUTOMOC enabled target +qtx_wrap_cpp(skipMocWrapMoc + skipSource/qItemA.hpp + skipSource/qItemB.hpp) +set(skipMocSources + skipMoc.cpp + skipSource/qItemA.cpp + skipSource/qItemB.cpp + skipSource/qItemC.cpp) +set_property(SOURCE skipSource/qItemA.cpp PROPERTY SKIP_AUTOMOC ON) +set_property(SOURCE skipSource/qItemB.cpp PROPERTY SKIP_AUTOGEN ON) +# AUTOMOC enabled only +add_executable(skipMocA ${skipMocSources} ${skipMocWrapMoc}) +set_property(TARGET skipMocA PROPERTY AUTOMOC ON) +target_link_libraries(skipMocA ${QT_LIBRARIES}) +# AUTOMOC and AUTOUIC enabled +add_executable(skipMocB ${skipMocSources} ${skipMocWrapMoc}) +set_property(TARGET skipMocB PROPERTY AUTOMOC ON) +set_property(TARGET skipMocB PROPERTY AUTOUIC ON) +target_link_libraries(skipMocB ${QT_LIBRARIES}) + # -- Test: AUTOMOC AUTORCC # Source files with the same basename in different subdirectories add_subdirectory(sameName) diff --git a/Tests/QtAutogen/skipMoc.cpp b/Tests/QtAutogen/skipMoc.cpp new file mode 100644 index 0000000..85305f5 --- /dev/null +++ b/Tests/QtAutogen/skipMoc.cpp @@ -0,0 +1,14 @@ + +#include "skipSource/qItemA.hpp" +#include "skipSource/qItemB.hpp" +#include "skipSource/qItemC.hpp" + +int main(int, char**) +{ + QItemA itemA; + QItemA itemB; + QItemA itemC; + + // Fails to link if the symbol is not present. + return 0; +} diff --git a/Tests/QtAutogen/skipSource/qItemA.cpp b/Tests/QtAutogen/skipSource/qItemA.cpp new file mode 100644 index 0000000..522c2c7 --- /dev/null +++ b/Tests/QtAutogen/skipSource/qItemA.cpp @@ -0,0 +1,5 @@ +#include "qItemA.hpp" + +void QItemA::go() +{ +} diff --git a/Tests/QtAutogen/skipSource/qItemA.hpp b/Tests/QtAutogen/skipSource/qItemA.hpp new file mode 100644 index 0000000..d295faf --- /dev/null +++ b/Tests/QtAutogen/skipSource/qItemA.hpp @@ -0,0 +1,13 @@ +#ifndef QITEMA_HPP +#define QITEMA_HPP + +#include <QObject> + +class QItemA : public QObject +{ + Q_OBJECT + Q_SLOT + void go(); +}; + +#endif diff --git a/Tests/QtAutogen/skipSource/qItemB.cpp b/Tests/QtAutogen/skipSource/qItemB.cpp new file mode 100644 index 0000000..636e15d --- /dev/null +++ b/Tests/QtAutogen/skipSource/qItemB.cpp @@ -0,0 +1,5 @@ +#include "qItemB.hpp" + +void QItemB::go() +{ +} diff --git a/Tests/QtAutogen/skipSource/qItemB.hpp b/Tests/QtAutogen/skipSource/qItemB.hpp new file mode 100644 index 0000000..1775915 --- /dev/null +++ b/Tests/QtAutogen/skipSource/qItemB.hpp @@ -0,0 +1,13 @@ +#ifndef QITEMB_HPP +#define QITEMB_HPP + +#include <QObject> + +class QItemB : public QObject +{ + Q_OBJECT + Q_SLOT + void go(); +}; + +#endif diff --git a/Tests/QtAutogen/skipSource/qItemC.cpp b/Tests/QtAutogen/skipSource/qItemC.cpp new file mode 100644 index 0000000..700abd6 --- /dev/null +++ b/Tests/QtAutogen/skipSource/qItemC.cpp @@ -0,0 +1,5 @@ +#include "qItemC.hpp" + +void QItemC::go() +{ +} diff --git a/Tests/QtAutogen/skipSource/qItemC.hpp b/Tests/QtAutogen/skipSource/qItemC.hpp new file mode 100644 index 0000000..f06bda2 --- /dev/null +++ b/Tests/QtAutogen/skipSource/qItemC.hpp @@ -0,0 +1,13 @@ +#ifndef QITEMC_HPP +#define QITEMC_HPP + +#include <QObject> + +class QItemC : public QObject +{ + Q_OBJECT + Q_SLOT + void go(); +}; + +#endif https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=0699760d5c8b644242ddd4ac6d07d8c4c68f2b94 commit 0699760d5c8b644242ddd4ac6d07d8c4c68f2b94 Author: Sebastian Holtermann <sebh...@xwmw.org> AuthorDate: Wed Jan 4 13:32:11 2017 +0100 Commit: Sebastian Holtermann <sebh...@xwmw.org> CommitDate: Tue Jan 10 12:49:16 2017 +0100 AUTOGEN: Generators: Do moc/uic skip test during file list generation diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index 0a8c459..f5c33fe 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -534,8 +534,16 @@ bool cmQtAutoGenerators::RunAutogen(cmMakefile* makefile) } // Parse headers - headerFilesMoc.insert(this->Headers.begin(), this->Headers.end()); - headerFilesUic.insert(this->Headers.begin(), this->Headers.end()); + for (std::vector<std::string>::const_iterator it = this->Headers.begin(); + it != this->Headers.end(); ++it) { + const std::string& headerName = *it; + if (!this->MocSkipTest(headerName)) { + headerFilesMoc.insert(this->Headers.begin(), this->Headers.end()); + } + if (!this->UicSkipTest(headerName)) { + headerFilesUic.insert(this->Headers.begin(), this->Headers.end()); + } + } this->ParseHeaders(headerFilesMoc, headerFilesUic, includedMocs, notIncludedMocs, includedUis); @@ -577,10 +585,12 @@ bool cmQtAutoGenerators::ParseSourceFile( this->LogWarning(err.str()); } else { // Parse source contents for MOC - success = this->ParseContentForMoc( - absFilename, contentsString, headerExtensions, includedMocs, relaxed); + if (success && !this->MocSkipTest(absFilename)) { + success = this->ParseContentForMoc( + absFilename, contentsString, headerExtensions, includedMocs, relaxed); + } // Parse source contents for UIC - if (success) { + if (success && !this->UicSkipTest(absFilename)) { this->ParseContentForUic(absFilename, contentsString, includedUis); } } @@ -610,10 +620,6 @@ void cmQtAutoGenerators::ParseContentForUic( const std::string& absFilename, const std::string& contentsString, std::map<std::string, std::vector<std::string> >& includedUis) { - if (this->UicSkipTest(absFilename)) { - return; - } - // Process if (this->Verbose) { std::ostringstream err; @@ -644,10 +650,6 @@ bool cmQtAutoGenerators::ParseContentForMoc( const std::vector<std::string>& headerExtensions, std::map<std::string, std::string>& includedMocs, bool relaxed) { - if (this->MocSkipTest(absFilename)) { - return true; - } - // Process if (this->Verbose) { std::ostringstream err; @@ -895,8 +897,7 @@ void cmQtAutoGenerators::ParseHeaders( const std::string contents = ReadAll(headerName); // Parse header content for MOC - if (!this->MocSkipTest(headerName) && - (absHeadersMoc.find(headerName) != absHeadersMoc.end()) && + if ((absHeadersMoc.find(headerName) != absHeadersMoc.end()) && (includedMocs.find(headerName) == includedMocs.end())) { // Process if (this->Verbose) { https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=a84f0bb726ebcc8e9bf3db0b99e5b6fd8a720045 commit a84f0bb726ebcc8e9bf3db0b99e5b6fd8a720045 Author: Sebastian Holtermann <sebh...@xwmw.org> AuthorDate: Wed Jan 4 13:18:23 2017 +0100 Commit: Sebastian Holtermann <sebh...@xwmw.org> CommitDate: Tue Jan 10 12:49:16 2017 +0100 AUTOGEN: Generators: Message upper/lower case unification diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index 8fea817..0a8c459 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -198,7 +198,7 @@ bool cmQtAutoGenerators::ReadAutogenInfoFile( if (!makefile->ReadListFile(filename.c_str())) { std::ostringstream err; - err << "AUTOGEN: error processing file: " << filename << std::endl; + err << "AutoGen: error processing file: " << filename << std::endl; this->LogError(err.str()); return false; } @@ -328,7 +328,7 @@ bool cmQtAutoGenerators::ReadAutogenInfoFile( } if (this->RccSources.size() != rccInputLists.size()) { std::ostringstream err; - err << "AUTOGEN: RCC sources lists size missmatch in: " << filename; + err << "AutoGen: RCC sources lists size missmatch in: " << filename; err << std::endl; this->LogError(err.str()); return false; @@ -572,7 +572,7 @@ bool cmQtAutoGenerators::ParseSourceFile( const std::string contentsString = ReadAll(absFilename); if (contentsString.empty()) { std::ostringstream err; - err << "AUTOGEN: warning: " << absFilename << "\n" + err << "AutoGen: Warning: " << absFilename << "\n" << "The file is empty\n"; this->LogWarning(err.str()); } else { @@ -617,7 +617,7 @@ void cmQtAutoGenerators::ParseContentForUic( // Process if (this->Verbose) { std::ostringstream err; - err << "AUTOUIC: Checking " << absFilename << "\n"; + err << "AutoUic: Checking " << absFilename << "\n"; this->LogInfo(err.str()); } @@ -651,7 +651,7 @@ bool cmQtAutoGenerators::ParseContentForMoc( // Process if (this->Verbose) { std::ostringstream err; - err << "AUTOMOC: Checking " << absFilename << "\n"; + err << "AutoMoc: Checking " << absFilename << "\n"; this->LogInfo(err.str()); } @@ -705,7 +705,7 @@ bool cmQtAutoGenerators::ParseContentForMoc( } } else { std::ostringstream err; - err << "AUTOMOC: error: " << absFilename << "\n" + err << "AutoMoc: Error: " << absFilename << "\n" << "The file includes the moc file \"" << currentMoc << "\", but could not find header \"" << basename << '{' << this->JoinExts(headerExtensions) << "}\" "; @@ -733,7 +733,7 @@ bool cmQtAutoGenerators::ParseContentForMoc( fileToMoc = headerToMoc; if (!requiresMoc && basename == scannedFileBasename) { std::ostringstream err; - err << "AUTOMOC: warning: " << absFilename << "\n" + err << "AutoMoc: Warning: " << absFilename << "\n" << "The file includes the moc file \"" << currentMoc << "\", but does not contain a " << macroName << " macro. Running moc on " @@ -743,7 +743,7 @@ bool cmQtAutoGenerators::ParseContentForMoc( this->LogWarning(err.str()); } else { std::ostringstream err; - err << "AUTOMOC: warning: " << absFilename << "\n" + err << "AutoMoc: Warning: " << absFilename << "\n" << "The file includes the moc file \"" << currentMoc << "\" instead of \"moc_" << basename << ".cpp\". Running moc on " @@ -754,7 +754,7 @@ bool cmQtAutoGenerators::ParseContentForMoc( } } else { std::ostringstream err; - err << "AUTOMOC: error: " << absFilename << "\n" + err << "AutoMoc: Error: " << absFilename << "\n" << "The file includes the moc file \"" << currentMoc << "\", which seems to be the moc file from a different " "source file. CMake also could not find a matching " @@ -772,7 +772,7 @@ bool cmQtAutoGenerators::ParseContentForMoc( if (basename != scannedFileBasename) { // Don't allow FOO.moc include other than self in strict mode std::ostringstream err; - err << "AUTOMOC: error: " << absFilename << "\n" + err << "AutoMoc: Error: " << absFilename << "\n" << "The file includes the moc file \"" << currentMoc << "\", which seems to be the moc file from a different " "source file. This is not supported. Include \"" @@ -803,7 +803,7 @@ bool cmQtAutoGenerators::ParseContentForMoc( if (relaxed && ownMocUnderscoreIncluded) { // This is for KDE4 compatibility: std::ostringstream err; - err << "AUTOMOC: warning: " << absFilename << "\n" + err << "AutoMoc: Warning: " << absFilename << "\n" << "The file contains a " << macroName << " macro, but does not include " << "\"" << scannedFileBasename << ".moc\", but instead includes " @@ -820,7 +820,7 @@ bool cmQtAutoGenerators::ParseContentForMoc( } else { // Otherwise always error out since it will not compile: std::ostringstream err; - err << "AUTOMOC: error: " << absFilename << "\n" + err << "AutoMoc: Error: " << absFilename << "\n" << "The file contains a " << macroName << " macro, but does not include " << "\"" << scannedFileBasename << ".moc\" !\n"; @@ -901,7 +901,7 @@ void cmQtAutoGenerators::ParseHeaders( // Process if (this->Verbose) { std::ostringstream err; - err << "AUTOMOC: Checking " << headerName << "\n"; + err << "AutoMoc: Checking " << headerName << "\n"; this->LogInfo(err.str()); } std::string macroName; @@ -932,7 +932,7 @@ bool cmQtAutoGenerators::GenerateMocFiles( mergedMocs.insert(notIncludedMocs.begin(), notIncludedMocs.end()); if (this->NameCollisionTest(mergedMocs, collisions)) { std::ostringstream err; - err << "AUTOMOC: error: " + err << "AutoMoc: Error: " "The same moc file will be generated " "from different sources." << std::endl @@ -1003,7 +1003,7 @@ bool cmQtAutoGenerators::GenerateMocFiles( // nothing changed: don't touch the moc_compilation.cpp file if (this->Verbose) { std::ostringstream err; - err << "AUTOMOC: " << this->OutMocCppFilenameRel << " still up to date" + err << "AutoMoc: " << this->OutMocCppFilenameRel << " still up to date" << std::endl; this->LogInfo(err.str()); } @@ -1025,7 +1025,7 @@ bool cmQtAutoGenerators::GenerateMocFiles( if (!outfile) { success = false; std::ostringstream err; - err << "AUTOMOC: error opening " << this->OutMocCppFilenameAbs << "\n"; + err << "AutoMoc: error opening " << this->OutMocCppFilenameAbs << "\n"; this->LogError(err.str()); } else { outfile << automocSource; @@ -1033,7 +1033,7 @@ bool cmQtAutoGenerators::GenerateMocFiles( if (!outfile.good()) { success = false; std::ostringstream err; - err << "AUTOMOC: error writing " << this->OutMocCppFilenameAbs << "\n"; + err << "AutoMoc: error writing " << this->OutMocCppFilenameAbs << "\n"; this->LogError(err.str()); } } @@ -1090,7 +1090,7 @@ bool cmQtAutoGenerators::GenerateMoc(const std::string& sourceFile, if (!result || retVal) { { std::ostringstream err; - err << "AUTOMOC: error: moc process for " << mocFileRel << " failed:\n" + err << "AutoMoc: Error: moc process for " << mocFileRel << " failed:\n" << output << std::endl; this->LogError(err.str()); } @@ -1133,7 +1133,7 @@ bool cmQtAutoGenerators::GenerateUiFiles( std::multimap<std::string, std::string> collisions; if (this->NameCollisionTest(testMap, collisions)) { std::ostringstream err; - err << "AUTOUIC: error: The same ui_NAME.h file will be generated " + err << "AutoUic: Error: The same ui_NAME.h file will be generated " "from different sources." << std::endl << "To avoid this error rename the source files." << std::endl; @@ -1214,7 +1214,7 @@ bool cmQtAutoGenerators::GenerateUi(const std::string& realName, if (!result || retVal) { { std::ostringstream err; - err << "AUTOUIC: error: uic process for " << uicFileRel + err << "AutoUic: Error: uic process for " << uicFileRel << " needed by\n \"" << realName << "\"\nfailed:\n" << output << std::endl; this->LogError(err.str()); @@ -1263,7 +1263,7 @@ bool cmQtAutoGenerators::GenerateQrcFiles() std::multimap<std::string, std::string> collisions; if (this->NameCollisionTest(qrcGenMap, collisions)) { std::ostringstream err; - err << "AUTORCC: error: The same qrc_NAME.cpp file" + err << "AutoRcc: Error: The same qrc_NAME.cpp file" " will be generated from different sources." << std::endl << "To avoid this error rename the source .qrc files." << std::endl; @@ -1350,7 +1350,7 @@ bool cmQtAutoGenerators::GenerateQrc(const std::string& qrcInputFile, if (!result || retVal) { { std::ostringstream err; - err << "AUTORCC: error: rcc process for " << qrcOutputFile + err << "AutoRcc: Error: rcc process for " << qrcOutputFile << " failed:\n" << output << std::endl; this->LogError(err.str()); @@ -1495,7 +1495,7 @@ bool cmQtAutoGenerators::MakeParentDirectory(const std::string& filename) success = cmsys::SystemTools::MakeDirectory(dirName); if (!success) { std::ostringstream err; - err << "AUTOGEN: Directory creation failed: " << dirName << std::endl; + err << "AutoGen: Directory creation failed: " << dirName << std::endl; this->LogError(err.str()); } } https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=7b766b83952ec4c431a55d2f6e589a5f806834c9 commit 7b766b83952ec4c431a55d2f6e589a5f806834c9 Author: Sebastian Holtermann <sebh...@xwmw.org> AuthorDate: Wed Jan 4 13:08:25 2017 +0100 Commit: Sebastian Holtermann <sebh...@xwmw.org> CommitDate: Tue Jan 10 12:49:16 2017 +0100 AUTOGEN: Generators: Use single moc/uic skip test method only diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index 24d2dd7..8fea817 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -610,7 +610,7 @@ void cmQtAutoGenerators::ParseContentForUic( const std::string& absFilename, const std::string& contentsString, std::map<std::string, std::vector<std::string> >& includedUis) { - if (this->UicExecutable.empty() || this->UicSkipTest(absFilename)) { + if (this->UicSkipTest(absFilename)) { return; } @@ -644,7 +644,7 @@ bool cmQtAutoGenerators::ParseContentForMoc( const std::vector<std::string>& headerExtensions, std::map<std::string, std::string>& includedMocs, bool relaxed) { - if (this->MocExecutable.empty() || this->MocSkipTest(absFilename)) { + if (this->MocSkipTest(absFilename)) { return true; } @@ -838,25 +838,22 @@ void cmQtAutoGenerators::SearchHeadersForSourceFile( std::set<std::string>& absHeadersMoc, std::set<std::string>& absHeadersUic) { // search for header files and private header files we may need to moc: - const std::string basename = - cmsys::SystemTools::GetFilenameWithoutLastExtension(absFilename); - const std::string absPath = cmsys::SystemTools::GetFilenamePath( - cmsys::SystemTools::GetRealPath(absFilename)) + - '/'; + std::string basepath = cmsys::SystemTools::GetFilenamePath( + cmsys::SystemTools::GetRealPath(absFilename)); + basepath += '/'; + basepath += cmsys::SystemTools::GetFilenameWithoutLastExtension(absFilename); // Search for regular header for (std::vector<std::string>::const_iterator ext = headerExtensions.begin(); ext != headerExtensions.end(); ++ext) { - const std::string headerName = absPath + basename + "." + (*ext); + const std::string headerName = basepath + "." + (*ext); if (cmsys::SystemTools::FileExists(headerName.c_str())) { // Moc headers - if (!this->MocExecutable.empty() && - !ListContains(this->SkipMoc, absFilename)) { + if (!this->MocSkipTest(absFilename) && !this->MocSkipTest(headerName)) { absHeadersMoc.insert(headerName); } // Uic headers - if (!this->UicExecutable.empty() && - !ListContains(this->SkipUic, absFilename)) { + if (!this->UicSkipTest(absFilename) && !this->UicSkipTest(headerName)) { absHeadersUic.insert(headerName); } break; @@ -865,17 +862,15 @@ void cmQtAutoGenerators::SearchHeadersForSourceFile( // Search for private header for (std::vector<std::string>::const_iterator ext = headerExtensions.begin(); ext != headerExtensions.end(); ++ext) { - const std::string privateHeaderName = absPath + basename + "_p." + (*ext); - if (cmsys::SystemTools::FileExists(privateHeaderName.c_str())) { + const std::string headerName = basepath + "_p." + (*ext); + if (cmsys::SystemTools::FileExists(headerName.c_str())) { // Moc headers - if (!this->MocExecutable.empty() && - !ListContains(this->SkipMoc, absFilename)) { - absHeadersMoc.insert(privateHeaderName); + if (!this->MocSkipTest(absFilename) && !this->MocSkipTest(headerName)) { + absHeadersMoc.insert(headerName); } // Uic headers - if (!this->UicExecutable.empty() && - !ListContains(this->SkipUic, absFilename)) { - absHeadersUic.insert(privateHeaderName); + if (!this->UicSkipTest(absFilename) && !this->UicSkipTest(headerName)) { + absHeadersUic.insert(headerName); } break; } @@ -900,23 +895,21 @@ void cmQtAutoGenerators::ParseHeaders( const std::string contents = ReadAll(headerName); // Parse header content for MOC - if (!this->MocExecutable.empty() && + if (!this->MocSkipTest(headerName) && (absHeadersMoc.find(headerName) != absHeadersMoc.end()) && (includedMocs.find(headerName) == includedMocs.end())) { - if (!this->MocSkipTest(headerName)) { - // Process - if (this->Verbose) { - std::ostringstream err; - err << "AUTOMOC: Checking " << headerName << "\n"; - this->LogInfo(err.str()); - } - std::string macroName; - if (this->requiresMocing(contents, macroName)) { - notIncludedMocs[headerName] = fpathCheckSum.getPart(headerName) + - "/moc_" + - cmsys::SystemTools::GetFilenameWithoutLastExtension(headerName) + - ".cpp"; - } + // Process + if (this->Verbose) { + std::ostringstream err; + err << "AUTOMOC: Checking " << headerName << "\n"; + this->LogInfo(err.str()); + } + std::string macroName; + if (this->requiresMocing(contents, macroName)) { + notIncludedMocs[headerName] = fpathCheckSum.getPart(headerName) + + "/moc_" + + cmsys::SystemTools::GetFilenameWithoutLastExtension(headerName) + + ".cpp"; } } @@ -1372,19 +1365,19 @@ bool cmQtAutoGenerators::GenerateQrc(const std::string& qrcInputFile, } /** - * @brief Tests if the file name is in the skip list + * @brief Tests if the file should be ignored for moc scanning + * @return True if the file should be ignored */ bool cmQtAutoGenerators::MocSkipTest(const std::string& absFilename) { - if (ListContains(this->SkipMoc, absFilename)) { - if (this->Verbose) { - std::ostringstream msg; - msg << "AUTOMOC: Skipping " << absFilename << "\n"; - this->LogInfo(msg.str()); + // Test if moc scanning is enabled + if (!this->MocExecutable.empty()) { + // Test if the file name is on the skip list + if (!ListContains(this->SkipMoc, absFilename)) { + return false; } - return true; } - return false; + return true; } /** @@ -1392,15 +1385,14 @@ bool cmQtAutoGenerators::MocSkipTest(const std::string& absFilename) */ bool cmQtAutoGenerators::UicSkipTest(const std::string& absFilename) { - if (ListContains(this->SkipUic, absFilename)) { - if (this->Verbose) { - std::ostringstream msg; - msg << "AUTOUIC: Skipping " << absFilename << "\n"; - this->LogInfo(msg.str()); + // Test if uic scanning is enabled + if (!this->UicExecutable.empty()) { + // Test if the file name is on the skip list + if (!ListContains(this->SkipUic, absFilename)) { + return false; } - return true; } - return false; + return true; } /** https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=2964b8cca4155fa318722f6ef17f0d4d56ee2f29 commit 2964b8cca4155fa318722f6ef17f0d4d56ee2f29 Author: Sebastian Holtermann <sebh...@xwmw.org> AuthorDate: Sun Jan 1 16:10:49 2017 +0100 Commit: Sebastian Holtermann <sebh...@xwmw.org> CommitDate: Tue Jan 10 12:49:16 2017 +0100 AUTOGEN: Generators: Use AUTOMOC/UIC/RCC instead of AUTOGEN in messages diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index 9c8594b..24d2dd7 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -705,7 +705,7 @@ bool cmQtAutoGenerators::ParseContentForMoc( } } else { std::ostringstream err; - err << "AUTOGEN: error: " << absFilename << "\n" + err << "AUTOMOC: error: " << absFilename << "\n" << "The file includes the moc file \"" << currentMoc << "\", but could not find header \"" << basename << '{' << this->JoinExts(headerExtensions) << "}\" "; @@ -939,7 +939,7 @@ bool cmQtAutoGenerators::GenerateMocFiles( mergedMocs.insert(notIncludedMocs.begin(), notIncludedMocs.end()); if (this->NameCollisionTest(mergedMocs, collisions)) { std::ostringstream err; - err << "AUTOGEN: error: " + err << "AUTOMOC: error: " "The same moc file will be generated " "from different sources." << std::endl @@ -1010,7 +1010,7 @@ bool cmQtAutoGenerators::GenerateMocFiles( // nothing changed: don't touch the moc_compilation.cpp file if (this->Verbose) { std::ostringstream err; - err << "AUTOGEN: " << this->OutMocCppFilenameRel << " still up to date" + err << "AUTOMOC: " << this->OutMocCppFilenameRel << " still up to date" << std::endl; this->LogInfo(err.str()); } @@ -1032,7 +1032,7 @@ bool cmQtAutoGenerators::GenerateMocFiles( if (!outfile) { success = false; std::ostringstream err; - err << "AUTOGEN: error opening " << this->OutMocCppFilenameAbs << "\n"; + err << "AUTOMOC: error opening " << this->OutMocCppFilenameAbs << "\n"; this->LogError(err.str()); } else { outfile << automocSource; @@ -1040,7 +1040,7 @@ bool cmQtAutoGenerators::GenerateMocFiles( if (!outfile.good()) { success = false; std::ostringstream err; - err << "AUTOGEN: error writing " << this->OutMocCppFilenameAbs << "\n"; + err << "AUTOMOC: error writing " << this->OutMocCppFilenameAbs << "\n"; this->LogError(err.str()); } } @@ -1097,7 +1097,7 @@ bool cmQtAutoGenerators::GenerateMoc(const std::string& sourceFile, if (!result || retVal) { { std::ostringstream err; - err << "AUTOGEN: error: moc process for " << mocFileRel << " failed:\n" + err << "AUTOMOC: error: moc process for " << mocFileRel << " failed:\n" << output << std::endl; this->LogError(err.str()); } @@ -1140,7 +1140,7 @@ bool cmQtAutoGenerators::GenerateUiFiles( std::multimap<std::string, std::string> collisions; if (this->NameCollisionTest(testMap, collisions)) { std::ostringstream err; - err << "AUTOGEN: error: The same ui_NAME.h file will be generated " + err << "AUTOUIC: error: The same ui_NAME.h file will be generated " "from different sources." << std::endl << "To avoid this error rename the source files." << std::endl; @@ -1270,7 +1270,7 @@ bool cmQtAutoGenerators::GenerateQrcFiles() std::multimap<std::string, std::string> collisions; if (this->NameCollisionTest(qrcGenMap, collisions)) { std::ostringstream err; - err << "AUTOGEN: error: The same qrc_NAME.cpp file" + err << "AUTORCC: error: The same qrc_NAME.cpp file" " will be generated from different sources." << std::endl << "To avoid this error rename the source .qrc files." << std::endl; https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=d58b6bf31c18cfedd4a2f15e009b8e5cbdc21b6e commit d58b6bf31c18cfedd4a2f15e009b8e5cbdc21b6e Author: Sebastian Holtermann <sebh...@xwmw.org> AuthorDate: Sun Jan 1 15:58:34 2017 +0100 Commit: Sebastian Holtermann <sebh...@xwmw.org> CommitDate: Tue Jan 10 12:49:16 2017 +0100 AUTOGEN: Generators: Moc/UicSkipTest methods diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index fac9d54..9c8594b 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -610,16 +610,7 @@ void cmQtAutoGenerators::ParseContentForUic( const std::string& absFilename, const std::string& contentsString, std::map<std::string, std::vector<std::string> >& includedUis) { - if (this->UicExecutable.empty()) { - return; - } - // Check skip list - if (ListContains(this->SkipUic, absFilename)) { - if (this->Verbose) { - std::ostringstream err; - err << "AUTOUIC: Skipping " << absFilename << "\n"; - this->LogInfo(err.str()); - } + if (this->UicExecutable.empty() || this->UicSkipTest(absFilename)) { return; } @@ -653,16 +644,7 @@ bool cmQtAutoGenerators::ParseContentForMoc( const std::vector<std::string>& headerExtensions, std::map<std::string, std::string>& includedMocs, bool relaxed) { - if (this->MocExecutable.empty()) { - return true; - } - // Check skip list - if (ListContains(this->SkipMoc, absFilename)) { - if (this->Verbose) { - std::ostringstream err; - err << "AUTOMOC: Skipping " << absFilename << "\n"; - this->LogInfo(err.str()); - } + if (this->MocExecutable.empty() || this->MocSkipTest(absFilename)) { return true; } @@ -921,14 +903,7 @@ void cmQtAutoGenerators::ParseHeaders( if (!this->MocExecutable.empty() && (absHeadersMoc.find(headerName) != absHeadersMoc.end()) && (includedMocs.find(headerName) == includedMocs.end())) { - if (ListContains(this->SkipMoc, headerName)) { - // Skip - if (this->Verbose) { - std::ostringstream err; - err << "AUTOMOC: Skipping " << headerName << "\n"; - this->LogInfo(err.str()); - } - } else { + if (!this->MocSkipTest(headerName)) { // Process if (this->Verbose) { std::ostringstream err; @@ -1397,6 +1372,38 @@ bool cmQtAutoGenerators::GenerateQrc(const std::string& qrcInputFile, } /** + * @brief Tests if the file name is in the skip list + */ +bool cmQtAutoGenerators::MocSkipTest(const std::string& absFilename) +{ + if (ListContains(this->SkipMoc, absFilename)) { + if (this->Verbose) { + std::ostringstream msg; + msg << "AUTOMOC: Skipping " << absFilename << "\n"; + this->LogInfo(msg.str()); + } + return true; + } + return false; +} + +/** + * @brief Tests if the file name is in the skip list + */ +bool cmQtAutoGenerators::UicSkipTest(const std::string& absFilename) +{ + if (ListContains(this->SkipUic, absFilename)) { + if (this->Verbose) { + std::ostringstream msg; + msg << "AUTOUIC: Skipping " << absFilename << "\n"; + this->LogInfo(msg.str()); + } + return true; + } + return false; +} + +/** * @brief Collects name collisions as output/input pairs * @return True if there were collisions */ diff --git a/Source/cmQtAutoGenerators.h b/Source/cmQtAutoGenerators.h index 1036cb7..d0c7066 100644 --- a/Source/cmQtAutoGenerators.h +++ b/Source/cmQtAutoGenerators.h @@ -86,6 +86,9 @@ private: void Init(); + bool MocSkipTest(const std::string& absFilename); + bool UicSkipTest(const std::string& absFilename); + bool NameCollisionTest(const std::map<std::string, std::string>& genFiles, std::multimap<std::string, std::string>& collisions); https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=94c319f93309ff4cddd0280cdcbd48b50492db36 commit 94c319f93309ff4cddd0280cdcbd48b50492db36 Author: Sebastian Holtermann <sebh...@xwmw.org> AuthorDate: Sat Dec 31 13:04:38 2016 +0100 Commit: Sebastian Holtermann <sebh...@xwmw.org> CommitDate: Tue Jan 10 12:49:16 2017 +0100 AUTOGEN: Generators: Use separate header lists for MOC and UIC This is necessary for the skipMoc and skipUic lists to work properly. diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index b323609..fac9d54 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -511,7 +511,8 @@ bool cmQtAutoGenerators::RunAutogen(cmMakefile* makefile) std::map<std::string, std::string> notIncludedMocs; std::map<std::string, std::vector<std::string> > includedUis; // collects all headers which may need to be mocced - std::set<std::string> headerFiles; + std::set<std::string> headerFilesMoc; + std::set<std::string> headerFilesUic; // Parse sources { @@ -527,14 +528,16 @@ bool cmQtAutoGenerators::RunAutogen(cmMakefile* makefile) return false; } // Find additional headers - this->SearchHeadersForCppFile(absFilename, headerExtensions, - headerFiles); + this->SearchHeadersForSourceFile(absFilename, headerExtensions, + headerFilesMoc, headerFilesUic); } } // Parse headers - headerFiles.insert(this->Headers.begin(), this->Headers.end()); - this->ParseHeaders(headerFiles, includedMocs, notIncludedMocs, includedUis); + headerFilesMoc.insert(this->Headers.begin(), this->Headers.end()); + headerFilesUic.insert(this->Headers.begin(), this->Headers.end()); + this->ParseHeaders(headerFilesMoc, headerFilesUic, includedMocs, + notIncludedMocs, includedUis); // Generate files if (!this->MocExecutable.empty()) { @@ -847,10 +850,10 @@ bool cmQtAutoGenerators::ParseContentForMoc( return true; } -void cmQtAutoGenerators::SearchHeadersForCppFile( +void cmQtAutoGenerators::SearchHeadersForSourceFile( const std::string& absFilename, const std::vector<std::string>& headerExtensions, - std::set<std::string>& absHeaders) + std::set<std::string>& absHeadersMoc, std::set<std::string>& absHeadersUic) { // search for header files and private header files we may need to moc: const std::string basename = @@ -859,37 +862,64 @@ void cmQtAutoGenerators::SearchHeadersForCppFile( cmsys::SystemTools::GetRealPath(absFilename)) + '/'; + // Search for regular header for (std::vector<std::string>::const_iterator ext = headerExtensions.begin(); ext != headerExtensions.end(); ++ext) { const std::string headerName = absPath + basename + "." + (*ext); if (cmsys::SystemTools::FileExists(headerName.c_str())) { - absHeaders.insert(headerName); + // Moc headers + if (!this->MocExecutable.empty() && + !ListContains(this->SkipMoc, absFilename)) { + absHeadersMoc.insert(headerName); + } + // Uic headers + if (!this->UicExecutable.empty() && + !ListContains(this->SkipUic, absFilename)) { + absHeadersUic.insert(headerName); + } break; } } + // Search for private header for (std::vector<std::string>::const_iterator ext = headerExtensions.begin(); ext != headerExtensions.end(); ++ext) { const std::string privateHeaderName = absPath + basename + "_p." + (*ext); if (cmsys::SystemTools::FileExists(privateHeaderName.c_str())) { - absHeaders.insert(privateHeaderName); + // Moc headers + if (!this->MocExecutable.empty() && + !ListContains(this->SkipMoc, absFilename)) { + absHeadersMoc.insert(privateHeaderName); + } + // Uic headers + if (!this->UicExecutable.empty() && + !ListContains(this->SkipUic, absFilename)) { + absHeadersUic.insert(privateHeaderName); + } break; } } } void cmQtAutoGenerators::ParseHeaders( - const std::set<std::string>& absHeaders, + const std::set<std::string>& absHeadersMoc, + const std::set<std::string>& absHeadersUic, const std::map<std::string, std::string>& includedMocs, std::map<std::string, std::string>& notIncludedMocs, std::map<std::string, std::vector<std::string> >& includedUis) { - for (std::set<std::string>::const_iterator hIt = absHeaders.begin(); - hIt != absHeaders.end(); ++hIt) { + // Merged header files list to read files only once + std::set<std::string> headerFiles; + headerFiles.insert(absHeadersMoc.begin(), absHeadersMoc.end()); + headerFiles.insert(absHeadersUic.begin(), absHeadersUic.end()); + + for (std::set<std::string>::const_iterator hIt = headerFiles.begin(); + hIt != headerFiles.end(); ++hIt) { const std::string& headerName = *hIt; const std::string contents = ReadAll(headerName); // Parse header content for MOC if (!this->MocExecutable.empty() && + (absHeadersMoc.find(headerName) != absHeadersMoc.end()) && (includedMocs.find(headerName) == includedMocs.end())) { if (ListContains(this->SkipMoc, headerName)) { // Skip @@ -916,7 +946,9 @@ void cmQtAutoGenerators::ParseHeaders( } // Parse header content for UIC - this->ParseContentForUic(headerName, contents, includedUis); + if (absHeadersUic.find(headerName) != absHeadersUic.end()) { + this->ParseContentForUic(headerName, contents, includedUis); + } } } diff --git a/Source/cmQtAutoGenerators.h b/Source/cmQtAutoGenerators.h index dac23d9..1036cb7 100644 --- a/Source/cmQtAutoGenerators.h +++ b/Source/cmQtAutoGenerators.h @@ -55,13 +55,15 @@ private: std::map<std::string, std::string>& includedMocs, std::map<std::string, std::vector<std::string> >& includedUis, bool relaxed); - void SearchHeadersForCppFile( + void SearchHeadersForSourceFile( const std::string& absFilename, const std::vector<std::string>& headerExtensions, - std::set<std::string>& absHeaders); + std::set<std::string>& absHeadersMoc, + std::set<std::string>& absHeadersUic); void ParseHeaders( - const std::set<std::string>& absHeaders, + const std::set<std::string>& absHeadersMoc, + const std::set<std::string>& absHeadersUic, const std::map<std::string, std::string>& includedMocs, std::map<std::string, std::string>& notIncludedMocs, std::map<std::string, std::vector<std::string> >& includedUis); https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=966be439e07131c3ff84175c1a9e3b6336908d8e commit 966be439e07131c3ff84175c1a9e3b6336908d8e Author: Sebastian Holtermann <sebh...@xwmw.org> AuthorDate: Sat Dec 31 11:51:39 2016 +0100 Commit: Sebastian Holtermann <sebh...@xwmw.org> CommitDate: Tue Jan 10 12:49:15 2017 +0100 AUTOGEN: Generators: Be verbose about skipping files diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index c162c87..b323609 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -607,11 +607,20 @@ void cmQtAutoGenerators::ParseContentForUic( const std::string& absFilename, const std::string& contentsString, std::map<std::string, std::vector<std::string> >& includedUis) { - if (this->UicExecutable.empty() || - ListContains(this->SkipUic, absFilename)) { + if (this->UicExecutable.empty()) { + return; + } + // Check skip list + if (ListContains(this->SkipUic, absFilename)) { + if (this->Verbose) { + std::ostringstream err; + err << "AUTOUIC: Skipping " << absFilename << "\n"; + this->LogInfo(err.str()); + } return; } + // Process if (this->Verbose) { std::ostringstream err; err << "AUTOUIC: Checking " << absFilename << "\n"; @@ -641,11 +650,20 @@ bool cmQtAutoGenerators::ParseContentForMoc( const std::vector<std::string>& headerExtensions, std::map<std::string, std::string>& includedMocs, bool relaxed) { - if (this->MocExecutable.empty() || - ListContains(this->SkipMoc, absFilename)) { + if (this->MocExecutable.empty()) { + return true; + } + // Check skip list + if (ListContains(this->SkipMoc, absFilename)) { + if (this->Verbose) { + std::ostringstream err; + err << "AUTOMOC: Skipping " << absFilename << "\n"; + this->LogInfo(err.str()); + } return true; } + // Process if (this->Verbose) { std::ostringstream err; err << "AUTOMOC: Checking " << absFilename << "\n"; @@ -872,21 +890,28 @@ void cmQtAutoGenerators::ParseHeaders( // Parse header content for MOC if (!this->MocExecutable.empty() && - !ListContains(this->SkipMoc, headerName) && (includedMocs.find(headerName) == includedMocs.end())) { - - if (this->Verbose) { - std::ostringstream err; - err << "AUTOMOC: Checking " << headerName << "\n"; - this->LogInfo(err.str()); - } - - std::string macroName; - if (this->requiresMocing(contents, macroName)) { - notIncludedMocs[headerName] = fpathCheckSum.getPart(headerName) + - "/moc_" + - cmsys::SystemTools::GetFilenameWithoutLastExtension(headerName) + - ".cpp"; + if (ListContains(this->SkipMoc, headerName)) { + // Skip + if (this->Verbose) { + std::ostringstream err; + err << "AUTOMOC: Skipping " << headerName << "\n"; + this->LogInfo(err.str()); + } + } else { + // Process + if (this->Verbose) { + std::ostringstream err; + err << "AUTOMOC: Checking " << headerName << "\n"; + this->LogInfo(err.str()); + } + std::string macroName; + if (this->requiresMocing(contents, macroName)) { + notIncludedMocs[headerName] = fpathCheckSum.getPart(headerName) + + "/moc_" + + cmsys::SystemTools::GetFilenameWithoutLastExtension(headerName) + + ".cpp"; + } } } https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=de531432887487943dbe4ae5a1bde762d5582e06 commit de531432887487943dbe4ae5a1bde762d5582e06 Author: Sebastian Holtermann <sebh...@xwmw.org> AuthorDate: Thu Dec 29 17:16:12 2016 +0100 Commit: Sebastian Holtermann <sebh...@xwmw.org> CommitDate: Tue Jan 10 12:49:15 2017 +0100 AUTOGEN: Generators: Remove unused variable diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index 4b5e113..c162c87 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -666,13 +666,12 @@ bool cmQtAutoGenerators::ParseContentForMoc( std::string ownMocUnderscoreFile; std::string ownMocHeaderFile; - std::string::size_type matchOffset = 0; // first a simple string check for "moc" is *much* faster than the regexp, // and if the string search already fails, we don't have to try the // expensive regexp - if (strstr(contentsString.c_str(), "moc") != CM_NULLPTR) { + const char* contentChars = contentsString.c_str(); + if (strstr(contentChars, "moc") != CM_NULLPTR) { // Iterate over all included moc files - const char* contentChars = contentsString.c_str(); while (this->RegExpMocInclude.find(contentChars)) { const std::string currentMoc = this->RegExpMocInclude.match(1); // Basename of the current moc include https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=d8e45536fb3637454cf17a638dcd9fc236e94660 commit d8e45536fb3637454cf17a638dcd9fc236e94660 Author: Sebastian Holtermann <sebh...@xwmw.org> AuthorDate: Sat Dec 31 11:17:07 2016 +0100 Commit: Sebastian Holtermann <sebh...@xwmw.org> CommitDate: Tue Jan 10 12:49:15 2017 +0100 AUTOGEN: Initializer: Always remember skipped files diff --git a/Source/cmQtAutoGeneratorInitializer.cxx b/Source/cmQtAutoGeneratorInitializer.cxx index b74fbf3..6d4c302 100644 --- a/Source/cmQtAutoGeneratorInitializer.cxx +++ b/Source/cmQtAutoGeneratorInitializer.cxx @@ -101,14 +101,17 @@ static std::string GetQtMajorVersion(cmGeneratorTarget const* target) static void SetupSourceFiles(cmGeneratorTarget const* target, std::vector<std::string>& mocUicSources, std::vector<std::string>& mocUicHeaders, - std::vector<std::string>& skipMoc, - std::vector<std::string>& skipUic) + std::vector<std::string>& skipMocList, + std::vector<std::string>& skipUicList) { cmMakefile* makefile = target->Target->GetMakefile(); std::vector<cmSourceFile*> srcFiles; target->GetConfigCommonSourceFiles(srcFiles); + const bool targetMoc = target->GetPropertyAsBool("AUTOMOC"); + const bool targetUic = target->GetPropertyAsBool("AUTOUIC"); + cmFilePathChecksum fpathCheckSum(makefile); for (std::vector<cmSourceFile*>::const_iterator fileIt = srcFiles.begin(); fileIt != srcFiles.end(); ++fileIt) { @@ -123,32 +126,38 @@ static void SetupSourceFiles(cmGeneratorTarget const* target, if (cmSystemTools::IsOn(sf->GetPropertyForUser("GENERATED"))) { continue; } - if (cmSystemTools::IsOn(sf->GetPropertyForUser("SKIP_AUTOGEN"))) { - continue; - } - const bool fileSkipUic = - cmSystemTools::IsOn(sf->GetPropertyForUser("SKIP_AUTOUIC")); - const bool fileSkipMoc = - cmSystemTools::IsOn(sf->GetPropertyForUser("SKIP_AUTOMOC")); - if (fileSkipUic && fileSkipMoc) { - continue; - } - - // Use file const std::string absFile = cmsys::SystemTools::GetRealPath(sf->GetFullPath()); - // Add file name to sources or headers list - if (fileType == cmSystemTools::CXX_FILE_FORMAT) { - mocUicSources.push_back(absFile); - } else if (fileType == cmSystemTools::HEADER_FILE_FORMAT) { - mocUicHeaders.push_back(absFile); - } - // Add file name to skip lists on demand - if (fileSkipUic) { - skipUic.push_back(absFile); - } - if (fileSkipMoc) { - skipMoc.push_back(absFile); + // Skip flags + const bool skipAll = + cmSystemTools::IsOn(sf->GetPropertyForUser("SKIP_AUTOGEN")); + const bool skipMoc = + skipAll || cmSystemTools::IsOn(sf->GetPropertyForUser("SKIP_AUTOMOC")); + const bool skipUic = + skipAll || cmSystemTools::IsOn(sf->GetPropertyForUser("SKIP_AUTOUIC")); + // Add file name to skip lists. + // Do this even when the file is not added to the sources/headers lists + // because the file name may be extracted from an other file when + // processing + if (skipMoc) { + skipMocList.push_back(absFile); + } + if (skipUic) { + skipUicList.push_back(absFile); + } + + if ((targetMoc && !skipMoc) || (targetUic && !skipUic)) { + // Add file name to sources or headers list + switch (fileType) { + case cmSystemTools::CXX_FILE_FORMAT: + mocUicSources.push_back(absFile); + break; + case cmSystemTools::HEADER_FILE_FORMAT: + mocUicHeaders.push_back(absFile); + break; + default: + break; + } } } } https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=d9313a82906ced0ff3c76828e86d9d7a248a5e49 commit d9313a82906ced0ff3c76828e86d9d7a248a5e49 Author: Sebastian Holtermann <sebh...@xwmw.org> AuthorDate: Wed Dec 28 12:15:11 2016 +0100 Commit: Sebastian Holtermann <sebh...@xwmw.org> CommitDate: Tue Jan 10 12:49:15 2017 +0100 AUTOGEN: Initializer: Enable SKIP_AUTOGEN on all AUTOGEN generated sources diff --git a/Source/cmQtAutoGeneratorInitializer.cxx b/Source/cmQtAutoGeneratorInitializer.cxx index de0c212..b74fbf3 100644 --- a/Source/cmQtAutoGeneratorInitializer.cxx +++ b/Source/cmQtAutoGeneratorInitializer.cxx @@ -646,7 +646,8 @@ void cmQtAutoGeneratorInitializer::InitializeAutogenSources( cmMakefile* makefile = target->Target->GetMakefile(); const std::string mocCppFile = GetAutogenTargetBuildDir(target) + "moc_compilation.cpp"; - makefile->GetOrCreateSource(mocCppFile, true); + cmSourceFile* gf = makefile->GetOrCreateSource(mocCppFile, true); + gf->SetProperty("SKIP_AUTOGEN", "On"); target->AddSource(mocCppFile); } } @@ -778,7 +779,8 @@ void cmQtAutoGeneratorInitializer::InitializeAutogenTarget( rccOutputFile += ".cpp"; // Add rcc output file to origin target sources - makefile->GetOrCreateSource(rccOutputFile, true); + cmSourceFile* gf = makefile->GetOrCreateSource(rccOutputFile, true); + gf->SetProperty("SKIP_AUTOGEN", "On"); target->AddSource(rccOutputFile); // Register rcc output file as generated autogenOutputFiles.push_back(rccOutputFile); https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=32d3540e090c4a24d55b99c49c094a9cb574c9b3 commit 32d3540e090c4a24d55b99c49c094a9cb574c9b3 Author: Sebastian Holtermann <sebh...@xwmw.org> AuthorDate: Wed Dec 28 12:01:31 2016 +0100 Commit: Sebastian Holtermann <sebh...@xwmw.org> CommitDate: Tue Jan 10 12:49:15 2017 +0100 AUTOGEN: Initializer: Introduce SKIP_AUTOGEN checks diff --git a/Source/cmQtAutoGeneratorInitializer.cxx b/Source/cmQtAutoGeneratorInitializer.cxx index 5304aec..de0c212 100644 --- a/Source/cmQtAutoGeneratorInitializer.cxx +++ b/Source/cmQtAutoGeneratorInitializer.cxx @@ -123,6 +123,9 @@ static void SetupSourceFiles(cmGeneratorTarget const* target, if (cmSystemTools::IsOn(sf->GetPropertyForUser("GENERATED"))) { continue; } + if (cmSystemTools::IsOn(sf->GetPropertyForUser("SKIP_AUTOGEN"))) { + continue; + } const bool fileSkipUic = cmSystemTools::IsOn(sf->GetPropertyForUser("SKIP_AUTOUIC")); const bool fileSkipMoc = @@ -578,7 +581,9 @@ static void RccSetupAutoTarget(cmGeneratorTarget const* target, std::string ext = sf->GetExtension(); if (ext == "qrc") { std::string absFile = cmsys::SystemTools::GetRealPath(sf->GetFullPath()); - bool skip = cmSystemTools::IsOn(sf->GetPropertyForUser("SKIP_AUTORCC")); + const bool skip = + cmSystemTools::IsOn(sf->GetPropertyForUser("SKIP_AUTOGEN")) || + cmSystemTools::IsOn(sf->GetPropertyForUser("SKIP_AUTORCC")); if (!skip) { _rcc_files += sepRccFiles; @@ -756,6 +761,7 @@ void cmQtAutoGeneratorInitializer::InitializeAutogenTarget( fileIt != srcFiles.end(); ++fileIt) { cmSourceFile* sf = *fileIt; if (sf->GetExtension() == "qrc" && + !cmSystemTools::IsOn(sf->GetPropertyForUser("SKIP_AUTOGEN")) && !cmSystemTools::IsOn(sf->GetPropertyForUser("SKIP_AUTORCC"))) { { const std::string absFile = https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=e7280a7f1743d73cdab41ed709a9e1d0f99b6342 commit e7280a7f1743d73cdab41ed709a9e1d0f99b6342 Author: Sebastian Holtermann <sebh...@xwmw.org> AuthorDate: Wed Dec 28 11:56:20 2016 +0100 Commit: Sebastian Holtermann <sebh...@xwmw.org> CommitDate: Tue Jan 10 12:49:15 2017 +0100 AUTOGEN: Rename config variables The new names describe the variables use cases better. diff --git a/Modules/AutogenInfo.cmake.in b/Modules/AutogenInfo.cmake.in index 84b0f4d..3fafaff 100644 --- a/Modules/AutogenInfo.cmake.in +++ b/Modules/AutogenInfo.cmake.in @@ -1,7 +1,7 @@ -set(AM_SOURCES @_cpp_files@ ) -set(AM_SKIP_MOC @_skip_moc@ ) -set(AM_SKIP_UIC @_skip_uic@ ) -set(AM_HEADERS @_moc_headers@ ) +set(AM_SOURCES @_moc_uic_sources@) +set(AM_HEADERS @_moc_uic_headers@) +set(AM_SKIP_MOC @_skip_moc@) +set(AM_SKIP_UIC @_skip_uic@) set(AM_MOC_COMPILE_DEFINITIONS @_moc_compile_defs@) set(AM_MOC_INCLUDES @_moc_incs@) set(AM_MOC_OPTIONS @_moc_options@) diff --git a/Source/cmQtAutoGeneratorInitializer.cxx b/Source/cmQtAutoGeneratorInitializer.cxx index 0ed43b1..5304aec 100644 --- a/Source/cmQtAutoGeneratorInitializer.cxx +++ b/Source/cmQtAutoGeneratorInitializer.cxx @@ -99,9 +99,9 @@ static std::string GetQtMajorVersion(cmGeneratorTarget const* target) } static void SetupSourceFiles(cmGeneratorTarget const* target, + std::vector<std::string>& mocUicSources, + std::vector<std::string>& mocUicHeaders, std::vector<std::string>& skipMoc, - std::vector<std::string>& sources, - std::vector<std::string>& headers, std::vector<std::string>& skipUic) { cmMakefile* makefile = target->Target->GetMakefile(); @@ -136,9 +136,9 @@ static void SetupSourceFiles(cmGeneratorTarget const* target, cmsys::SystemTools::GetRealPath(sf->GetFullPath()); // Add file name to sources or headers list if (fileType == cmSystemTools::CXX_FILE_FORMAT) { - sources.push_back(absFile); + mocUicSources.push_back(absFile); } else if (fileType == cmSystemTools::HEADER_FILE_FORMAT) { - headers.push_back(absFile); + mocUicHeaders.push_back(absFile); } // Add file name to skip lists on demand if (fileSkipUic) { @@ -171,7 +171,6 @@ static void GetCompileDefinitionsAndDirectories( static void MocSetupAutoTarget( cmGeneratorTarget const* target, const std::string& autogenTargetName, std::vector<std::string> const& skipMoc, - std::vector<std::string> const& mocHeaders, std::map<std::string, std::string>& configIncludes, std::map<std::string, std::string>& configDefines) { @@ -185,9 +184,6 @@ static void MocSetupAutoTarget( makefile->AddDefinition( "_skip_moc", cmOutputConverter::EscapeForCMake(cmJoin(skipMoc, ";")).c_str()); - makefile->AddDefinition( - "_moc_headers", - cmOutputConverter::EscapeForCMake(cmJoin(mocHeaders, ";")).c_str()); bool relaxedMode = makefile->IsOn("CMAKE_AUTOMOC_RELAXED_MODE"); makefile->AddDefinition("_moc_relaxed_mode", relaxedMode ? "TRUE" : "FALSE"); @@ -863,10 +859,10 @@ void cmQtAutoGeneratorInitializer::SetupAutoGenerateTarget( cmOutputConverter::EscapeForCMake(target->GetName()).c_str()); makefile->AddDefinition("_target_qt_version", qtMajorVersion.c_str()); - std::vector<std::string> skipUic; + std::vector<std::string> mocUicSources; + std::vector<std::string> mocUicHeaders; std::vector<std::string> skipMoc; - std::vector<std::string> mocSources; - std::vector<std::string> mocHeaders; + std::vector<std::string> skipUic; std::map<std::string, std::string> configMocIncludes; std::map<std::string, std::string> configMocDefines; std::map<std::string, std::string> configUicOptions; @@ -874,14 +870,18 @@ void cmQtAutoGeneratorInitializer::SetupAutoGenerateTarget( if (target->GetPropertyAsBool("AUTOMOC") || target->GetPropertyAsBool("AUTOUIC") || target->GetPropertyAsBool("AUTORCC")) { - SetupSourceFiles(target, skipMoc, mocSources, mocHeaders, skipUic); + SetupSourceFiles(target, mocUicSources, mocUicHeaders, skipMoc, skipUic); } makefile->AddDefinition( - "_cpp_files", - cmOutputConverter::EscapeForCMake(cmJoin(mocSources, ";")).c_str()); + "_moc_uic_sources", + cmOutputConverter::EscapeForCMake(cmJoin(mocUicSources, ";")).c_str()); + makefile->AddDefinition( + "_moc_uic_headers", + cmOutputConverter::EscapeForCMake(cmJoin(mocUicHeaders, ";")).c_str()); + if (target->GetPropertyAsBool("AUTOMOC")) { - MocSetupAutoTarget(target, autogenTargetName, skipMoc, mocHeaders, - configMocIncludes, configMocDefines); + MocSetupAutoTarget(target, autogenTargetName, skipMoc, configMocIncludes, + configMocDefines); } if (target->GetPropertyAsBool("AUTOUIC")) { UicSetupAutoTarget(target, skipUic, configUicOptions); https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=63d3ca4c1cab0c7b9c71d6c051c3b4c053eb7627 commit 63d3ca4c1cab0c7b9c71d6c051c3b4c053eb7627 Author: Sebastian Holtermann <sebh...@xwmw.org> AuthorDate: Wed Dec 28 11:43:25 2016 +0100 Commit: Sebastian Holtermann <sebh...@xwmw.org> CommitDate: Tue Jan 10 12:49:15 2017 +0100 AUTOGEN: Make skipMoc and skipUic blacklists behave the same way Before skipMoc was a list of files that were not included in the sources. Now the skipMoc files are added to the sources as well in case they are needed for uic processing. skipMoc becomes a blacklist just like skipUic. diff --git a/Source/cmQtAutoGeneratorInitializer.cxx b/Source/cmQtAutoGeneratorInitializer.cxx index f0847b1..0ed43b1 100644 --- a/Source/cmQtAutoGeneratorInitializer.cxx +++ b/Source/cmQtAutoGeneratorInitializer.cxx @@ -100,8 +100,8 @@ static std::string GetQtMajorVersion(cmGeneratorTarget const* target) static void SetupSourceFiles(cmGeneratorTarget const* target, std::vector<std::string>& skipMoc, - std::vector<std::string>& mocSources, - std::vector<std::string>& mocHeaders, + std::vector<std::string>& sources, + std::vector<std::string>& headers, std::vector<std::string>& skipUic) { cmMakefile* makefile = target->Target->GetMakefile(); @@ -113,26 +113,39 @@ static void SetupSourceFiles(cmGeneratorTarget const* target, for (std::vector<cmSourceFile*>::const_iterator fileIt = srcFiles.begin(); fileIt != srcFiles.end(); ++fileIt) { cmSourceFile* sf = *fileIt; + const cmSystemTools::FileFormat fileType = + cmSystemTools::GetFileFormat(sf->GetExtension().c_str()); + + if (!(fileType == cmSystemTools::CXX_FILE_FORMAT) && + !(fileType == cmSystemTools::HEADER_FILE_FORMAT)) { + continue; + } + if (cmSystemTools::IsOn(sf->GetPropertyForUser("GENERATED"))) { + continue; + } + const bool fileSkipUic = + cmSystemTools::IsOn(sf->GetPropertyForUser("SKIP_AUTOUIC")); + const bool fileSkipMoc = + cmSystemTools::IsOn(sf->GetPropertyForUser("SKIP_AUTOMOC")); + if (fileSkipUic && fileSkipMoc) { + continue; + } + + // Use file const std::string absFile = cmsys::SystemTools::GetRealPath(sf->GetFullPath()); - const std::string ext = sf->GetExtension(); - - if (cmSystemTools::IsOn(sf->GetPropertyForUser("SKIP_AUTOUIC"))) { + // Add file name to sources or headers list + if (fileType == cmSystemTools::CXX_FILE_FORMAT) { + sources.push_back(absFile); + } else if (fileType == cmSystemTools::HEADER_FILE_FORMAT) { + headers.push_back(absFile); + } + // Add file name to skip lists on demand + if (fileSkipUic) { skipUic.push_back(absFile); } - - if (!cmSystemTools::IsOn(sf->GetPropertyForUser("GENERATED"))) { - if (cmSystemTools::IsOn(sf->GetPropertyForUser("SKIP_AUTOMOC"))) { - skipMoc.push_back(absFile); - } else { - cmSystemTools::FileFormat fileType = - cmSystemTools::GetFileFormat(ext.c_str()); - if (fileType == cmSystemTools::CXX_FILE_FORMAT) { - mocSources.push_back(absFile); - } else if (fileType == cmSystemTools::HEADER_FILE_FORMAT) { - mocHeaders.push_back(absFile); - } - } + if (fileSkipMoc) { + skipMoc.push_back(absFile); } } } diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index 5877619..4b5e113 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -89,6 +89,12 @@ static std::string ReadAll(const std::string& filename) return stream.str(); } +static bool ListContains(const std::vector<std::string>& list, + const std::string& entry) +{ + return (std::find(list.begin(), list.end(), entry) != list.end()); +} + cmQtAutoGenerators::cmQtAutoGenerators() : Verbose(cmsys::SystemTools::HasEnv("VERBOSE")) , ColorOutput(true) @@ -502,56 +508,35 @@ bool cmQtAutoGenerators::RunAutogen(cmMakefile* makefile) // key = moc source filepath, value = moc output filepath std::map<std::string, std::string> includedMocs; - // collect all headers which may need to be mocced + std::map<std::string, std::string> notIncludedMocs; + std::map<std::string, std::vector<std::string> > includedUis; + // collects all headers which may need to be mocced std::set<std::string> headerFiles; - const std::vector<std::string>& headerExtensions = - makefile->GetCMakeInstance()->GetHeaderExtensions(); - - std::map<std::string, std::vector<std::string> > includedUis; - std::map<std::string, std::vector<std::string> > skippedUis; - - for (std::vector<std::string>::const_iterator it = this->Sources.begin(); - it != this->Sources.end(); ++it) { - const std::string& absFilename = *it; - const bool skipUic = std::find(this->SkipUic.begin(), this->SkipUic.end(), - absFilename) != this->SkipUic.end(); - std::map<std::string, std::vector<std::string> >& uiFiles = - skipUic ? skippedUis : includedUis; - if (this->Verbose) { - std::ostringstream err; - err << "AUTOGEN: Checking " << absFilename << std::endl; - this->LogInfo(err.str()); - } - // Parse source file for MOC/UIC - if (!this->ParseSourceFile(absFilename, headerExtensions, includedMocs, - uiFiles, this->MocRelaxedMode)) { - return false; - } - // Find additional headers - this->SearchHeadersForCppFile(absFilename, headerExtensions, headerFiles); - } + // Parse sources + { + const std::vector<std::string>& headerExtensions = + makefile->GetCMakeInstance()->GetHeaderExtensions(); - for (std::vector<std::string>::const_iterator it = this->SkipMoc.begin(); - it != this->SkipMoc.end(); ++it) { - if (std::find(this->SkipUic.begin(), this->SkipUic.end(), *it) != - this->SkipUic.end()) { + for (std::vector<std::string>::const_iterator it = this->Sources.begin(); + it != this->Sources.end(); ++it) { const std::string& absFilename = *it; - if (this->Verbose) { - std::ostringstream err; - err << "AUTOGEN: Checking " << absFilename << std::endl; - this->LogInfo(err.str()); + // Parse source file for MOC/UIC + if (!this->ParseSourceFile(absFilename, headerExtensions, includedMocs, + includedUis, this->MocRelaxedMode)) { + return false; } - this->ParseForUic(absFilename, includedUis); + // Find additional headers + this->SearchHeadersForCppFile(absFilename, headerExtensions, + headerFiles); } } + // Parse headers headerFiles.insert(this->Headers.begin(), this->Headers.end()); - - // key = moc source filepath, value = moc output filename - std::map<std::string, std::string> notIncludedMocs; this->ParseHeaders(headerFiles, includedMocs, notIncludedMocs, includedUis); + // Generate files if (!this->MocExecutable.empty()) { if (!this->GenerateMocFiles(includedMocs, notIncludedMocs)) { return false; @@ -588,11 +573,13 @@ bool cmQtAutoGenerators::ParseSourceFile( << "The file is empty\n"; this->LogWarning(err.str()); } else { - // Parse source contents for UIC - this->ParseContentForUic(absFilename, contentsString, includedUis); // Parse source contents for MOC success = this->ParseContentForMoc( absFilename, contentsString, headerExtensions, includedMocs, relaxed); + // Parse source contents for UIC + if (success) { + this->ParseContentForUic(absFilename, contentsString, includedUis); + } } return success; } @@ -616,31 +603,21 @@ bool cmQtAutoGenerators::requiresMocing(const std::string& text, return false; } -void cmQtAutoGenerators::ParseForUic( - const std::string& absFilename, +void cmQtAutoGenerators::ParseContentForUic( + const std::string& absFilename, const std::string& contentsString, std::map<std::string, std::vector<std::string> >& includedUis) { - if (this->UicExecutable.empty()) { + if (this->UicExecutable.empty() || + ListContains(this->SkipUic, absFilename)) { return; } - const std::string contentsString = ReadAll(absFilename); - if (contentsString.empty()) { + + if (this->Verbose) { std::ostringstream err; - err << "AUTOGEN: warning: " << absFilename << ": file is empty\n" - << std::endl; - this->LogWarning(err.str()); - return; + err << "AUTOUIC: Checking " << absFilename << "\n"; + this->LogInfo(err.str()); } - this->ParseContentForUic(absFilename, contentsString, includedUis); -} -void cmQtAutoGenerators::ParseContentForUic( - const std::string& absFilename, const std::string& contentsString, - std::map<std::string, std::vector<std::string> >& includedUis) -{ - if (this->UicExecutable.empty()) { - return; - } const std::string realName = cmsys::SystemTools::GetRealPath(absFilename); const char* contentChars = contentsString.c_str(); if (strstr(contentChars, "ui_") != CM_NULLPTR) { @@ -664,10 +641,17 @@ bool cmQtAutoGenerators::ParseContentForMoc( const std::vector<std::string>& headerExtensions, std::map<std::string, std::string>& includedMocs, bool relaxed) { - if (this->MocExecutable.empty()) { + if (this->MocExecutable.empty() || + ListContains(this->SkipMoc, absFilename)) { return true; } + if (this->Verbose) { + std::ostringstream err; + err << "AUTOMOC: Checking " << absFilename << "\n"; + this->LogInfo(err.str()); + } + const std::string scannedFileAbsPath = cmsys::SystemTools::GetFilenamePath( cmsys::SystemTools::GetRealPath(absFilename)) + @@ -887,11 +871,14 @@ void cmQtAutoGenerators::ParseHeaders( const std::string& headerName = *hIt; const std::string contents = ReadAll(headerName); + // Parse header content for MOC if (!this->MocExecutable.empty() && - includedMocs.find(headerName) == includedMocs.end()) { + !ListContains(this->SkipMoc, headerName) && + (includedMocs.find(headerName) == includedMocs.end())) { + if (this->Verbose) { std::ostringstream err; - err << "AUTOGEN: Checking " << headerName << std::endl; + err << "AUTOMOC: Checking " << headerName << "\n"; this->LogInfo(err.str()); } @@ -903,6 +890,8 @@ void cmQtAutoGenerators::ParseHeaders( ".cpp"; } } + + // Parse header content for UIC this->ParseContentForUic(headerName, contents, includedUis); } } https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=6ae19bf32e232beb59a0c427d82c0761e8248ab8 commit 6ae19bf32e232beb59a0c427d82c0761e8248ab8 Author: Sebastian Holtermann <sebh...@xwmw.org> AuthorDate: Wed Dec 28 10:25:16 2016 +0100 Commit: Sebastian Holtermann <sebh...@xwmw.org> CommitDate: Tue Jan 10 12:49:14 2017 +0100 AUTOGEN: Generators: Add dedicated method for moc content parsing diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index 33550b0..5877619 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -580,19 +580,90 @@ bool cmQtAutoGenerators::ParseSourceFile( std::map<std::string, std::string>& includedMocs, std::map<std::string, std::vector<std::string> >& includedUis, bool relaxed) { + bool success = true; const std::string contentsString = ReadAll(absFilename); if (contentsString.empty()) { std::ostringstream err; err << "AUTOGEN: warning: " << absFilename << "\n" << "The file is empty\n"; this->LogWarning(err.str()); - return true; + } else { + // Parse source contents for UIC + this->ParseContentForUic(absFilename, contentsString, includedUis); + // Parse source contents for MOC + success = this->ParseContentForMoc( + absFilename, contentsString, headerExtensions, includedMocs, relaxed); + } + return success; +} + +bool cmQtAutoGenerators::requiresMocing(const std::string& text, + std::string& macroName) +{ + // Run a simple check before an expensive regular expression check + if (strstr(text.c_str(), "Q_OBJECT") != CM_NULLPTR) { + if (this->RegExpQObject.find(text)) { + macroName = "Q_OBJECT"; + return true; + } + } + if (strstr(text.c_str(), "Q_GADGET") != CM_NULLPTR) { + if (this->RegExpQGadget.find(text)) { + macroName = "Q_GADGET"; + return true; + } } + return false; +} - // Parse source contents for UIC +void cmQtAutoGenerators::ParseForUic( + const std::string& absFilename, + std::map<std::string, std::vector<std::string> >& includedUis) +{ + if (this->UicExecutable.empty()) { + return; + } + const std::string contentsString = ReadAll(absFilename); + if (contentsString.empty()) { + std::ostringstream err; + err << "AUTOGEN: warning: " << absFilename << ": file is empty\n" + << std::endl; + this->LogWarning(err.str()); + return; + } this->ParseContentForUic(absFilename, contentsString, includedUis); +} - // Continue with moc parsing on demand +void cmQtAutoGenerators::ParseContentForUic( + const std::string& absFilename, const std::string& contentsString, + std::map<std::string, std::vector<std::string> >& includedUis) +{ + if (this->UicExecutable.empty()) { + return; + } + const std::string realName = cmsys::SystemTools::GetRealPath(absFilename); + const char* contentChars = contentsString.c_str(); + if (strstr(contentChars, "ui_") != CM_NULLPTR) { + while (this->RegExpUicInclude.find(contentChars)) { + const std::string currentUi = this->RegExpUicInclude.match(1); + const std::string basename = + cmsys::SystemTools::GetFilenameWithoutLastExtension(currentUi); + // basename should be the part of the ui filename used for + // finding the correct header, so we need to remove the ui_ part + includedUis[realName].push_back(basename.substr(3)); + contentChars += this->RegExpUicInclude.end(); + } + } +} + +/** + * @return True on success + */ +bool cmQtAutoGenerators::ParseContentForMoc( + const std::string& absFilename, const std::string& contentsString, + const std::vector<std::string>& headerExtensions, + std::map<std::string, std::string>& includedMocs, bool relaxed) +{ if (this->MocExecutable.empty()) { return true; } @@ -775,65 +846,6 @@ bool cmQtAutoGenerators::ParseSourceFile( return true; } -bool cmQtAutoGenerators::requiresMocing(const std::string& text, - std::string& macroName) -{ - // Run a simple check before an expensive regular expression check - if (strstr(text.c_str(), "Q_OBJECT") != CM_NULLPTR) { - if (this->RegExpQObject.find(text)) { - macroName = "Q_OBJECT"; - return true; - } - } - if (strstr(text.c_str(), "Q_GADGET") != CM_NULLPTR) { - if (this->RegExpQGadget.find(text)) { - macroName = "Q_GADGET"; - return true; - } - } - return false; -} - -void cmQtAutoGenerators::ParseForUic( - const std::string& absFilename, - std::map<std::string, std::vector<std::string> >& includedUis) -{ - if (this->UicExecutable.empty()) { - return; - } - const std::string contentsString = ReadAll(absFilename); - if (contentsString.empty()) { - std::ostringstream err; - err << "AUTOGEN: warning: " << absFilename << ": file is empty\n" - << std::endl; - this->LogWarning(err.str()); - return; - } - this->ParseContentForUic(absFilename, contentsString, includedUis); -} - -void cmQtAutoGenerators::ParseContentForUic( - const std::string& absFilename, const std::string& contentsString, - std::map<std::string, std::vector<std::string> >& includedUis) -{ - if (this->UicExecutable.empty()) { - return; - } - const std::string realName = cmsys::SystemTools::GetRealPath(absFilename); - const char* contentChars = contentsString.c_str(); - if (strstr(contentChars, "ui_") != CM_NULLPTR) { - while (this->RegExpUicInclude.find(contentChars)) { - const std::string currentUi = this->RegExpUicInclude.match(1); - const std::string basename = - cmsys::SystemTools::GetFilenameWithoutLastExtension(currentUi); - // basename should be the part of the ui filename used for - // finding the correct header, so we need to remove the ui_ part - includedUis[realName].push_back(basename.substr(3)); - contentChars += this->RegExpUicInclude.end(); - } - } -} - void cmQtAutoGenerators::SearchHeadersForCppFile( const std::string& absFilename, const std::vector<std::string>& headerExtensions, diff --git a/Source/cmQtAutoGenerators.h b/Source/cmQtAutoGenerators.h index f86e7c3..dac23d9 100644 --- a/Source/cmQtAutoGenerators.h +++ b/Source/cmQtAutoGenerators.h @@ -72,6 +72,12 @@ private: const std::string& fileName, const std::string& contentsString, std::map<std::string, std::vector<std::string> >& includedUis); + bool ParseContentForMoc(const std::string& absFilename, + const std::string& contentsString, + const std::vector<std::string>& headerExtensions, + std::map<std::string, std::string>& includedMocs, + bool relaxed); + void ParseForUic( const std::string& fileName, std::map<std::string, std::vector<std::string> >& includedUis); https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=9986da4f0f2f49c0d7d260f9d21deaa906708376 commit 9986da4f0f2f49c0d7d260f9d21deaa906708376 Author: Sebastian Holtermann <sebh...@xwmw.org> AuthorDate: Tue Dec 27 19:08:23 2016 +0100 Commit: Sebastian Holtermann <sebh...@xwmw.org> CommitDate: Tue Jan 10 12:49:14 2017 +0100 AUTOGEN: Generators: Split config SKIP_MOC and SKIP_UIC into vectors diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index 5a370fe..33550b0 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -227,7 +227,8 @@ bool cmQtAutoGenerators::ReadAutogenInfoFile( this->Headers); // - Moc - this->SkipMoc = makefile->GetSafeDefinition("AM_SKIP_MOC"); + cmSystemTools::ExpandListArgument(makefile->GetSafeDefinition("AM_SKIP_MOC"), + this->SkipMoc); { std::string compileDefsPropOrig = "AM_MOC_COMPILE_DEFINITIONS"; std::string compileDefsProp = compileDefsPropOrig; @@ -254,7 +255,8 @@ bool cmQtAutoGenerators::ReadAutogenInfoFile( this->MocOptionsStr = makefile->GetSafeDefinition("AM_MOC_OPTIONS"); // - Uic - this->SkipUic = makefile->GetSafeDefinition("AM_SKIP_UIC"); + cmSystemTools::ExpandListArgument(makefile->GetSafeDefinition("AM_SKIP_UIC"), + this->SkipUic); { const char* uicOptionsFiles = makefile->GetSafeDefinition("AM_UIC_OPTIONS_FILES"); @@ -508,14 +510,12 @@ bool cmQtAutoGenerators::RunAutogen(cmMakefile* makefile) std::map<std::string, std::vector<std::string> > includedUis; std::map<std::string, std::vector<std::string> > skippedUis; - std::vector<std::string> uicSkipped; - cmSystemTools::ExpandListArgument(this->SkipUic, uicSkipped); for (std::vector<std::string>::const_iterator it = this->Sources.begin(); it != this->Sources.end(); ++it) { const std::string& absFilename = *it; - const bool skipUic = std::find(uicSkipped.begin(), uicSkipped.end(), - absFilename) != uicSkipped.end(); + const bool skipUic = std::find(this->SkipUic.begin(), this->SkipUic.end(), + absFilename) != this->SkipUic.end(); std::map<std::string, std::vector<std::string> >& uiFiles = skipUic ? skippedUis : includedUis; if (this->Verbose) { @@ -532,21 +532,17 @@ bool cmQtAutoGenerators::RunAutogen(cmMakefile* makefile) this->SearchHeadersForCppFile(absFilename, headerExtensions, headerFiles); } - { - std::vector<std::string> mocSkipped; - cmSystemTools::ExpandListArgument(this->SkipMoc, mocSkipped); - for (std::vector<std::string>::const_iterator it = mocSkipped.begin(); - it != mocSkipped.end(); ++it) { - if (std::find(uicSkipped.begin(), uicSkipped.end(), *it) != - uicSkipped.end()) { - const std::string& absFilename = *it; - if (this->Verbose) { - std::ostringstream err; - err << "AUTOGEN: Checking " << absFilename << std::endl; - this->LogInfo(err.str()); - } - this->ParseForUic(absFilename, includedUis); + for (std::vector<std::string>::const_iterator it = this->SkipMoc.begin(); + it != this->SkipMoc.end(); ++it) { + if (std::find(this->SkipUic.begin(), this->SkipUic.end(), *it) != + this->SkipUic.end()) { + const std::string& absFilename = *it; + if (this->Verbose) { + std::ostringstream err; + err << "AUTOGEN: Checking " << absFilename << std::endl; + this->LogInfo(err.str()); } + this->ParseForUic(absFilename, includedUis); } } diff --git a/Source/cmQtAutoGenerators.h b/Source/cmQtAutoGenerators.h index bffdee2..f86e7c3 100644 --- a/Source/cmQtAutoGenerators.h +++ b/Source/cmQtAutoGenerators.h @@ -119,7 +119,7 @@ private: std::vector<std::string> Sources; std::vector<std::string> Headers; // - Moc - std::string SkipMoc; + std::vector<std::string> SkipMoc; std::string MocCompileDefinitionsStr; std::string MocIncludesStr; std::string MocOptionsStr; @@ -129,7 +129,7 @@ private: std::list<std::string> MocDefinitions; std::vector<std::string> MocOptions; // - Uic - std::string SkipUic; + std::vector<std::string> SkipUic; std::vector<std::string> UicTargetOptions; std::map<std::string, std::string> UicOptions; // - Rcc https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=d51cc88e844c78c01c1616e6a2fb102c0682dd00 commit d51cc88e844c78c01c1616e6a2fb102c0682dd00 Author: Sebastian Holtermann <sebh...@xwmw.org> AuthorDate: Tue Dec 27 19:03:14 2016 +0100 Commit: Sebastian Holtermann <sebh...@xwmw.org> CommitDate: Tue Jan 10 12:49:14 2017 +0100 AUTOGEN: Generators: Split config headers/sources into vector diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index f2f1505..5a370fe 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -221,8 +221,10 @@ bool cmQtAutoGenerators::ReadAutogenInfoFile( this->RccExecutable = makefile->GetSafeDefinition("AM_QT_RCC_EXECUTABLE"); // - File Lists - this->Sources = makefile->GetSafeDefinition("AM_SOURCES"); - this->Headers = makefile->GetSafeDefinition("AM_HEADERS"); + cmSystemTools::ExpandListArgument(makefile->GetSafeDefinition("AM_SOURCES"), + this->Sources); + cmSystemTools::ExpandListArgument(makefile->GetSafeDefinition("AM_HEADERS"), + this->Headers); // - Moc this->SkipMoc = makefile->GetSafeDefinition("AM_SKIP_MOC"); @@ -501,9 +503,6 @@ bool cmQtAutoGenerators::RunAutogen(cmMakefile* makefile) // collect all headers which may need to be mocced std::set<std::string> headerFiles; - std::vector<std::string> sourceFiles; - cmSystemTools::ExpandListArgument(this->Sources, sourceFiles); - const std::vector<std::string>& headerExtensions = makefile->GetCMakeInstance()->GetHeaderExtensions(); @@ -512,13 +511,13 @@ bool cmQtAutoGenerators::RunAutogen(cmMakefile* makefile) std::vector<std::string> uicSkipped; cmSystemTools::ExpandListArgument(this->SkipUic, uicSkipped); - for (std::vector<std::string>::const_iterator it = sourceFiles.begin(); - it != sourceFiles.end(); ++it) { - const bool skipUic = - std::find(uicSkipped.begin(), uicSkipped.end(), *it) != uicSkipped.end(); + for (std::vector<std::string>::const_iterator it = this->Sources.begin(); + it != this->Sources.end(); ++it) { + const std::string& absFilename = *it; + const bool skipUic = std::find(uicSkipped.begin(), uicSkipped.end(), + absFilename) != uicSkipped.end(); std::map<std::string, std::vector<std::string> >& uiFiles = skipUic ? skippedUis : includedUis; - const std::string& absFilename = *it; if (this->Verbose) { std::ostringstream err; err << "AUTOGEN: Checking " << absFilename << std::endl; @@ -551,9 +550,7 @@ bool cmQtAutoGenerators::RunAutogen(cmMakefile* makefile) } } - std::vector<std::string> headerFilesVec; - cmSystemTools::ExpandListArgument(this->Headers, headerFilesVec); - headerFiles.insert(headerFilesVec.begin(), headerFilesVec.end()); + headerFiles.insert(this->Headers.begin(), this->Headers.end()); // key = moc source filepath, value = moc output filename std::map<std::string, std::string> notIncludedMocs; diff --git a/Source/cmQtAutoGenerators.h b/Source/cmQtAutoGenerators.h index c6fe3b6..bffdee2 100644 --- a/Source/cmQtAutoGenerators.h +++ b/Source/cmQtAutoGenerators.h @@ -116,8 +116,8 @@ private: std::string UicExecutable; std::string RccExecutable; // - File lists - std::string Sources; - std::string Headers; + std::vector<std::string> Sources; + std::vector<std::string> Headers; // - Moc std::string SkipMoc; std::string MocCompileDefinitionsStr; https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=cf1d5a9cdba49a2e9f08879d756ae118b22bfc6a commit cf1d5a9cdba49a2e9f08879d756ae118b22bfc6a Author: Sebastian Holtermann <sebh...@xwmw.org> AuthorDate: Tue Dec 27 18:55:51 2016 +0100 Commit: Sebastian Holtermann <sebh...@xwmw.org> CommitDate: Tue Jan 10 12:49:14 2017 +0100 AUTOGEN: Generators: Rename ParseForUic method diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index 561e566..f2f1505 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -597,7 +597,7 @@ bool cmQtAutoGenerators::ParseSourceFile( } // Parse source contents for UIC - this->ParseForUic(absFilename, contentsString, includedUis); + this->ParseContentForUic(absFilename, contentsString, includedUis); // Continue with moc parsing on demand if (this->MocExecutable.empty()) { @@ -816,10 +816,10 @@ void cmQtAutoGenerators::ParseForUic( this->LogWarning(err.str()); return; } - this->ParseForUic(absFilename, contentsString, includedUis); + this->ParseContentForUic(absFilename, contentsString, includedUis); } -void cmQtAutoGenerators::ParseForUic( +void cmQtAutoGenerators::ParseContentForUic( const std::string& absFilename, const std::string& contentsString, std::map<std::string, std::vector<std::string> >& includedUis) { @@ -898,7 +898,7 @@ void cmQtAutoGenerators::ParseHeaders( ".cpp"; } } - this->ParseForUic(headerName, contents, includedUis); + this->ParseContentForUic(headerName, contents, includedUis); } } diff --git a/Source/cmQtAutoGenerators.h b/Source/cmQtAutoGenerators.h index b6bca8a..c6fe3b6 100644 --- a/Source/cmQtAutoGenerators.h +++ b/Source/cmQtAutoGenerators.h @@ -68,7 +68,7 @@ private: bool requiresMocing(const std::string& text, std::string& macroName); - void ParseForUic( + void ParseContentForUic( const std::string& fileName, const std::string& contentsString, std::map<std::string, std::vector<std::string> >& includedUis); https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=f962275987e17cf94da663a919f52b6d0c8f44f4 commit f962275987e17cf94da663a919f52b6d0c8f44f4 Author: Sebastian Holtermann <sebh...@xwmw.org> AuthorDate: Tue Dec 27 18:37:30 2016 +0100 Commit: Sebastian Holtermann <sebh...@xwmw.org> CommitDate: Tue Jan 10 12:49:14 2017 +0100 AUTOGEN: Generators: Group static function definitions diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index 6a7f828..561e566 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -80,6 +80,15 @@ static bool FileNameIsUnique(const std::string& filePath, return true; } +static std::string ReadAll(const std::string& filename) +{ + cmsys::ifstream file(filename.c_str()); + std::ostringstream stream; + stream << file.rdbuf(); + file.close(); + return stream.str(); +} + cmQtAutoGenerators::cmQtAutoGenerators() : Verbose(cmsys::SystemTools::HasEnv("VERBOSE")) , ColorOutput(true) @@ -472,15 +481,6 @@ void cmQtAutoGenerators::Init() } } -static std::string ReadAll(const std::string& filename) -{ - cmsys::ifstream file(filename.c_str()); - std::ostringstream stream; - stream << file.rdbuf(); - file.close(); - return stream.str(); -} - bool cmQtAutoGenerators::RunAutogen(cmMakefile* makefile) { // If settings changed everything needs to be re-generated. https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=c736c41ad192c89e1c74751a8f401c75955f5f3b commit c736c41ad192c89e1c74751a8f401c75955f5f3b Author: Sebastian Holtermann <sebh...@xwmw.org> AuthorDate: Tue Dec 27 14:52:49 2016 +0100 Commit: Sebastian Holtermann <sebh...@xwmw.org> CommitDate: Tue Jan 10 12:49:14 2017 +0100 AUTOGEN: Generators: Use precompiled regular expressions diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index 8439f2a..6a7f828 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -6,7 +6,6 @@ #include <assert.h> #include <cmConfigure.h> #include <cmsys/FStream.hxx> -#include <cmsys/RegularExpression.hxx> #include <cmsys/Terminal.h> #include <iostream> #include <sstream> @@ -28,27 +27,6 @@ #include <unistd.h> #endif -static bool requiresMocing(const std::string& text, std::string& macroName) -{ - // this simple check is much much faster than the regexp - if (strstr(text.c_str(), "Q_OBJECT") == CM_NULLPTR && - strstr(text.c_str(), "Q_GADGET") == CM_NULLPTR) { - return false; - } - - cmsys::RegularExpression qObjectRegExp("[\n][ \t]*Q_OBJECT[^a-zA-Z0-9_]"); - if (qObjectRegExp.find(text)) { - macroName = "Q_OBJECT"; - return true; - } - cmsys::RegularExpression qGadgetRegExp("[\n][ \t]*Q_GADGET[^a-zA-Z0-9_]"); - if (qGadgetRegExp.find(text)) { - macroName = "Q_GADGET"; - return true; - } - return false; -} - static std::string findMatchingHeader( const std::string& absPath, const std::string& mocSubDir, const std::string& basename, @@ -120,6 +98,15 @@ cmQtAutoGenerators::cmQtAutoGenerators() this->ColorOutput = false; } } + + // Precompile regular expressions + this->RegExpQObject.compile("[\n][ \t]*Q_OBJECT[^a-zA-Z0-9_]"); + this->RegExpQGadget.compile("[\n][ \t]*Q_GADGET[^a-zA-Z0-9_]"); + this->RegExpMocInclude.compile( + "[\n][ \t]*#[ \t]*include[ \t]+" + "[\"<](([^ \">]+/)?moc_[^ \">/]+\\.cpp|[^ \">]+\\.moc)[\">]"); + this->RegExpUicInclude.compile("[\n][ \t]*#[ \t]*include[ \t]+" + "[\"<](([^ \">]+/)?ui_[^ \">/]+\\.h)[\">]"); } void cmQtAutoGenerators::MergeUicOptions( @@ -600,10 +587,6 @@ bool cmQtAutoGenerators::ParseSourceFile( std::map<std::string, std::string>& includedMocs, std::map<std::string, std::vector<std::string> >& includedUis, bool relaxed) { - cmsys::RegularExpression mocIncludeRegExp( - "[\n][ \t]*#[ \t]*include[ \t]+" - "[\"<](([^ \">]+/)?moc_[^ \">/]+\\.cpp|[^ \">]+\\.moc)[\">]"); - const std::string contentsString = ReadAll(absFilename); if (contentsString.empty()) { std::ostringstream err; @@ -629,7 +612,7 @@ bool cmQtAutoGenerators::ParseSourceFile( cmsys::SystemTools::GetFilenameWithoutLastExtension(absFilename); std::string macroName; - const bool requiresMoc = requiresMocing(contentsString, macroName); + const bool requiresMoc = this->requiresMocing(contentsString, macroName); bool ownDotMocIncluded = false; bool ownMocUnderscoreIncluded = false; std::string ownMocUnderscoreFile; @@ -642,8 +625,8 @@ bool cmQtAutoGenerators::ParseSourceFile( if (strstr(contentsString.c_str(), "moc") != CM_NULLPTR) { // Iterate over all included moc files const char* contentChars = contentsString.c_str(); - while (mocIncludeRegExp.find(contentChars)) { - const std::string currentMoc = mocIncludeRegExp.match(1); + while (this->RegExpMocInclude.find(contentChars)) { + const std::string currentMoc = this->RegExpMocInclude.match(1); // Basename of the current moc include std::string basename = cmsys::SystemTools::GetFilenameWithoutLastExtension(currentMoc); @@ -758,7 +741,7 @@ bool cmQtAutoGenerators::ParseSourceFile( } } // Forward content pointer - contentChars += mocIncludeRegExp.end(); + contentChars += this->RegExpMocInclude.end(); } } @@ -799,6 +782,25 @@ bool cmQtAutoGenerators::ParseSourceFile( return true; } +bool cmQtAutoGenerators::requiresMocing(const std::string& text, + std::string& macroName) +{ + // Run a simple check before an expensive regular expression check + if (strstr(text.c_str(), "Q_OBJECT") != CM_NULLPTR) { + if (this->RegExpQObject.find(text)) { + macroName = "Q_OBJECT"; + return true; + } + } + if (strstr(text.c_str(), "Q_GADGET") != CM_NULLPTR) { + if (this->RegExpQGadget.find(text)) { + macroName = "Q_GADGET"; + return true; + } + } + return false; +} + void cmQtAutoGenerators::ParseForUic( const std::string& absFilename, std::map<std::string, std::vector<std::string> >& includedUis) @@ -825,20 +827,16 @@ void cmQtAutoGenerators::ParseForUic( return; } const std::string realName = cmsys::SystemTools::GetRealPath(absFilename); - cmsys::RegularExpression uiIncludeRegExp( - "[\n][ \t]*#[ \t]*include[ \t]+" - "[\"<](([^ \">]+/)?ui_[^ \">/]+\\.h)[\">]"); - const char* contentChars = contentsString.c_str(); if (strstr(contentChars, "ui_") != CM_NULLPTR) { - while (uiIncludeRegExp.find(contentChars)) { - const std::string currentUi = uiIncludeRegExp.match(1); + while (this->RegExpUicInclude.find(contentChars)) { + const std::string currentUi = this->RegExpUicInclude.match(1); const std::string basename = cmsys::SystemTools::GetFilenameWithoutLastExtension(currentUi); // basename should be the part of the ui filename used for // finding the correct header, so we need to remove the ui_ part includedUis[realName].push_back(basename.substr(3)); - contentChars += uiIncludeRegExp.end(); + contentChars += this->RegExpUicInclude.end(); } } } @@ -893,7 +891,7 @@ void cmQtAutoGenerators::ParseHeaders( } std::string macroName; - if (requiresMocing(contents, macroName)) { + if (this->requiresMocing(contents, macroName)) { notIncludedMocs[headerName] = fpathCheckSum.getPart(headerName) + "/moc_" + cmsys::SystemTools::GetFilenameWithoutLastExtension(headerName) + diff --git a/Source/cmQtAutoGenerators.h b/Source/cmQtAutoGenerators.h index 08f98b5..b6bca8a 100644 --- a/Source/cmQtAutoGenerators.h +++ b/Source/cmQtAutoGenerators.h @@ -5,6 +5,7 @@ #include <cmConfigure.h> // IWYU pragma: keep #include <cmFilePathChecksum.h> +#include <cmsys/RegularExpression.hxx> #include <list> #include <map> @@ -65,6 +66,8 @@ private: std::map<std::string, std::string>& notIncludedMocs, std::map<std::string, std::vector<std::string> >& includedUis); + bool requiresMocing(const std::string& text, std::string& macroName); + void ParseForUic( const std::string& fileName, const std::string& contentsString, std::map<std::string, std::vector<std::string> >& includedUis); @@ -138,6 +141,10 @@ private: std::string OldCompileSettingsStr; // - Utility cmFilePathChecksum fpathCheckSum; + cmsys::RegularExpression RegExpQObject; + cmsys::RegularExpression RegExpQGadget; + cmsys::RegularExpression RegExpMocInclude; + cmsys::RegularExpression RegExpUicInclude; // - Flags bool IncludeProjectDirsBefore; bool Verbose; https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=cbd650c2642e40369eaa53d20dafee6cdccae4af commit cbd650c2642e40369eaa53d20dafee6cdccae4af Author: Sebastian Holtermann <sebh...@xwmw.org> AuthorDate: Tue Dec 27 14:26:56 2016 +0100 Commit: Sebastian Holtermann <sebh...@xwmw.org> CommitDate: Tue Jan 10 12:49:14 2017 +0100 AUTOGEN: Generators: Use unified ParseSourceFile and drop old methods diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index 41bb6f9..8439f2a 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -537,17 +537,12 @@ bool cmQtAutoGenerators::RunAutogen(cmMakefile* makefile) err << "AUTOGEN: Checking " << absFilename << std::endl; this->LogInfo(err.str()); } - if (this->MocRelaxedMode) { - if (!this->ParseCppFile(absFilename, headerExtensions, includedMocs, - uiFiles)) { - return false; - } - } else { - if (!this->StrictParseCppFile(absFilename, headerExtensions, - includedMocs, uiFiles)) { - return false; - } + // Parse source file for MOC/UIC + if (!this->ParseSourceFile(absFilename, headerExtensions, includedMocs, + uiFiles, this->MocRelaxedMode)) { + return false; } + // Find additional headers this->SearchHeadersForCppFile(absFilename, headerExtensions, headerFiles); } @@ -599,311 +594,6 @@ bool cmQtAutoGenerators::RunAutogen(cmMakefile* makefile) /** * @return True on success */ -bool cmQtAutoGenerators::ParseCppFile( - const std::string& absFilename, - const std::vector<std::string>& headerExtensions, - std::map<std::string, std::string>& includedMocs, - std::map<std::string, std::vector<std::string> >& includedUis) -{ - cmsys::RegularExpression mocIncludeRegExp( - "[\n][ \t]*#[ \t]*include[ \t]+" - "[\"<](([^ \">]+/)?moc_[^ \">/]+\\.cpp|[^ \">]+\\.moc)[\">]"); - - const std::string contentsString = ReadAll(absFilename); - if (contentsString.empty()) { - std::ostringstream err; - err << "AUTOGEN: warning: " << absFilename << ": file is empty\n" - << std::endl; - this->LogWarning(err.str()); - return true; - } - this->ParseForUic(absFilename, contentsString, includedUis); - if (this->MocExecutable.empty()) { - return true; - } - - const std::string absPath = cmsys::SystemTools::GetFilenamePath( - cmsys::SystemTools::GetRealPath(absFilename)) + - '/'; - const std::string scannedFileBasename = - cmsys::SystemTools::GetFilenameWithoutLastExtension(absFilename); - std::string macroName; - const bool requiresMoc = requiresMocing(contentsString, macroName); - bool dotMocIncluded = false; - bool mocUnderscoreIncluded = false; - std::string ownMocUnderscoreFile; - std::string ownDotMocFile; - std::string ownMocHeaderFile; - - std::string::size_type matchOffset = 0; - // first a simple string check for "moc" is *much* faster than the regexp, - // and if the string search already fails, we don't have to try the - // expensive regexp - if ((strstr(contentsString.c_str(), "moc") != CM_NULLPTR) && - (mocIncludeRegExp.find(contentsString))) { - // for every moc include in the file - do { - const std::string currentMoc = mocIncludeRegExp.match(1); - - std::string basename = - cmsys::SystemTools::GetFilenameWithoutLastExtension(currentMoc); - const bool mocUnderscoreStyle = cmHasLiteralPrefix(basename, "moc_"); - - // If the moc include is of the moc_foo.cpp style we expect - // the Q_OBJECT class declaration in a header file. - // If the moc include is of the foo.moc style we need to look for - // a Q_OBJECT macro in the current source file, if it contains the - // macro we generate the moc file from the source file. - if (mocUnderscoreStyle) { - // basename should be the part of the moc filename used for - // finding the correct header, so we need to remove the moc_ part - basename = basename.substr(4); - std::string mocSubDir = extractSubDir(absPath, currentMoc); - std::string headerToMoc = - findMatchingHeader(absPath, mocSubDir, basename, headerExtensions); - - if (!headerToMoc.empty()) { - includedMocs[headerToMoc] = currentMoc; - if (basename == scannedFileBasename) { - mocUnderscoreIncluded = true; - ownMocUnderscoreFile = currentMoc; - ownMocHeaderFile = headerToMoc; - } - } else { - std::ostringstream err; - err << "AUTOGEN: error: " << absFilename << ": The file " - << "includes the moc file \"" << currentMoc << "\", " - << "but could not find header \"" << basename << '{' - << this->JoinExts(headerExtensions) << "}\" "; - if (mocSubDir.empty()) { - err << "in " << absPath << "\n" << std::endl; - } else { - err << "neither in " << absPath << " nor in " << mocSubDir << "\n" - << std::endl; - } - this->LogError(err.str()); - return false; - } - } else { - std::string fileToMoc = absFilename; - if (!requiresMoc || basename != scannedFileBasename) { - std::string mocSubDir = extractSubDir(absPath, currentMoc); - std::string headerToMoc = - findMatchingHeader(absPath, mocSubDir, basename, headerExtensions); - if (!headerToMoc.empty()) { - // this is for KDE4 compatibility: - fileToMoc = headerToMoc; - if (!requiresMoc && basename == scannedFileBasename) { - std::ostringstream err; - err << "AUTOGEN: warning: " << absFilename - << ": The file " - "includes the moc file \"" - << currentMoc << "\", but does not contain a " << macroName - << " macro. Running moc on " - << "\"" << headerToMoc << "\" ! Include \"moc_" << basename - << ".cpp\" for a compatibility with " - "strict mode (see CMAKE_AUTOMOC_RELAXED_MODE).\n" - << std::endl; - this->LogWarning(err.str()); - } else { - std::ostringstream err; - err << "AUTOGEN: warning: " << absFilename - << ": The file " - "includes the moc file \"" - << currentMoc << "\" instead of \"moc_" << basename - << ".cpp\". " - "Running moc on " - << "\"" << headerToMoc << "\" ! Include \"moc_" << basename - << ".cpp\" for compatibility with " - "strict mode (see CMAKE_AUTOMOC_RELAXED_MODE).\n" - << std::endl; - this->LogWarning(err.str()); - } - } else { - std::ostringstream err; - err << "AUTOGEN: error: " << absFilename - << ": The file " - "includes the moc file \"" - << currentMoc - << "\", which seems to be the moc file from a different " - "source file. CMake also could not find a matching " - "header.\n" - << std::endl; - this->LogError(err.str()); - return false; - } - } else { - dotMocIncluded = true; - ownDotMocFile = currentMoc; - } - includedMocs[fileToMoc] = currentMoc; - } - matchOffset += mocIncludeRegExp.end(); - } while (mocIncludeRegExp.find(contentsString.c_str() + matchOffset)); - } - - // In this case, check whether the scanned file itself contains a Q_OBJECT. - // If this is the case, the moc_foo.cpp should probably be generated from - // foo.cpp instead of foo.h, because otherwise it won't build. - // But warn, since this is not how it is supposed to be used. - if (!dotMocIncluded && requiresMoc) { - if (mocUnderscoreIncluded) { - // this is for KDE4 compatibility: - std::ostringstream err; - err << "AUTOGEN: warning: " << absFilename << ": The file " - << "contains a " << macroName << " macro, but does not " - "include " - << "\"" << scannedFileBasename << ".moc\", but instead " - "includes " - << "\"" << ownMocUnderscoreFile << "\". Running moc on " - << "\"" << absFilename << "\" ! Better include \"" - << scannedFileBasename - << ".moc\" for compatibility with " - "strict mode (see CMAKE_AUTOMOC_RELAXED_MODE).\n" - << std::endl; - this->LogWarning(err.str()); - - includedMocs[absFilename] = ownMocUnderscoreFile; - includedMocs.erase(ownMocHeaderFile); - } else { - // otherwise always error out since it will not compile: - std::ostringstream err; - err << "AUTOGEN: error: " << absFilename << ": The file " - << "contains a " << macroName << " macro, but does not " - "include " - << "\"" << scannedFileBasename << ".moc\" !\n" - << std::endl; - this->LogError(err.str()); - return false; - } - } - - return true; -} - -/** - * @return True on success - */ -bool cmQtAutoGenerators::StrictParseCppFile( - const std::string& absFilename, - const std::vector<std::string>& headerExtensions, - std::map<std::string, std::string>& includedMocs, - std::map<std::string, std::vector<std::string> >& includedUis) -{ - cmsys::RegularExpression mocIncludeRegExp( - "[\n][ \t]*#[ \t]*include[ \t]+" - "[\"<](([^ \">]+/)?moc_[^ \">/]+\\.cpp|[^ \">]+\\.moc)[\">]"); - - const std::string contentsString = ReadAll(absFilename); - if (contentsString.empty()) { - std::ostringstream err; - err << "AUTOGEN: warning: " << absFilename << ": file is empty\n" - << std::endl; - this->LogWarning(err.str()); - return true; - } - this->ParseForUic(absFilename, contentsString, includedUis); - if (this->MocExecutable.empty()) { - return true; - } - - const std::string absPath = cmsys::SystemTools::GetFilenamePath( - cmsys::SystemTools::GetRealPath(absFilename)) + - '/'; - const std::string scannedFileBasename = - cmsys::SystemTools::GetFilenameWithoutLastExtension(absFilename); - - bool dotMocIncluded = false; - - std::string::size_type matchOffset = 0; - // first a simple string check for "moc" is *much* faster than the regexp, - // and if the string search already fails, we don't have to try the - // expensive regexp - if ((strstr(contentsString.c_str(), "moc") != CM_NULLPTR) && - (mocIncludeRegExp.find(contentsString))) { - // for every moc include in the file - do { - const std::string currentMoc = mocIncludeRegExp.match(1); - - std::string basename = - cmsys::SystemTools::GetFilenameWithoutLastExtension(currentMoc); - const bool mocUnderscoreStyle = cmHasLiteralPrefix(basename, "moc_"); - - // If the moc include is of the moc_foo.cpp style we expect - // the Q_OBJECT class declaration in a header file. - // If the moc include is of the foo.moc style we need to look for - // a Q_OBJECT macro in the current source file, if it contains the - // macro we generate the moc file from the source file. - if (mocUnderscoreStyle) { - // basename should be the part of the moc filename used for - // finding the correct header, so we need to remove the moc_ part - basename = basename.substr(4); - std::string mocSubDir = extractSubDir(absPath, currentMoc); - std::string headerToMoc = - findMatchingHeader(absPath, mocSubDir, basename, headerExtensions); - - if (!headerToMoc.empty()) { - includedMocs[headerToMoc] = currentMoc; - } else { - std::ostringstream err; - err << "AUTOGEN: error: " << absFilename << " The file " - << "includes the moc file \"" << currentMoc << "\", " - << "but could not find header \"" << basename << '{' - << this->JoinExts(headerExtensions) << "}\" "; - if (mocSubDir.empty()) { - err << "in " << absPath << "\n" << std::endl; - } else { - err << "neither in " << absPath << " nor in " << mocSubDir << "\n" - << std::endl; - } - this->LogError(err.str()); - return false; - } - } else { - if (basename != scannedFileBasename) { - std::ostringstream err; - err << "AUTOGEN: error: " << absFilename - << ": The file " - "includes the moc file \"" - << currentMoc - << "\", which seems to be the moc file from a different " - "source file. This is not supported. " - "Include \"" - << scannedFileBasename << ".moc\" to run " - "moc on this source file.\n" - << std::endl; - this->LogError(err.str()); - return false; - } - dotMocIncluded = true; - includedMocs[absFilename] = currentMoc; - } - matchOffset += mocIncludeRegExp.end(); - } while (mocIncludeRegExp.find(contentsString.c_str() + matchOffset)); - } - - // In this case, check whether the scanned file itself contains a Q_OBJECT. - // If this is the case, the moc_foo.cpp should probably be generated from - // foo.cpp instead of foo.h, because otherwise it won't build. - // But warn, since this is not how it is supposed to be used. - std::string macroName; - if (!dotMocIncluded && requiresMocing(contentsString, macroName)) { - // otherwise always error out since it will not compile: - std::ostringstream err; - err << "AUTOGEN: error: " << absFilename << ": The file " - << "contains a " << macroName << " macro, but does not include " - << "\"" << scannedFileBasename << ".moc\" !\n" - << std::endl; - this->LogError(err.str()); - return false; - } - - return true; -} - -/** - * @return True on success - */ bool cmQtAutoGenerators::ParseSourceFile( const std::string& absFilename, const std::vector<std::string>& headerExtensions, diff --git a/Source/cmQtAutoGenerators.h b/Source/cmQtAutoGenerators.h index f6fbed3..08f98b5 100644 --- a/Source/cmQtAutoGenerators.h +++ b/Source/cmQtAutoGenerators.h @@ -48,16 +48,6 @@ private: bool GenerateQrc(const std::string& qrcInputFile, const std::string& qrcOutputFile, bool unique_n); - bool ParseCppFile( - const std::string& absFilename, - const std::vector<std::string>& headerExtensions, - std::map<std::string, std::string>& includedMocs, - std::map<std::string, std::vector<std::string> >& includedUis); - bool StrictParseCppFile( - const std::string& absFilename, - const std::vector<std::string>& headerExtensions, - std::map<std::string, std::string>& includedMocs, - std::map<std::string, std::vector<std::string> >& includedUis); bool ParseSourceFile( const std::string& absFilename, const std::vector<std::string>& headerExtensions, https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=0b1527ff3d1781380756ee72a9641b7c5c7c87cc commit 0b1527ff3d1781380756ee72a9641b7c5c7c87cc Author: Sebastian Holtermann <sebh...@xwmw.org> AuthorDate: Tue Dec 27 14:16:10 2016 +0100 Commit: Sebastian Holtermann <sebh...@xwmw.org> CommitDate: Tue Jan 10 12:49:13 2017 +0100 AUTOGEN: Generators: Introduce unified ParseSourceFile The new cmQtAutoGenerators::ParseSourceFile method combines the functionality of ParseCppFile and StrictParseCppFile in a single method to avoid code duplication. Relaxed or strict mode is selected by an additional bool argument. diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index a0949d4..41bb6f9 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -901,6 +901,214 @@ bool cmQtAutoGenerators::StrictParseCppFile( return true; } +/** + * @return True on success + */ +bool cmQtAutoGenerators::ParseSourceFile( + const std::string& absFilename, + const std::vector<std::string>& headerExtensions, + std::map<std::string, std::string>& includedMocs, + std::map<std::string, std::vector<std::string> >& includedUis, bool relaxed) +{ + cmsys::RegularExpression mocIncludeRegExp( + "[\n][ \t]*#[ \t]*include[ \t]+" + "[\"<](([^ \">]+/)?moc_[^ \">/]+\\.cpp|[^ \">]+\\.moc)[\">]"); + + const std::string contentsString = ReadAll(absFilename); + if (contentsString.empty()) { + std::ostringstream err; + err << "AUTOGEN: warning: " << absFilename << "\n" + << "The file is empty\n"; + this->LogWarning(err.str()); + return true; + } + + // Parse source contents for UIC + this->ParseForUic(absFilename, contentsString, includedUis); + + // Continue with moc parsing on demand + if (this->MocExecutable.empty()) { + return true; + } + + const std::string scannedFileAbsPath = + cmsys::SystemTools::GetFilenamePath( + cmsys::SystemTools::GetRealPath(absFilename)) + + '/'; + const std::string scannedFileBasename = + cmsys::SystemTools::GetFilenameWithoutLastExtension(absFilename); + + std::string macroName; + const bool requiresMoc = requiresMocing(contentsString, macroName); + bool ownDotMocIncluded = false; + bool ownMocUnderscoreIncluded = false; + std::string ownMocUnderscoreFile; + std::string ownMocHeaderFile; + + std::string::size_type matchOffset = 0; + // first a simple string check for "moc" is *much* faster than the regexp, + // and if the string search already fails, we don't have to try the + // expensive regexp + if (strstr(contentsString.c_str(), "moc") != CM_NULLPTR) { + // Iterate over all included moc files + const char* contentChars = contentsString.c_str(); + while (mocIncludeRegExp.find(contentChars)) { + const std::string currentMoc = mocIncludeRegExp.match(1); + // Basename of the current moc include + std::string basename = + cmsys::SystemTools::GetFilenameWithoutLastExtension(currentMoc); + + // If the moc include is of the moc_foo.cpp style we expect + // the Q_OBJECT class declaration in a header file. + // If the moc include is of the foo.moc style we need to look for + // a Q_OBJECT macro in the current source file, if it contains the + // macro we generate the moc file from the source file. + if (cmHasLiteralPrefix(basename, "moc_")) { + // Include: moc_FOO.cxx + // basename should be the part of the moc filename used for + // finding the correct header, so we need to remove the moc_ part + basename = basename.substr(4); + const std::string mocSubDir = + extractSubDir(scannedFileAbsPath, currentMoc); + const std::string headerToMoc = findMatchingHeader( + scannedFileAbsPath, mocSubDir, basename, headerExtensions); + + if (!headerToMoc.empty()) { + includedMocs[headerToMoc] = currentMoc; + if (relaxed && (basename == scannedFileBasename)) { + ownMocUnderscoreIncluded = true; + ownMocUnderscoreFile = currentMoc; + ownMocHeaderFile = headerToMoc; + } + } else { + std::ostringstream err; + err << "AUTOGEN: error: " << absFilename << "\n" + << "The file includes the moc file \"" << currentMoc + << "\", but could not find header \"" << basename << '{' + << this->JoinExts(headerExtensions) << "}\" "; + if (mocSubDir.empty()) { + err << "in " << scannedFileAbsPath << "\n"; + } else { + err << "neither in " << scannedFileAbsPath << " nor in " + << mocSubDir << "\n"; + } + this->LogError(err.str()); + return false; + } + } else { + // Include: FOO.moc + std::string fileToMoc; + if (relaxed) { + // Mode: Relaxed + if (!requiresMoc || basename != scannedFileBasename) { + const std::string mocSubDir = + extractSubDir(scannedFileAbsPath, currentMoc); + const std::string headerToMoc = findMatchingHeader( + scannedFileAbsPath, mocSubDir, basename, headerExtensions); + if (!headerToMoc.empty()) { + // This is for KDE4 compatibility: + fileToMoc = headerToMoc; + if (!requiresMoc && basename == scannedFileBasename) { + std::ostringstream err; + err << "AUTOMOC: warning: " << absFilename << "\n" + << "The file includes the moc file \"" << currentMoc + << "\", but does not contain a " << macroName + << " macro. Running moc on " + << "\"" << headerToMoc << "\" ! Include \"moc_" << basename + << ".cpp\" for a compatibility with " + "strict mode (see CMAKE_AUTOMOC_RELAXED_MODE).\n"; + this->LogWarning(err.str()); + } else { + std::ostringstream err; + err << "AUTOMOC: warning: " << absFilename << "\n" + << "The file includes the moc file \"" << currentMoc + << "\" instead of \"moc_" << basename + << ".cpp\". Running moc on " + << "\"" << headerToMoc << "\" ! Include \"moc_" << basename + << ".cpp\" for compatibility with " + "strict mode (see CMAKE_AUTOMOC_RELAXED_MODE).\n"; + this->LogWarning(err.str()); + } + } else { + std::ostringstream err; + err << "AUTOMOC: error: " << absFilename << "\n" + << "The file includes the moc file \"" << currentMoc + << "\", which seems to be the moc file from a different " + "source file. CMake also could not find a matching " + "header.\n"; + this->LogError(err.str()); + return false; + } + } else { + // Include self + fileToMoc = absFilename; + ownDotMocIncluded = true; + } + } else { + // Mode: Strict + if (basename != scannedFileBasename) { + // Don't allow FOO.moc include other than self in strict mode + std::ostringstream err; + err << "AUTOMOC: error: " << absFilename << "\n" + << "The file includes the moc file \"" << currentMoc + << "\", which seems to be the moc file from a different " + "source file. This is not supported. Include \"" + << scannedFileBasename + << ".moc\" to run moc on this source file.\n"; + this->LogError(err.str()); + return false; + } else { + // Include self + fileToMoc = absFilename; + ownDotMocIncluded = true; + } + } + if (!fileToMoc.empty()) { + includedMocs[fileToMoc] = currentMoc; + } + } + // Forward content pointer + contentChars += mocIncludeRegExp.end(); + } + } + + // In this case, check whether the scanned file itself contains a Q_OBJECT. + // If this is the case, the moc_foo.cpp should probably be generated from + // foo.cpp instead of foo.h, because otherwise it won't build. + // But warn, since this is not how it is supposed to be used. + if (requiresMoc && !ownDotMocIncluded) { + if (relaxed && ownMocUnderscoreIncluded) { + // This is for KDE4 compatibility: + std::ostringstream err; + err << "AUTOMOC: warning: " << absFilename << "\n" + << "The file contains a " << macroName + << " macro, but does not include " + << "\"" << scannedFileBasename << ".moc\", but instead includes " + << "\"" << ownMocUnderscoreFile << "\". Running moc on " + << "\"" << absFilename << "\" ! Better include \"" + << scannedFileBasename + << ".moc\" for compatibility with " + "strict mode (see CMAKE_AUTOMOC_RELAXED_MODE).\n"; + this->LogWarning(err.str()); + + // Use scanned source file instead of scanned header file as moc source + includedMocs[absFilename] = ownMocUnderscoreFile; + includedMocs.erase(ownMocHeaderFile); + } else { + // Otherwise always error out since it will not compile: + std::ostringstream err; + err << "AUTOMOC: error: " << absFilename << "\n" + << "The file contains a " << macroName + << " macro, but does not include " + << "\"" << scannedFileBasename << ".moc\" !\n"; + this->LogError(err.str()); + return false; + } + } + + return true; +} + void cmQtAutoGenerators::ParseForUic( const std::string& absFilename, std::map<std::string, std::vector<std::string> >& includedUis) diff --git a/Source/cmQtAutoGenerators.h b/Source/cmQtAutoGenerators.h index 24960a5..f6fbed3 100644 --- a/Source/cmQtAutoGenerators.h +++ b/Source/cmQtAutoGenerators.h @@ -58,6 +58,12 @@ private: const std::vector<std::string>& headerExtensions, std::map<std::string, std::string>& includedMocs, std::map<std::string, std::vector<std::string> >& includedUis); + bool ParseSourceFile( + const std::string& absFilename, + const std::vector<std::string>& headerExtensions, + std::map<std::string, std::string>& includedMocs, + std::map<std::string, std::vector<std::string> >& includedUis, + bool relaxed); void SearchHeadersForCppFile( const std::string& absFilename, const std::vector<std::string>& headerExtensions, https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=2b9d795e63acf723a6abd79f3195ec70476442a5 commit 2b9d795e63acf723a6abd79f3195ec70476442a5 Author: Sebastian Holtermann <sebh...@xwmw.org> AuthorDate: Tue Dec 27 10:54:54 2016 +0100 Commit: Sebastian Holtermann <sebh...@xwmw.org> CommitDate: Tue Jan 10 12:49:13 2017 +0100 AUTOGEN: Generators: Comments diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index 6543ac6..a0949d4 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -62,6 +62,7 @@ static std::string findMatchingHeader( header = sourceFilePath; break; } + // Try subdirectory instead if (!mocSubDir.empty()) { sourceFilePath = mocSubDir + basename + "." + (*ext); if (cmsys::SystemTools::FileExists(sourceFilePath.c_str())) { @@ -653,7 +654,6 @@ bool cmQtAutoGenerators::ParseCppFile( // If the moc include is of the foo.moc style we need to look for // a Q_OBJECT macro in the current source file, if it contains the // macro we generate the moc file from the source file. - // Q_OBJECT if (mocUnderscoreStyle) { // basename should be the part of the moc filename used for // finding the correct header, so we need to remove the moc_ part https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=2cfcdf757d032cdea8b980792007a6f9d749e6fb commit 2cfcdf757d032cdea8b980792007a6f9d749e6fb Author: Sebastian Holtermann <sebh...@xwmw.org> AuthorDate: Tue Dec 27 10:51:14 2016 +0100 Commit: Sebastian Holtermann <sebh...@xwmw.org> CommitDate: Tue Jan 10 12:49:13 2017 +0100 AUTOGEN: Generators: Variable rename diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index 1ada434..6543ac6 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -646,7 +646,7 @@ bool cmQtAutoGenerators::ParseCppFile( std::string basename = cmsys::SystemTools::GetFilenameWithoutLastExtension(currentMoc); - const bool moc_style = cmHasLiteralPrefix(basename, "moc_"); + const bool mocUnderscoreStyle = cmHasLiteralPrefix(basename, "moc_"); // If the moc include is of the moc_foo.cpp style we expect // the Q_OBJECT class declaration in a header file. @@ -654,7 +654,7 @@ bool cmQtAutoGenerators::ParseCppFile( // a Q_OBJECT macro in the current source file, if it contains the // macro we generate the moc file from the source file. // Q_OBJECT - if (moc_style) { + if (mocUnderscoreStyle) { // basename should be the part of the moc filename used for // finding the correct header, so we need to remove the moc_ part basename = basename.substr(4); https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=2f67aef23d4192fadb222dc79311fb5ffbbc36ce commit 2f67aef23d4192fadb222dc79311fb5ffbbc36ce Author: Sebastian Holtermann <sebh...@xwmw.org> AuthorDate: Sat Dec 24 16:28:01 2016 +0100 Commit: Sebastian Holtermann <sebh...@xwmw.org> CommitDate: Tue Jan 10 12:49:13 2017 +0100 AUTOGEN: Generators: Cleanup and optimize ParseForUic method diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index 01cc1b3..1ada434 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -931,23 +931,17 @@ void cmQtAutoGenerators::ParseForUic( "[\n][ \t]*#[ \t]*include[ \t]+" "[\"<](([^ \">]+/)?ui_[^ \">/]+\\.h)[\">]"); - std::string::size_type matchOffset = 0; - if ((strstr(contentsString.c_str(), "ui_") != CM_NULLPTR) && - (uiIncludeRegExp.find(contentsString))) { - do { + const char* contentChars = contentsString.c_str(); + if (strstr(contentChars, "ui_") != CM_NULLPTR) { + while (uiIncludeRegExp.find(contentChars)) { const std::string currentUi = uiIncludeRegExp.match(1); - - std::string basename = + const std::string basename = cmsys::SystemTools::GetFilenameWithoutLastExtension(currentUi); - // basename should be the part of the ui filename used for // finding the correct header, so we need to remove the ui_ part - basename = basename.substr(3); - - includedUis[realName].push_back(basename); - - matchOffset += uiIncludeRegExp.end(); - } while (uiIncludeRegExp.find(contentsString.c_str() + matchOffset)); + includedUis[realName].push_back(basename.substr(3)); + contentChars += uiIncludeRegExp.end(); + } } } https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=794fdf40a1bc85dded519d7c737f73690e3a6e42 commit 794fdf40a1bc85dded519d7c737f73690e3a6e42 Author: Sebastian Holtermann <sebh...@xwmw.org> AuthorDate: Sat Dec 24 16:00:09 2016 +0100 Commit: Sebastian Holtermann <sebh...@xwmw.org> CommitDate: Tue Jan 10 12:49:13 2017 +0100 AUTOGEN: Generators: Cleanup variable initialization diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index 98b3de3..01cc1b3 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -926,15 +926,12 @@ void cmQtAutoGenerators::ParseForUic( if (this->UicExecutable.empty()) { return; } + const std::string realName = cmsys::SystemTools::GetRealPath(absFilename); cmsys::RegularExpression uiIncludeRegExp( "[\n][ \t]*#[ \t]*include[ \t]+" "[\"<](([^ \">]+/)?ui_[^ \">/]+\\.h)[\">]"); std::string::size_type matchOffset = 0; - - const std::string realName = cmsys::SystemTools::GetRealPath(absFilename); - - matchOffset = 0; if ((strstr(contentsString.c_str(), "ui_") != CM_NULLPTR) && (uiIncludeRegExp.find(contentsString))) { do { https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=a1e49bb155132606ed9f590c0b62e68f2e288d0b commit a1e49bb155132606ed9f590c0b62e68f2e288d0b Author: Sebastian Holtermann <sebh...@xwmw.org> AuthorDate: Sat Dec 24 17:36:56 2016 +0100 Commit: Sebastian Holtermann <sebh...@xwmw.org> CommitDate: Tue Jan 10 12:49:13 2017 +0100 AUTOGEN: Generators: rename makeParentDirectory to MakeParentDirectory diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index a9a9c49..98b3de3 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -1113,7 +1113,7 @@ bool cmQtAutoGenerators::GenerateMocFiles( this->LogBold(msg); } // Make sure the parent directory exists - bool success = this->makeParentDirectory(this->OutMocCppFilenameAbs); + bool success = this->MakeParentDirectory(this->OutMocCppFilenameAbs); if (success) { cmsys::ofstream outfile; outfile.open(this->OutMocCppFilenameAbs.c_str(), std::ios::trunc); @@ -1154,7 +1154,7 @@ bool cmQtAutoGenerators::GenerateMoc(const std::string& sourceFile, this->LogBold("Generating MOC source " + mocFileRel); // Make sure the parent directory exists - if (!this->makeParentDirectory(mocFileAbs)) { + if (!this->MakeParentDirectory(mocFileAbs)) { this->RunMocFailed = true; return false; } @@ -1276,7 +1276,7 @@ bool cmQtAutoGenerators::GenerateUi(const std::string& realName, this->LogBold("Generating UIC header " + uicFileRel); // Make sure the parent directory exists - if (!this->makeParentDirectory(uicFileAbs)) { + if (!this->MakeParentDirectory(uicFileAbs)) { this->RunUicFailed = true; return false; } @@ -1415,7 +1415,7 @@ bool cmQtAutoGenerators::GenerateQrc(const std::string& qrcInputFile, } // Make sure the parent directory exists - if (!this->makeParentDirectory(qrcOutputFile)) { + if (!this->MakeParentDirectory(qrcOutputFile)) { this->RunRccFailed = true; return false; } @@ -1551,7 +1551,7 @@ void cmQtAutoGenerators::LogCommand(const std::vector<std::string>& command) * @brief Generates the parent directory of the given file on demand * @return True on success */ -bool cmQtAutoGenerators::makeParentDirectory(const std::string& filename) +bool cmQtAutoGenerators::MakeParentDirectory(const std::string& filename) { bool success = true; const std::string dirName = cmSystemTools::GetFilenamePath(filename); diff --git a/Source/cmQtAutoGenerators.h b/Source/cmQtAutoGenerators.h index c241579..24960a5 100644 --- a/Source/cmQtAutoGenerators.h +++ b/Source/cmQtAutoGenerators.h @@ -91,7 +91,7 @@ private: void LogError(const std::string& message); void LogCommand(const std::vector<std::string>& command); - bool makeParentDirectory(const std::string& filename); + bool MakeParentDirectory(const std::string& filename); std::string JoinExts(const std::vector<std::string>& lst); ----------------------------------------------------------------------- Summary of changes: Help/manual/cmake-properties.7.rst | 4 + Help/manual/cmake-qt.7.rst | 9 + Help/prop_sf/SKIP_AUTOGEN.rst | 8 + Help/prop_sf/SKIP_AUTOMOC.rst | 6 + Help/prop_sf/SKIP_AUTORCC.rst | 6 + Help/prop_sf/SKIP_AUTOUIC.rst | 6 + Help/prop_tgt/AUTOMOC.rst | 3 + Help/prop_tgt/AUTORCC.rst | 3 + Help/prop_tgt/AUTOUIC.rst | 3 + Help/release/dev/QtAutogen_Skip.rst | 12 + Modules/AutogenInfo.cmake.in | 8 +- Source/cmQtAutoGeneratorInitializer.cxx | 102 ++-- Source/cmQtAutoGenerators.cxx | 741 ++++++++++++-------------- Source/cmQtAutoGenerators.h | 46 +- Tests/QtAutogen/CMakeLists.txt | 63 +++ Tests/QtAutogen/skipMoc.cpp | 14 + Tests/QtAutogen/skipRcc.cpp | 9 + Tests/QtAutogen/skipSource/qItemA.cpp | 5 + Tests/QtAutogen/skipSource/qItemA.hpp | 13 + Tests/QtAutogen/skipSource/qItemB.cpp | 5 + Tests/QtAutogen/skipSource/qItemB.hpp | 13 + Tests/QtAutogen/skipSource/qItemC.cpp | 5 + Tests/QtAutogen/skipSource/qItemC.hpp | 13 + Tests/QtAutogen/skipSource/skipRccBad1.qrc | 5 + Tests/QtAutogen/skipSource/skipRccBad2.qrc | 5 + Tests/QtAutogen/skipSource/skipRccGood.qrc | 6 + Tests/QtAutogen/skipSource/skipUicGen.cpp | 7 + Tests/QtAutogen/skipSource/skipUicGen.hpp | 8 + Tests/QtAutogen/skipSource/skipUicNoGen1.cpp | 7 + Tests/QtAutogen/skipSource/skipUicNoGen1.hpp | 8 + Tests/QtAutogen/skipSource/skipUicNoGen2.cpp | 7 + Tests/QtAutogen/skipSource/skipUicNoGen2.hpp | 8 + Tests/QtAutogen/skipSource/ui_nogen1.h | 6 + Tests/QtAutogen/skipSource/ui_nogen2.h | 6 + Tests/QtAutogen/skipSource/uigen1.ui | 24 + Tests/QtAutogen/skipSource/uigen2.ui | 24 + Tests/QtAutogen/skipUic.cpp | 22 + 37 files changed, 782 insertions(+), 458 deletions(-) create mode 100644 Help/prop_sf/SKIP_AUTOGEN.rst create mode 100644 Help/prop_sf/SKIP_AUTOMOC.rst create mode 100644 Help/prop_sf/SKIP_AUTORCC.rst create mode 100644 Help/prop_sf/SKIP_AUTOUIC.rst create mode 100644 Help/release/dev/QtAutogen_Skip.rst create mode 100644 Tests/QtAutogen/skipMoc.cpp create mode 100644 Tests/QtAutogen/skipRcc.cpp create mode 100644 Tests/QtAutogen/skipSource/qItemA.cpp create mode 100644 Tests/QtAutogen/skipSource/qItemA.hpp create mode 100644 Tests/QtAutogen/skipSource/qItemB.cpp create mode 100644 Tests/QtAutogen/skipSource/qItemB.hpp create mode 100644 Tests/QtAutogen/skipSource/qItemC.cpp create mode 100644 Tests/QtAutogen/skipSource/qItemC.hpp create mode 100644 Tests/QtAutogen/skipSource/skipRccBad1.qrc create mode 100644 Tests/QtAutogen/skipSource/skipRccBad2.qrc create mode 100644 Tests/QtAutogen/skipSource/skipRccGood.qrc create mode 100644 Tests/QtAutogen/skipSource/skipUicGen.cpp create mode 100644 Tests/QtAutogen/skipSource/skipUicGen.hpp create mode 100644 Tests/QtAutogen/skipSource/skipUicNoGen1.cpp create mode 100644 Tests/QtAutogen/skipSource/skipUicNoGen1.hpp create mode 100644 Tests/QtAutogen/skipSource/skipUicNoGen2.cpp create mode 100644 Tests/QtAutogen/skipSource/skipUicNoGen2.hpp create mode 100644 Tests/QtAutogen/skipSource/ui_nogen1.h create mode 100644 Tests/QtAutogen/skipSource/ui_nogen2.h create mode 100644 Tests/QtAutogen/skipSource/uigen1.ui create mode 100644 Tests/QtAutogen/skipSource/uigen2.ui create mode 100644 Tests/QtAutogen/skipUic.cpp hooks/post-receive -- CMake _______________________________________________ Cmake-commits mailing list Cmake-commits@cmake.org http://public.kitware.com/mailman/listinfo/cmake-commits