diff options
Diffstat (limited to 'tests/auto/corelib/plugin/qpluginloader/machtest')
3 files changed, 139 insertions, 127 deletions
diff --git a/tests/auto/corelib/plugin/qpluginloader/machtest/CMakeLists.txt b/tests/auto/corelib/plugin/qpluginloader/machtest/CMakeLists.txt index 05cd044aa3..6cb69fc46d 100644 --- a/tests/auto/corelib/plugin/qpluginloader/machtest/CMakeLists.txt +++ b/tests/auto/corelib/plugin/qpluginloader/machtest/CMakeLists.txt @@ -1,2 +1,138 @@ -# Generated from machtest.pro. +set_directory_properties(PROPERTIES + _qt_good_targets "" + _qt_stub_targets "" +) +function(add_plugin_binary) + set(no_value_options "") + set(single_value_options NAME ARCH OUT_TARGET) + set(multi_value_options SOURCES) + cmake_parse_arguments(PARSE_ARGV 0 arg + "${no_value_options}" "${single_value_options}" "${multi_value_options}" + ) + + set(output_name ${arg_NAME}.${arg_ARCH}) + set(target tst_qpluginloader.${output_name}) + set(${arg_OUT_TARGET} ${target} PARENT_SCOPE) + set_property(DIRECTORY APPEND PROPERTY _qt_${arg_NAME}_targets ${target}) + add_library(${target} MODULE ${arg_SOURCES}) + add_dependencies(tst_qpluginloader ${target}) + set_target_properties(${target} PROPERTIES + OUTPUT_NAME ${output_name} + PREFIX "" + SUFFIX ".dylib" + DEBUG_POSTFIX "" + OSX_ARCHITECTURES ${arg_ARCH} + ) +endfunction() + +function(add_good_binary) + set(no_value_options "") + set(single_value_options ARCH) + set(multi_value_options "") + cmake_parse_arguments(PARSE_ARGV 0 arg + "${no_value_options}" "${single_value_options}" "${multi_value_options}" + ) + + add_plugin_binary( + NAME good + ARCH ${arg_ARCH} + SOURCES ../fakeplugin.cpp + OUT_TARGET target + ) + + # We cannot link against Qt6::Core, because the architecture might not match. + # Extract the include directories from Qt6::Core. + get_target_property(incdirs Qt6::Core INTERFACE_INCLUDE_DIRECTORIES) + target_include_directories(${target} PRIVATE ${incdirs}) + + # Extract the compile definitions from Qt6::Core and disable version tagging. + get_target_property(compdefs Qt6::Core INTERFACE_COMPILE_DEFINITIONS) + target_compile_definitions(${target} PRIVATE + ${compdefs} + QT_NO_VERSION_TAGGING + ) +endfunction() + +function(add_stub_binary) + set(no_value_options "") + set(single_value_options ARCH) + set(multi_value_options "") + cmake_parse_arguments(PARSE_ARGV 0 arg + "${no_value_options}" "${single_value_options}" "${multi_value_options}" + ) + + add_plugin_binary( + NAME stub + ARCH ${arg_ARCH} + SOURCES stub.cpp + ) +endfunction() + +function(add_fat_binary) + set(no_value_options "") + set(single_value_options NAME OUT_TARGET) + set(multi_value_options TARGETS) + cmake_parse_arguments(PARSE_ARGV 0 arg + "${no_value_options}" "${single_value_options}" "${multi_value_options}" + ) + + set(arch_args "") + foreach(dependency IN LISTS arg_TARGETS) + get_target_property(arch ${dependency} OSX_ARCHITECTURES) + list(APPEND arch_args -arch ${arch} $<TARGET_FILE_NAME:${dependency}>) + endforeach() + + set(output_name good.fat.${arg_NAME}) + set(output_file ${output_name}.dylib) + set(target tst_qpluginloader.${output_name}) + set(${arg_OUT_TARGET} ${target} PARENT_SCOPE) + add_custom_command( + OUTPUT ${output_file} + COMMAND lipo -create -output ${output_file} ${arch_args} + DEPENDS ${arg_TARGETS} + ) + add_custom_target(${target} + DEPENDS ${output_file} + ) + add_dependencies(tst_qpluginloader ${target}) +endfunction() + +set(archs_to_test arm64 x86_64) +foreach(arch IN LISTS archs_to_test) + add_good_binary(ARCH ${arch}) + add_stub_binary(ARCH ${arch}) +endforeach() + +get_directory_property(good_targets _qt_good_targets) +add_fat_binary(NAME all TARGETS ${good_targets}) + +set(targets ${good_targets}) +list(FILTER targets EXCLUDE REGEX "\\.arm64$") +add_fat_binary(NAME no-arm64 TARGETS ${targets}) + +set(targets ${good_targets}) +list(FILTER targets EXCLUDE REGEX "\\.x86_64$") +add_fat_binary(NAME no-x86_64 TARGETS ${targets}) + +get_directory_property(stub_targets _qt_stub_targets) +set(targets ${stub_targets}) +list(FILTER targets INCLUDE REGEX "\\.arm64$") +add_fat_binary(NAME stub-arm64 TARGETS ${targets}) + +set(targets ${stub_targets}) +list(FILTER targets INCLUDE REGEX "\\.x86_64$") +add_fat_binary(NAME stub-x86_64 TARGETS ${targets}) + +set(bad_binary_names "") +foreach(i RANGE 1 13) + list(APPEND bad_binary_names "bad${i}.dylib") +endforeach() +add_custom_command( + OUTPUT ${bad_binary_names} + COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/generate-bad.pl +) +add_custom_target(tst_qpluginloader_generate_bad_binaries + DEPENDS ${bad_binary_names} +) +add_dependencies(tst_qpluginloader tst_qpluginloader_generate_bad_binaries) diff --git a/tests/auto/corelib/plugin/qpluginloader/machtest/generate-bad.pl b/tests/auto/corelib/plugin/qpluginloader/machtest/generate-bad.pl index 4fed135049..3de1eb581a 100755 --- a/tests/auto/corelib/plugin/qpluginloader/machtest/generate-bad.pl +++ b/tests/auto/corelib/plugin/qpluginloader/machtest/generate-bad.pl @@ -1,31 +1,6 @@ #!/usr/bin/perl -############################################################################# -## -## Copyright (C) 2016 Intel Corporation. -## Contact: https://www.qt.io/licensing/ -## -## This file is the build configuration utility 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$ -## -############################################################################# +# Copyright (C) 2016 Intel Corporation. +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 use strict; use constant FAT_MAGIC => 0xcafebabe; diff --git a/tests/auto/corelib/plugin/qpluginloader/machtest/ppcconverter.pl b/tests/auto/corelib/plugin/qpluginloader/machtest/ppcconverter.pl deleted file mode 100755 index 7242d7596b..0000000000 --- a/tests/auto/corelib/plugin/qpluginloader/machtest/ppcconverter.pl +++ /dev/null @@ -1,99 +0,0 @@ -#!/usr/bin/perl -############################################################################# -## -## Copyright (C) 2016 Intel Corporation. -## Contact: https://www.qt.io/licensing/ -## -## This file is the build configuration utility 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$ -## -############################################################################# - -# Changes the Mach-O file type header to PowerPC. -# -# The header is (from mach-o/loader.h): -# struct mach_header { -# uint32_t magic; /* mach magic number identifier */ -# cpu_type_t cputype; /* cpu specifier */ -# cpu_subtype_t cpusubtype; /* machine specifier */ -# uint32_t filetype; /* type of file */ -# uint32_t ncmds; /* number of load commands */ -# uint32_t sizeofcmds; /* the size of all the load commands */ -# uint32_t flags; /* flags */ -# }; -# -# The 64-bit header is identical in the first three fields, except for a different -# magic number. We will not touch the magic number, we'll just reset the cputype -# field to the PowerPC type and the subtype field to zero. -# -# We will not change the file's endianness. That means we might create a little-endian -# PowerPC binary, which could not be run in real life. -# -# We will also not change the 64-bit ABI flag, which is found in the cputype's high -# byte. That means we'll create a PPC64 binary if fed a 64-bit input. -# -use strict; -use constant MH_MAGIC => 0xfeedface; -use constant MH_CIGAM => 0xcefaedfe; -use constant MH_MAGIC_64 => 0xfeedfacf; -use constant MH_CIGAM_64 => 0xcffaedfe; -use constant CPU_TYPE_POWERPC => 18; -use constant CPU_SUBTYPE_POWERPC_ALL => 0; - -my $infile = shift @ARGV or die("Missing input filename"); -my $outfile = shift @ARGV or die("Missing output filename"); - -open IN, "<$infile" or die("Can't open $infile for reading: $!\n"); -open OUT, ">$outfile" or die("Can't open $outfile for writing: $!\n"); - -binmode IN; -binmode OUT; - -# Read the first 12 bytes, which includes the interesting fields of the header -my $buffer; -read(IN, $buffer, 12); - -my $magic = vec($buffer, 0, 32); -if ($magic == MH_MAGIC || $magic == MH_MAGIC_64) { - # Big endian - # The low byte of cputype is at offset 7 - vec($buffer, 7, 8) = CPU_TYPE_POWERPC; -} elsif ($magic == MH_CIGAM || $magic == MH_CIGAM_64) { - # Little endian - # The low byte of cpytype is at offset 4 - vec($buffer, 4, 8) = CPU_TYPE_POWERPC; -} else { - $magic = ''; - $magic .= sprintf("%02X ", $_) for unpack("CCCC", $buffer); - die("Invalid input. Unknown magic $magic\n"); -} -vec($buffer, 2, 32) = CPU_SUBTYPE_POWERPC_ALL; - -print OUT $buffer; - -# Copy the rest -while (!eof(IN)) { - read(IN, $buffer, 4096) and - print OUT $buffer or - die("Problem copying: $!\n"); -} -close(IN); -close(OUT); |