CMake: Add support for -binary option for generated resources
Add handling of -binary flag in qt6_add_resources for generated resource file variant. If -binary argument is provided in OPTIONS section of qt6_add_resources function, it will be passed to rcc as argument. File path to output .rcc could be additionally specified by DESTINATION argument. Extra target generated_<resource_filename> will be added to project's 'all' set. Implement tests for new functionality. Fixes: QTBUG-87644 Change-Id: Id1313da499d86f82859d1757c3cfae2d84e894d4 Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
This commit is contained in:
parent
29b17fa335
commit
558f5a2d7b
@ -1108,7 +1108,11 @@ endfunction()
|
|||||||
#
|
#
|
||||||
function(_qt_internal_process_resource target resourceName)
|
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})
|
||||||
string(REPLACE "." "_" resourceName ${resourceName})
|
string(REPLACE "." "_" resourceName ${resourceName})
|
||||||
@ -1162,8 +1166,8 @@ function(_qt_internal_process_resource target resourceName)
|
|||||||
return()
|
return()
|
||||||
endif()
|
endif()
|
||||||
list(APPEND output_targets ${output_target_quick})
|
list(APPEND output_targets ${output_target_quick})
|
||||||
set(generatedResourceFile "${CMAKE_CURRENT_BINARY_DIR}/.rcc/generated_${newResourceName}.qrc")
|
set(generatedBaseName "generated_${newResourceName}")
|
||||||
set(generatedSourceCode "${CMAKE_CURRENT_BINARY_DIR}/.rcc/qrc_${newResourceName}.cpp")
|
set(generatedResourceFile "${CMAKE_CURRENT_BINARY_DIR}/.rcc/${generatedBaseName}.qrc")
|
||||||
|
|
||||||
# Generate .qrc file:
|
# Generate .qrc file:
|
||||||
|
|
||||||
@ -1210,10 +1214,8 @@ function(_qt_internal_process_resource target resourceName)
|
|||||||
set(qt_core_configure_file_contents "${qrcContents}")
|
set(qt_core_configure_file_contents "${qrcContents}")
|
||||||
configure_file("${template_file}" "${generatedResourceFile}")
|
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)
|
if(rcc_OPTIONS)
|
||||||
list(APPEND rccArgs ${rcc_OPTIONS})
|
list(APPEND rccArgs ${rcc_OPTIONS})
|
||||||
endif()
|
endif()
|
||||||
@ -1228,10 +1230,29 @@ function(_qt_internal_process_resource target resourceName)
|
|||||||
list(APPEND rccArgs "--no-zstd")
|
list(APPEND rccArgs "--no-zstd")
|
||||||
endif()
|
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:
|
# Process .qrc file:
|
||||||
add_custom_command(OUTPUT "${generatedSourceCode}"
|
add_custom_command(OUTPUT "${generatedOutfile}"
|
||||||
COMMAND "${QT_CMAKE_EXPORT_NAMESPACE}::rcc"
|
COMMAND "${QT_CMAKE_EXPORT_NAMESPACE}::rcc" ${rccArgs}
|
||||||
ARGS ${rccArgs}
|
|
||||||
DEPENDS
|
DEPENDS
|
||||||
${resource_dependencies}
|
${resource_dependencies}
|
||||||
${generatedResourceFile}
|
${generatedResourceFile}
|
||||||
@ -1239,18 +1260,25 @@ function(_qt_internal_process_resource target resourceName)
|
|||||||
COMMENT "RCC ${newResourceName}"
|
COMMENT "RCC ${newResourceName}"
|
||||||
VERBATIM)
|
VERBATIM)
|
||||||
|
|
||||||
get_target_property(type "${target}" TYPE)
|
if(isBinary)
|
||||||
# Only do this if newResourceName is the same as resourceName, since
|
# Add generated .rcc target to 'all' set
|
||||||
# the resource will be chainloaded by the qt quickcompiler
|
add_custom_target(binary_resource_${generatedBaseName} ALL DEPENDS "${generatedOutfile}")
|
||||||
# qml cache loader
|
|
||||||
if(newResourceName STREQUAL resourceName)
|
|
||||||
__qt_propagate_generated_resource(${target} ${resourceName} "${generatedSourceCode}" output_target)
|
|
||||||
list(APPEND output_targets ${output_target})
|
|
||||||
else()
|
else()
|
||||||
target_sources(${target} PRIVATE "${generatedSourceCode}")
|
set_property(SOURCE "${generatedOutfile}" PROPERTY SKIP_AUTOGEN ON)
|
||||||
endif()
|
set_property(TARGET ${target} APPEND PROPERTY _qt_generated_qrc_files "${generatedResourceFile}")
|
||||||
if (rcc_OUTPUT_TARGETS)
|
|
||||||
set(${rcc_OUTPUT_TARGETS} "${output_targets}" PARENT_SCOPE)
|
# 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()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
|
@ -221,3 +221,6 @@ endif()
|
|||||||
# FIXME: Needs porting of the qmake .pro files to create the modules and plugins in Qt6 CMake land.
|
# 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_import_plugins BINARY ${CMAKE_CTEST_COMMAND})
|
||||||
_qt_internal_test_expect_pass(test_versionless_targets)
|
_qt_internal_test_expect_pass(test_versionless_targets)
|
||||||
|
|
||||||
|
_qt_internal_test_expect_pass(test_add_resources_binary_generated
|
||||||
|
BINARY test_add_resources_binary_generated)
|
||||||
|
@ -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()
|
@ -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 <QFile>
|
||||||
|
#include <QResource>
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
@ -0,0 +1 @@
|
|||||||
|
Test resource1
|
@ -0,0 +1 @@
|
|||||||
|
Test resource2
|
Loading…
x
Reference in New Issue
Block a user