| cmake_minimum_required(VERSION 3.9) |
| cmake_policy(SET CMP0071 NEW) |
| project(QtAutogen) |
| |
| if (QT_TEST_VERSION STREQUAL 4) |
| find_package(Qt4 REQUIRED) |
| |
| # Include this directory before using the UseQt4 file. |
| add_subdirectory(defines_test) |
| |
| include(UseQt4) |
| |
| set(QT_QTCORE_TARGET Qt4::QtCore) |
| |
| macro(qtx_wrap_cpp) |
| qt4_wrap_cpp(${ARGN}) |
| endmacro() |
| macro(qtx_generate_moc) |
| qt4_generate_moc(${ARGN}) |
| endmacro() |
| |
| else() |
| if (NOT QT_TEST_VERSION STREQUAL 5) |
| message(SEND_ERROR "Invalid Qt version specified.") |
| endif() |
| find_package(Qt5Widgets REQUIRED) |
| |
| set(QT_QTCORE_TARGET Qt5::Core) |
| |
| include_directories(${Qt5Widgets_INCLUDE_DIRS}) |
| set(QT_LIBRARIES Qt5::Widgets) |
| |
| if(Qt5_POSITION_INDEPENDENT_CODE AND CMAKE_CXX_COMPILE_OPTIONS_PIC) |
| add_definitions(${CMAKE_CXX_COMPILE_OPTIONS_PIC}) |
| endif() |
| |
| macro(qtx_wrap_cpp) |
| qt5_wrap_cpp(${ARGN}) |
| endmacro() |
| macro(qtx_generate_moc) |
| qt5_generate_moc(${ARGN}) |
| endmacro() |
| |
| endif() |
| |
| get_property(QT_COMPILE_FEATURES TARGET ${QT_QTCORE_TARGET} PROPERTY INTERFACE_COMPILE_FEATURES) |
| |
| # Qt4 moc does not support utf8 paths in _parameter files generated by |
| # qtx_wrap_cpp |
| # https://bugreports.qt.io/browse/QTBUG-35480 |
| # Do a simple check if there is are non ASCII character in the build path |
| string(REGEX MATCH "[^ -~]+" NON_ASCII_BDIR ${CMAKE_CURRENT_BINARY_DIR}) |
| if((NOT NON_ASCII_BDIR) OR (NOT QT_TEST_VERSION STREQUAL 4)) |
| set(ALLOW_WRAP_CPP TRUE) |
| endif() |
| # On windows qtx_wrap_cpp also fails in Qt5 when used on a path that |
| # contains non ASCII characters |
| if(NON_ASCII_BDIR AND WIN32) |
| set(ALLOW_WRAP_CPP FALSE) |
| endif() |
| |
| # -- Test |
| # MOC only |
| add_executable(mocOnly mocOnlySource/main.cpp mocOnlySource/StyleA.cpp mocOnlySource/StyleB.cpp) |
| set_property(TARGET mocOnly PROPERTY AUTOMOC ON) |
| target_link_libraries(mocOnly ${QT_LIBRARIES}) |
| |
| # -- Test |
| # UIC only |
| if(ALLOW_WRAP_CPP) |
| qtx_wrap_cpp(uicOnlyMoc uicOnlySource/uiconly.h) |
| add_executable(uicOnly uicOnlySource/uiconly.cpp ${uicOnlyMoc}) |
| set_property(TARGET uicOnly PROPERTY AUTOUIC ON) |
| target_link_libraries(uicOnly ${QT_LIBRARIES}) |
| endif() |
| |
| # -- Test |
| # RCC only |
| add_executable(rccOnly rccOnly.cpp rccOnlyRes.qrc) |
| set_property(TARGET rccOnly PROPERTY AUTORCC ON) |
| target_link_libraries(rccOnly ${QT_QTCORE_TARGET}) |
| |
| # -- Test |
| # RCC empty |
| add_executable(rccEmpty rccEmpty.cpp rccEmptyRes.qrc) |
| set_property(TARGET rccEmpty PROPERTY AUTORCC ON) |
| target_link_libraries(rccEmpty ${QT_QTCORE_TARGET}) |
| |
| # -- Test |
| # Add not_generated_file.qrc to the source list to get the file-level |
| # dependency, but don't generate a c++ file from it. Disable the AUTORCC |
| # feature for this target. This tests that qrc files in the sources don't |
| # have an effect on generation if AUTORCC is off. |
| add_library(empty STATIC empty.cpp not_generated_file.qrc) |
| set_target_properties(empty PROPERTIES AUTORCC OFF) |
| set_target_properties(empty PROPERTIES AUTOMOC TRUE) |
| target_link_libraries(empty no_link_language) |
| add_library(no_link_language STATIC empty.h) |
| set_target_properties(no_link_language PROPERTIES AUTOMOC TRUE) |
| # Pass Qt compiler features to targets that don't link against Qt |
| target_compile_features(no_link_language PRIVATE ${QT_COMPILE_FEATURES}) |
| target_compile_features(empty PRIVATE ${QT_COMPILE_FEATURES}) |
| |
| |
| # -- Test |
| # Test for SKIP_AUTOMOC and SKIP_AUTOGEN on an AUTOMOC enabled target |
| if(ALLOW_WRAP_CPP) |
| # Generate header mocs manually |
| qtx_wrap_cpp(skipMocWrapMoc |
| skipSource/qItemA.hpp |
| skipSource/qItemB.hpp |
| skipSource/qItemC.hpp |
| skipSource/qItemD.hpp |
| ) |
| set(skipMocSources |
| skipMoc.cpp |
| skipSource/qItemA.cpp |
| skipSource/qItemB.cpp |
| skipSource/qItemC.cpp |
| skipSource/qItemD.cpp |
| ) |
| # When cpp files are skipped, the hpp won't be processed either, |
| # unless they are mentioned in the sources - which they aren't. |
| set_property(SOURCE skipSource/qItemA.cpp PROPERTY SKIP_AUTOMOC ON) |
| set_property(SOURCE skipSource/qItemB.cpp PROPERTY SKIP_AUTOGEN ON) |
| # When hpp files are skipped, the cpp still get processed. |
| set_property(SOURCE skipSource/qItemC.hpp PROPERTY SKIP_AUTOMOC ON) |
| set_property(SOURCE skipSource/qItemD.hpp 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}) |
| endif() |
| |
| # -- Test |
| # 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 |
| # 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 |
| # MOC AUTOMOC_MACRO_NAMES |
| if (NOT QT_TEST_VERSION STREQUAL 4) |
| add_subdirectory(mocMacroName) |
| endif() |
| |
| # -- Test |
| # Tests AUTOMOC with generated sources |
| add_subdirectory(mocDepends) |
| |
| # -- Test |
| # Tests various include moc patterns |
| if(ALLOW_WRAP_CPP) |
| add_subdirectory(mocIncludeStrict) |
| add_subdirectory(mocIncludeRelaxed) |
| endif() |
| |
| # -- Test |
| # Tests policy 0071 |
| if(ALLOW_WRAP_CPP) |
| add_subdirectory(mocCMP0071) |
| endif() |
| |
| # -- Test |
| # Tests various .ui include directories |
| add_subdirectory(uicInclude) |
| |
| # -- Test |
| # OBJECT libraries |
| add_subdirectory(objectLibrary) |
| |
| # -- Test |
| # Source files with the same basename in different subdirectories |
| add_subdirectory(sameName) |
| |
| # -- Test |
| # Complex test case |
| add_subdirectory(complex) |