From cdccd0222bbed1954d5d7fe0da9d2308c202f3b1 Mon Sep 17 00:00:00 2001 From: Andy Shaw Date: Fri, 18 May 2018 12:19:38 +0200 Subject: Add support for big resources with CMake Task-number: QTBUG-55680 Change-Id: I09570a4e959ffd0e6d378bc315b13d57baaa82e8 Reviewed-by: Kevin Funk --- src/corelib/Qt5CoreMacros.cmake | 43 +++++++++++++++++++++ tests/auto/cmake/CMakeLists.txt | 1 + .../cmake/test_add_big_resource/CMakeLists.txt | 13 +++++++ .../auto/cmake/test_add_big_resource/myobject.cpp | 44 ++++++++++++++++++++++ tests/auto/cmake/test_add_big_resource/myobject.h | 44 ++++++++++++++++++++++ .../cmake/test_add_big_resource/resource_file.txt | 1 + .../cmake/test_add_big_resource/resource_file2.txt | 1 + .../test_add_big_resource.qrc | 6 +++ .../test_add_big_resource2.qrc | 6 +++ 9 files changed, 159 insertions(+) create mode 100644 tests/auto/cmake/test_add_big_resource/CMakeLists.txt create mode 100644 tests/auto/cmake/test_add_big_resource/myobject.cpp create mode 100644 tests/auto/cmake/test_add_big_resource/myobject.h create mode 100644 tests/auto/cmake/test_add_big_resource/resource_file.txt create mode 100644 tests/auto/cmake/test_add_big_resource/resource_file2.txt create mode 100644 tests/auto/cmake/test_add_big_resource/test_add_big_resource.qrc create mode 100644 tests/auto/cmake/test_add_big_resource/test_add_big_resource2.qrc diff --git a/src/corelib/Qt5CoreMacros.cmake b/src/corelib/Qt5CoreMacros.cmake index 819b48f973..581c99ed58 100644 --- a/src/corelib/Qt5CoreMacros.cmake +++ b/src/corelib/Qt5CoreMacros.cmake @@ -293,6 +293,49 @@ function(QT5_ADD_RESOURCES outfiles ) set(${outfiles} ${${outfiles}} PARENT_SCOPE) endfunction() +# qt5_add_big_resources(outfiles inputfile ... ) + +function(QT5_ADD_BIG_RESOURCES outfiles ) + + set(options) + set(oneValueArgs) + set(multiValueArgs OPTIONS) + + cmake_parse_arguments(_RCC "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + set(rcc_files ${_RCC_UNPARSED_ARGUMENTS}) + set(rcc_options ${_RCC_OPTIONS}) + + if("${rcc_options}" MATCHES "-binary") + message(WARNING "Use qt5_add_binary_resources for binary option") + endif() + + foreach(it ${rcc_files}) + get_filename_component(outfilename ${it} NAME_WE) + get_filename_component(infile ${it} ABSOLUTE) + set(tmpoutfile ${CMAKE_CURRENT_BINARY_DIR}/qrc_${outfilename}tmp.cpp) + set(outfile ${CMAKE_CURRENT_BINARY_DIR}/qrc_${outfilename}.o) + + _QT5_PARSE_QRC_FILE(${infile} _out_depends _rc_depends) + set_source_files_properties(${infile} PROPERTIES SKIP_AUTORCC ON) + add_custom_command(OUTPUT ${tmpoutfile} + COMMAND ${Qt5Core_RCC_EXECUTABLE} ${rcc_options} --name ${outfilename} --pass 1 --output ${tmpoutfile} ${infile} + DEPENDS ${infile} ${_rc_depends} "${out_depends}" VERBATIM) + set_source_files_properties(${tmpoutfile} PROPERTIES SKIP_AUTOMOC ON) + set_source_files_properties(${tmpoutfile} PROPERTIES SKIP_AUTOUIC ON) + add_custom_target(big_resources_${outfilename} ALL DEPENDS ${tmpoutfile}) + add_library(rcc_object_${outfilename} OBJECT ${tmpoutfile}) + add_dependencies(rcc_object_${outfilename} big_resources_${outfilename}) + add_custom_command(OUTPUT ${outfile} + COMMAND ${Qt5Core_RCC_EXECUTABLE} + ARGS ${rcc_options} --name ${outfilename} --pass 2 --temp $ --output ${outfile} ${infile} + DEPENDS rcc_object_${outfilename} + VERBATIM) + list(APPEND ${outfiles} ${outfile}) + endforeach() + set(${outfiles} ${${outfiles}} PARENT_SCOPE) +endfunction() + set(_Qt5_COMPONENT_PATH "${CMAKE_CURRENT_LIST_DIR}/..") if (NOT CMAKE_VERSION VERSION_LESS 2.8.9) diff --git a/tests/auto/cmake/CMakeLists.txt b/tests/auto/cmake/CMakeLists.txt index ec75ec7caf..eac5b9976d 100644 --- a/tests/auto/cmake/CMakeLists.txt +++ b/tests/auto/cmake/CMakeLists.txt @@ -146,6 +146,7 @@ endif() expect_pass(test_interface_link_libraries) expect_pass(test_moc_macro_target) +expect_pass(test_add_big_resource) if (NOT CMAKE_VERSION VERSION_LESS 3.8) # With earlier CMake versions, this test would simply run moc multiple times and lead to: diff --git a/tests/auto/cmake/test_add_big_resource/CMakeLists.txt b/tests/auto/cmake/test_add_big_resource/CMakeLists.txt new file mode 100644 index 0000000000..f928b11278 --- /dev/null +++ b/tests/auto/cmake/test_add_big_resource/CMakeLists.txt @@ -0,0 +1,13 @@ + +cmake_minimum_required(VERSION 2.8) + +project(test_add_big_resource) + +find_package(Qt5Core REQUIRED) + +qt5_wrap_cpp(moc_files myobject.h) + +qt5_add_big_resources(rcc_files "test_add_big_resource.qrc" "test_add_big_resource2.qrc") + +add_executable(myobject myobject.cpp ${moc_files} ${rcc_files}) +target_link_libraries(myobject ${Qt5Core_LIBRARIES}) diff --git a/tests/auto/cmake/test_add_big_resource/myobject.cpp b/tests/auto/cmake/test_add_big_resource/myobject.cpp new file mode 100644 index 0000000000..5d320b8592 --- /dev/null +++ b/tests/auto/cmake/test_add_big_resource/myobject.cpp @@ -0,0 +1,44 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Stephen Kelly +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "myobject.h" + +MyObject::MyObject(QObject *parent) + : QObject(parent) +{ + emit someSignal(); +} + +int main(int argc, char **argv) +{ + MyObject myObject; + // Compile error if the resource file was not created. + Q_INIT_RESOURCE(test_add_big_resource); + Q_INIT_RESOURCE(test_add_big_resource2); + return 0; +} diff --git a/tests/auto/cmake/test_add_big_resource/myobject.h b/tests/auto/cmake/test_add_big_resource/myobject.h new file mode 100644 index 0000000000..b6fbce32cd --- /dev/null +++ b/tests/auto/cmake/test_add_big_resource/myobject.h @@ -0,0 +1,44 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Stephen Kelly +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef MYOBJECT_H +#define MYOBJECT_H + +#include + +class MyObject : public QObject +{ + Q_OBJECT +public: + MyObject(QObject *parent = 0); + +signals: + void someSignal(); +}; + +#endif diff --git a/tests/auto/cmake/test_add_big_resource/resource_file.txt b/tests/auto/cmake/test_add_big_resource/resource_file.txt new file mode 100644 index 0000000000..2c604a4f18 --- /dev/null +++ b/tests/auto/cmake/test_add_big_resource/resource_file.txt @@ -0,0 +1 @@ +Ken sent me. diff --git a/tests/auto/cmake/test_add_big_resource/resource_file2.txt b/tests/auto/cmake/test_add_big_resource/resource_file2.txt new file mode 100644 index 0000000000..2c604a4f18 --- /dev/null +++ b/tests/auto/cmake/test_add_big_resource/resource_file2.txt @@ -0,0 +1 @@ +Ken sent me. diff --git a/tests/auto/cmake/test_add_big_resource/test_add_big_resource.qrc b/tests/auto/cmake/test_add_big_resource/test_add_big_resource.qrc new file mode 100644 index 0000000000..00a17f541f --- /dev/null +++ b/tests/auto/cmake/test_add_big_resource/test_add_big_resource.qrc @@ -0,0 +1,6 @@ + + + resource_file.txt + + + diff --git a/tests/auto/cmake/test_add_big_resource/test_add_big_resource2.qrc b/tests/auto/cmake/test_add_big_resource/test_add_big_resource2.qrc new file mode 100644 index 0000000000..e21cc5e138 --- /dev/null +++ b/tests/auto/cmake/test_add_big_resource/test_add_big_resource2.qrc @@ -0,0 +1,6 @@ + + + resource_file2.txt + + + -- cgit v1.2.3