diff --git a/CMakeLists.txt b/CMakeLists.txt index c0f0fac13..661c60335 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,6 +16,8 @@ macro(qsk_setup_options) option(BUILD_EXAMPLES "Build qskinny examples" ON) option(BUILD_PLAYGROUND "Build qskinny playground" ON) + option(BUILD_WITH_PRECOMPILED_HEADERS "Build qskinny with precompiled headers" ON) + # we actually want to use cmake_dependent_option - minimum cmake version ?? option( BUILD_SVG2QVG_STANDALONE "Build svg2qvg without qskinny library dependency" ON ) @@ -81,7 +83,7 @@ endmacro() ############################################################################ project(QSkinny - LANGUAGES C CXX + LANGUAGES C CXX HOMEPAGE_URL "https://github.com/uwerat/qskinny" VERSION 0.8.0) @@ -103,6 +105,10 @@ qsk_setup_Qt() qsk_setup_build() qsk_setup_install() +if(BUILD_WITH_PRECOMPILED_HEADERS) +include("QskPreCompiledHeader") +endif() + add_subdirectory(src) add_subdirectory(designsystems) diff --git a/cmake/QskBuildFunctions.cmake b/cmake/QskBuildFunctions.cmake index ebc20a230..857f4096f 100644 --- a/cmake/QskBuildFunctions.cmake +++ b/cmake/QskBuildFunctions.cmake @@ -9,7 +9,7 @@ function(qsk_add_executable target) qt6_add_executable(${ARGV}) # we manually export our APIs to QML - might change in the future - set_target_properties(${target} PROPERTIES + set_target_properties(${target} PROPERTIES QT_QML_MODULE_NO_IMPORT_SCAN 1) else() add_executable(${ARGV}) @@ -18,6 +18,9 @@ function(qsk_add_executable target) set_target_properties(${target} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin ) + if(BUILD_WITH_PRECOMPILED_HEADERS) + target_precompile_headers(${target} REUSE_FROM PCH) + endif() endfunction() function(qsk_add_library target) @@ -31,6 +34,9 @@ function(qsk_add_library target) set_target_properties(${target} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib ) + if(BUILD_WITH_PRECOMPILED_HEADERS) + target_precompile_headers(${target} REUSE_FROM PCH) + endif() endfunction() function(qsk_add_plugin target TYPE CLASS_NAME) @@ -79,6 +85,9 @@ function(qsk_add_plugin target TYPE CLASS_NAME) set_target_properties(${target} PROPERTIES INSTALL_RPATH "\${ORIGIN}/../../lib" ) + if(BUILD_WITH_PRECOMPILED_HEADERS) + target_precompile_headers(${target} REUSE_FROM PCH) + endif() endfunction() function(qsk_add_example target) @@ -105,9 +114,12 @@ function(qsk_add_example target) target_link_libraries(${target} PRIVATE qskqmlexport) endif() - # for examples with subdirectories + # for examples with subdirectories target_include_directories(${target} PRIVATE ${CMAKE_CURRENT_LIST_DIR}) + if(BUILD_WITH_PRECOMPILED_HEADERS) + target_precompile_headers(${target} REUSE_FROM PCH) + endif() endfunction() function(qsk_add_shaders target) diff --git a/cmake/QskPreCompiledHeader.cmake b/cmake/QskPreCompiledHeader.cmake new file mode 100644 index 000000000..a7173327c --- /dev/null +++ b/cmake/QskPreCompiledHeader.cmake @@ -0,0 +1,273 @@ +message(STATUS "Using precompiled headers") + +# C Standard Library Headers +set(C_STANDARD_HEADERS + + + + + + + + + + + + + + + + + + + + +) + +# C++ Standard Library Headers +set(CPLUSPLUS_STANDARD_HEADERS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +) + +# C++20 Specific Headers +set(CPLUSPLUS20_HEADERS + + + + + + + + + +) + +set(QSK_QT_HEADERS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +) + +if(TRUE) # build break on gcc + list(REMOVE_ITEM CPLUSPLUS_STANDARD_HEADERS ) +endif() + +if(TRUE) # NOT TARGET Qt::Widgets + list(REMOVE_ITEM QSK_QT_HEADERS ) + list(REMOVE_ITEM QSK_QT_HEADERS ) + list(REMOVE_ITEM QSK_QT_HEADERS ) + list(REMOVE_ITEM QSK_QT_HEADERS ) + list(REMOVE_ITEM QSK_QT_HEADERS ) + list(REMOVE_ITEM QSK_QT_HEADERS ) + list(REMOVE_ITEM QSK_QT_HEADERS ) + list(REMOVE_ITEM QSK_QT_HEADERS ) + list(REMOVE_ITEM QSK_QT_HEADERS ) + list(REMOVE_ITEM QSK_QT_HEADERS ) +endif() + +if(NOT TARGET Qt::QuickWidgets) + list(REMOVE_ITEM QSK_QT_HEADERS ) +endif() + +if(TRUE) # NOT TARGET Qt::Svg + list(REMOVE_ITEM QSK_QT_HEADERS ) +endif() + +if(TRUE) # NOT TARGET Qt::Qml + list(REMOVE_ITEM QSK_QT_HEADERS ) +endif() + +if(TRUE) # NOT TARGET Qt::Quick + list(REMOVE_ITEM QSK_QT_HEADERS ) +endif() + +if(QT_VERSION_MAJOR VERSION_GREATER_EQUAL 6) + list(REMOVE_ITEM QSK_QT_HEADERS ) +endif() + +set(ALL_STANDARD_HEADERS + ${C_STANDARD_HEADERS} + ${CPLUSPLUS_STANDARD_HEADERS} + # ${CPLUSPLUS20_HEADERS} + ${QSK_QT_HEADERS} +) + +file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/pch.cpp "enum {};") +add_library(PCH OBJECT ${CMAKE_CURRENT_BINARY_DIR}/pch.cpp) +target_precompile_headers(PCH PRIVATE ${ALL_STANDARD_HEADERS}) +set_target_properties(PCH PROPERTIES AUTOMOC OFF AUTOUIC OFF AUTORCC OFF) +if(MSVC) + # TODO check why we need this + # Set the desired compiler options + # target_compile_options(PCH PRIVATE + # /Zc:referenceBinding + # /Zc:__cplusplus + # /Zc:hiddenFriend + # /Zc:externC + # /Zc:externConstexpr + # /permissive- + # #/source-charset:utf-8 + # #/execution-charset:utf-8 + # /utf-8 + # ) +endif() + +target_link_libraries(PCH PRIVATE + Qt::Core + Qt::CorePrivate + Qt::Gui + Qt::GuiPrivate + Qt::Quick + Qt::QuickPrivate) + +if(TARGET Qt::OpenGL) + target_link_libraries(PCH PRIVATE Qt::OpenGL) +endif() +if(TARGET Qt::OpenGLPrivate) + target_link_libraries(PCH PRIVATE Qt::OpenGLPrivate) +endif() +if(TARGET Qt::Widgets) + target_link_libraries(PCH PRIVATE Qt::Widgets) +endif() +if(TARGET Qt::Svg) + target_link_libraries(PCH PRIVATE Qt::Svg) +endif() +if(TARGET Qt::Quick) + target_link_libraries(PCH PRIVATE Qt::Quick) +endif() +if(TARGET Qt::QuickPrivate) + target_link_libraries(PCH PRIVATE Qt::QuickPrivate) +endif() +if(TARGET Qt::QuickShapesPrivate) + target_link_libraries(PCH PRIVATE Qt::QuickShapesPrivate) +endif() +if(TARGET Qt::QuickWidgets) + target_link_libraries(PCH PRIVATE Qt::QuickWidgets) +endif() +if(TARGET Qt::WebEngine) + target_link_libraries(PCH PRIVATE Qt::WebEngine) +endif() +if(TARGET Qt::WebEngineCore) + target_link_libraries(PCH PRIVATE Qt::WebEngineCore) +endif() +if(TARGET Qt::WebEngineQuick) + target_link_libraries(PCH PRIVATE Qt::WebEngineQuick) +endif() +if(TARGET Qt::WebEngineQuickPrivate) + target_link_libraries(PCH PRIVATE Qt::WebEngineQuickPrivate) +endif() \ No newline at end of file diff --git a/playground/grids/GridGraphics.cpp b/playground/grids/GridGraphics.cpp index 1d73cbd24..355455ad8 100644 --- a/playground/grids/GridGraphics.cpp +++ b/playground/grids/GridGraphics.cpp @@ -10,7 +10,7 @@ #include #include -namespace +namespace GridGraphicsImpl { class Rectangle : public QGraphicsWidget { @@ -68,7 +68,7 @@ GridGraphics::GridGraphics( QWidget* parent ) setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); - auto grid = new Grid(); + auto grid = new GridGraphicsImpl::Grid(); m_layout = new QGraphicsGridLayout( grid ); m_layout->setSpacing( 5 ); @@ -86,7 +86,7 @@ GridGraphics::~GridGraphics() void GridGraphics::insert( const QByteArray& colorName, int row, int column, int rowSpan, int columnSpan ) { - m_layout->addItem( new Rectangle( colorName ), + m_layout->addItem( new GridGraphicsImpl::Rectangle( colorName ), row, column, rowSpan, columnSpan ); } diff --git a/playground/grids/GridWidgets.cpp b/playground/grids/GridWidgets.cpp index bf1b9b7f2..d4bfc83e4 100644 --- a/playground/grids/GridWidgets.cpp +++ b/playground/grids/GridWidgets.cpp @@ -7,7 +7,7 @@ #include #include -namespace +namespace GridWidgetsImpl { class Rectangle : public QWidget { @@ -74,7 +74,7 @@ GridWidgets::~GridWidgets() void GridWidgets::insert( const QByteArray& colorName, int row, int column, int rowSpan, int columnSpan ) { - auto rectangle = new Rectangle( colorName ); + auto rectangle = new GridWidgetsImpl::Rectangle( colorName ); m_layout->addWidget( rectangle, row, column, rowSpan, columnSpan ); rectangle->show(); } @@ -115,10 +115,10 @@ void GridWidgets::setStretchFactor( void GridWidgets::setSizeHintAt( int index, Qt::Orientation orientation, Qt::SizeHint which, int hint ) { - Rectangle* rectangle = nullptr; + GridWidgetsImpl::Rectangle* rectangle = nullptr; if ( auto layoutItem = m_layout->itemAt( index ) ) - rectangle = static_cast< Rectangle* >( layoutItem->widget() ); + rectangle = static_cast< GridWidgetsImpl::Rectangle* >( layoutItem->widget() ); if ( rectangle == nullptr ) return; diff --git a/playground/shadows/ArcPage.cpp b/playground/shadows/ArcPage.cpp index b4d020e1b..9e750969a 100644 --- a/playground/shadows/ArcPage.cpp +++ b/playground/shadows/ArcPage.cpp @@ -9,7 +9,7 @@ #include -namespace +namespace ArcPageImpl { class ControlPanel : public QskGridBox { @@ -100,10 +100,10 @@ namespace ArcPage::ArcPage( QQuickItem* parent ) : QskLinearBox( Qt::Vertical, parent ) { - auto arc = new Arc(); + auto arc = new ArcPageImpl::Arc(); arc->setMargins( 40 ); // some extra space for testing the offsets - auto panel = new ControlPanel( arc ); + auto panel = new ArcPageImpl::ControlPanel( arc ); panel->setSizePolicy( Qt::Vertical, QskSizePolicy::Fixed ); addItem( panel );