diff --git a/src/corelib/Qt6CoreMacros.cmake b/src/corelib/Qt6CoreMacros.cmake index 926c63736d..c70fdbef32 100644 --- a/src/corelib/Qt6CoreMacros.cmake +++ b/src/corelib/Qt6CoreMacros.cmake @@ -1108,7 +1108,11 @@ endfunction() # function(_qt_internal_process_resource target resourceName) - cmake_parse_arguments(rcc "" "PREFIX;LANG;BASE;OUTPUT_TARGETS" "FILES;OPTIONS" ${ARGN}) + cmake_parse_arguments(rcc "" "PREFIX;LANG;BASE;OUTPUT_TARGETS;DESTINATION" "FILES;OPTIONS" ${ARGN}) + + if("${rcc_OPTIONS}" MATCHES "-binary") + set(isBinary TRUE) + endif() string(REPLACE "/" "_" resourceName ${resourceName}) string(REPLACE "." "_" resourceName ${resourceName}) @@ -1162,8 +1166,8 @@ function(_qt_internal_process_resource target resourceName) return() endif() list(APPEND output_targets ${output_target_quick}) - set(generatedResourceFile "${CMAKE_CURRENT_BINARY_DIR}/.rcc/generated_${newResourceName}.qrc") - set(generatedSourceCode "${CMAKE_CURRENT_BINARY_DIR}/.rcc/qrc_${newResourceName}.cpp") + set(generatedBaseName "generated_${newResourceName}") + set(generatedResourceFile "${CMAKE_CURRENT_BINARY_DIR}/.rcc/${generatedBaseName}.qrc") # Generate .qrc file: @@ -1210,10 +1214,8 @@ function(_qt_internal_process_resource target resourceName) set(qt_core_configure_file_contents "${qrcContents}") configure_file("${template_file}" "${generatedResourceFile}") - set_property(TARGET ${target} APPEND PROPERTY _qt_generated_qrc_files "${generatedResourceFile}") + set(rccArgs --name "${newResourceName}" "${generatedResourceFile}") - set(rccArgs --name "${newResourceName}" - --output "${generatedSourceCode}" "${generatedResourceFile}") if(rcc_OPTIONS) list(APPEND rccArgs ${rcc_OPTIONS}) endif() @@ -1228,10 +1230,29 @@ function(_qt_internal_process_resource target resourceName) list(APPEND rccArgs "--no-zstd") endif() + set_property(SOURCE "${generatedResourceFile}" PROPERTY SKIP_AUTOGEN ON) + + # Set output file name for rcc command + if(isBinary) + set(generatedOutfile "${CMAKE_CURRENT_BINARY_DIR}/${generatedBaseName}.rcc") + if(rcc_DESTINATION) + # Add .rcc suffix if it's not specified by user + get_filename_component(destinationRccExt "${rcc_DESTINATION}" LAST_EXT) + if("${destinationRccExt}" STREQUAL ".rcc") + set(generatedOutfile "${rcc_DESTINATION}") + else() + set(generatedOutfile "${rcc_DESTINATION}.rcc") + endif() + endif() + else() + set(generatedOutfile "${CMAKE_CURRENT_BINARY_DIR}/.rcc/qrc_${newResourceName}.cpp") + endif() + + list(PREPEND rccArgs --output "${generatedOutfile}") + # Process .qrc file: - add_custom_command(OUTPUT "${generatedSourceCode}" - COMMAND "${QT_CMAKE_EXPORT_NAMESPACE}::rcc" - ARGS ${rccArgs} + add_custom_command(OUTPUT "${generatedOutfile}" + COMMAND "${QT_CMAKE_EXPORT_NAMESPACE}::rcc" ${rccArgs} DEPENDS ${resource_dependencies} ${generatedResourceFile} @@ -1239,18 +1260,25 @@ function(_qt_internal_process_resource target resourceName) COMMENT "RCC ${newResourceName}" VERBATIM) - get_target_property(type "${target}" TYPE) - # Only do this if newResourceName is the same as resourceName, since - # the resource will be chainloaded by the qt quickcompiler - # qml cache loader - if(newResourceName STREQUAL resourceName) - __qt_propagate_generated_resource(${target} ${resourceName} "${generatedSourceCode}" output_target) - list(APPEND output_targets ${output_target}) + if(isBinary) + # Add generated .rcc target to 'all' set + add_custom_target(binary_resource_${generatedBaseName} ALL DEPENDS "${generatedOutfile}") else() - target_sources(${target} PRIVATE "${generatedSourceCode}") - endif() - if (rcc_OUTPUT_TARGETS) - set(${rcc_OUTPUT_TARGETS} "${output_targets}" PARENT_SCOPE) + set_property(SOURCE "${generatedOutfile}" PROPERTY SKIP_AUTOGEN ON) + set_property(TARGET ${target} APPEND PROPERTY _qt_generated_qrc_files "${generatedResourceFile}") + + # Only do this if newResourceName is the same as resourceName, since + # the resource will be chainloaded by the qt quickcompiler + # qml cache loader + if(newResourceName STREQUAL resourceName) + __qt_propagate_generated_resource(${target} ${resourceName} "${generatedOutfile}" output_target) + list(APPEND output_targets ${output_target}) + else() + target_sources(${target} PRIVATE "${generatedOutfile}") + endif() + if (rcc_OUTPUT_TARGETS) + set(${rcc_OUTPUT_TARGETS} "${output_targets}" PARENT_SCOPE) + endif() endif() endfunction() diff --git a/tests/auto/cmake/CMakeLists.txt b/tests/auto/cmake/CMakeLists.txt index 27ceae74fb..e8a60840a6 100644 --- a/tests/auto/cmake/CMakeLists.txt +++ b/tests/auto/cmake/CMakeLists.txt @@ -221,3 +221,6 @@ endif() # FIXME: Needs porting of the qmake .pro files to create the modules and plugins in Qt6 CMake land. # _qt_internal_test_expect_pass(test_import_plugins BINARY ${CMAKE_CTEST_COMMAND}) _qt_internal_test_expect_pass(test_versionless_targets) + +_qt_internal_test_expect_pass(test_add_resources_binary_generated + BINARY test_add_resources_binary_generated) diff --git a/tests/auto/cmake/test_add_resources_binary_generated/CMakeLists.txt b/tests/auto/cmake/test_add_resources_binary_generated/CMakeLists.txt new file mode 100644 index 0000000000..c7839348a7 --- /dev/null +++ b/tests/auto/cmake/test_add_resources_binary_generated/CMakeLists.txt @@ -0,0 +1,32 @@ +cmake_minimum_required(VERSION 3.14) + +project(test_add_resources_binary_generated) + +if (EXISTS "${CMAKE_CURRENT_LIST_DIR}/FindPackageHints.cmake") + include("${CMAKE_CURRENT_LIST_DIR}/FindPackageHints.cmake") +endif() + +find_package(Qt6Core REQUIRED HINTS ${Qt6Tests_PREFIX_PATH}) + +qt6_add_executable(test_add_resources_binary_generated main.cpp) + +qt6_add_resources(test_add_resources_binary_generated resources1 FILES resource1.txt PREFIX "/" + OPTIONS "--binary") +qt6_add_resources(test_add_resources_binary_generated resources2 FILES resource2.txt PREFIX "/" + OPTIONS "--binary" + DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/resources2_custom.rcc") + +target_compile_definitions(test_add_resources_binary_generated + PRIVATE + RESOURCE1_FULL_PATH="${CMAKE_CURRENT_BINARY_DIR}/generated_resources1.rcc") +target_compile_definitions(test_add_resources_binary_generated + PRIVATE + RESOURCE2_FULL_PATH="${CMAKE_CURRENT_BINARY_DIR}/resources2_custom.rcc") + +if(NOT TARGET binary_resource_generated_resources1) + message(FATAL_ERROR "Generated resources binary target was not created") +endif() + +if(NOT TARGET binary_resource_generated_resources2) + message(FATAL_ERROR "Generated resources binary target was not created") +endif() diff --git a/tests/auto/cmake/test_add_resources_binary_generated/main.cpp b/tests/auto/cmake/test_add_resources_binary_generated/main.cpp new file mode 100644 index 0000000000..bee714bcf9 --- /dev/null +++ b/tests/auto/cmake/test_add_resources_binary_generated/main.cpp @@ -0,0 +1,41 @@ +/**************************************************************************** +** +** Copyright (C) 2020 The Qt Company Ltd. +** 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 +#include + +int main(int, char **) +{ + if (!QResource::registerResource(RESOURCE1_FULL_PATH) + || !QFile::exists(":/resource1.txt") + || !QResource::registerResource(RESOURCE2_FULL_PATH) + || !QFile::exists(":/resource2.txt")) { + return -1; + } + return 0; +} diff --git a/tests/auto/cmake/test_add_resources_binary_generated/resource1.txt b/tests/auto/cmake/test_add_resources_binary_generated/resource1.txt new file mode 100644 index 0000000000..bc06a6d721 --- /dev/null +++ b/tests/auto/cmake/test_add_resources_binary_generated/resource1.txt @@ -0,0 +1 @@ +Test resource1 diff --git a/tests/auto/cmake/test_add_resources_binary_generated/resource2.txt b/tests/auto/cmake/test_add_resources_binary_generated/resource2.txt new file mode 100644 index 0000000000..b8f9e67458 --- /dev/null +++ b/tests/auto/cmake/test_add_resources_binary_generated/resource2.txt @@ -0,0 +1 @@ +Test resource2