mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-04-01 21:33:09 +02:00
Merge branch 'fix-custom-dispatch-32bit-windows' into 'main'
gobject/tests: Fix running on 32-bit Windows See merge request GNOME/glib!3490
This commit is contained in:
commit
ec754e5404
@ -28,10 +28,35 @@ marshalers_c = custom_target('marshalers_c',
|
|||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# We must embed custom-dispatch.exe with an application
|
||||||
|
# manifest to pacify UAC in order to run on 32-bit Windows
|
||||||
|
# builds, otherwise the test will not run as UAC will kill it.
|
||||||
|
extra_custom_dispatch_objs = []
|
||||||
|
if embed_uac_manifest
|
||||||
|
uac_exe_pkg = 'gobject'
|
||||||
|
uac_exe_name = 'custom-dispatch'
|
||||||
|
|
||||||
|
# Well, we have to forgo the xxx.exe.manifest in the output listing, since
|
||||||
|
# compile_resources doesn't like to consume targets with multiple outputs,
|
||||||
|
# and the xxx.exe.manifest and xxx.rc are tied together
|
||||||
|
uac_rc = custom_target(
|
||||||
|
'@0@.rc'.format(uac_exe_name),
|
||||||
|
output: ['@0@.rc'.format(uac_exe_name)],
|
||||||
|
command: [gen_uac_manifest,
|
||||||
|
'-p=@0@'.format(uac_exe_pkg),
|
||||||
|
'-n=@0@'.format(uac_exe_name),
|
||||||
|
'--pkg-version=@0@'.format(meson.project_version()),
|
||||||
|
'--output-dir=@OUTDIR@'],
|
||||||
|
)
|
||||||
|
extra_custom_dispatch_objs = import('windows').compile_resources(uac_rc)
|
||||||
|
endif
|
||||||
|
|
||||||
gobject_tests = {
|
gobject_tests = {
|
||||||
'notify-init' : {},
|
'notify-init' : {},
|
||||||
'notify-init2' : {},
|
'notify-init2' : {},
|
||||||
'custom-dispatch' : {},
|
'custom-dispatch' : {
|
||||||
|
'extra_objs' : extra_custom_dispatch_objs,
|
||||||
|
},
|
||||||
'qdata' : {},
|
'qdata' : {},
|
||||||
'accumulator' : {
|
'accumulator' : {
|
||||||
'source' : ['accumulator.c', marshalers_h, marshalers_c],
|
'source' : ['accumulator.c', marshalers_h, marshalers_c],
|
||||||
@ -150,6 +175,7 @@ test_cpp_args = test_cargs
|
|||||||
|
|
||||||
foreach test_name, extra_args : gobject_tests
|
foreach test_name, extra_args : gobject_tests
|
||||||
source = extra_args.get('source', test_name + '.c')
|
source = extra_args.get('source', test_name + '.c')
|
||||||
|
extra_objs = extra_args.get('extra_objs', [])
|
||||||
install = installed_tests_enabled and extra_args.get('install', true)
|
install = installed_tests_enabled and extra_args.get('install', true)
|
||||||
|
|
||||||
if install
|
if install
|
||||||
@ -166,7 +192,7 @@ foreach test_name, extra_args : gobject_tests
|
|||||||
)
|
)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
exe = executable(test_name, source,
|
exe = executable(test_name, source, extra_objs,
|
||||||
c_args : test_cargs + extra_args.get('c_args', []),
|
c_args : test_cargs + extra_args.get('c_args', []),
|
||||||
cpp_args : test_cpp_args + extra_args.get('cpp_args', []),
|
cpp_args : test_cpp_args + extra_args.get('cpp_args', []),
|
||||||
dependencies : test_deps + extra_args.get('dependencies', []),
|
dependencies : test_deps + extra_args.get('dependencies', []),
|
||||||
|
137
tools/generate-uac-manifest.py
Normal file
137
tools/generate-uac-manifest.py
Normal file
@ -0,0 +1,137 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
#
|
||||||
|
# Copyright © 2021 Chun-wei Fan.
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: LGPL-2.1-or-later
|
||||||
|
#
|
||||||
|
# Original author: Chun-wei Fan <fanc999@yahoo.com.tw>
|
||||||
|
|
||||||
|
"""
|
||||||
|
This script generates a Windows manifest file and optionally a resource file to
|
||||||
|
determine whether a specified program requires UAC elevation
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import argparse
|
||||||
|
|
||||||
|
DOMAIN_NAME = "gnome"
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
parser = argparse.ArgumentParser(description=__doc__)
|
||||||
|
parser.add_argument(
|
||||||
|
"-p", "--package", required=True, help="package name of the executable"
|
||||||
|
)
|
||||||
|
parser.add_argument("-n", "--name", required=True, help="name of executable")
|
||||||
|
parser.add_argument(
|
||||||
|
"--pkg-version", required=True, dest="version", help="version of package"
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"--require-admin",
|
||||||
|
action="store_true",
|
||||||
|
dest="admin",
|
||||||
|
default=False,
|
||||||
|
help="require admin access to application",
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"--input-resource-file",
|
||||||
|
dest="resource",
|
||||||
|
default=None,
|
||||||
|
help="existing .rc file to embed UAC manifest (do not generate a new .rc file), must have included windows.h in it",
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"--output-dir",
|
||||||
|
dest="outdir",
|
||||||
|
default=None,
|
||||||
|
help="directory to output resulting files",
|
||||||
|
)
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
if args.resource is not None:
|
||||||
|
if not os.path.isfile(args.resource):
|
||||||
|
raise FileNotFoundError(
|
||||||
|
"Specified resource file '%s' does not exist" % args.resource
|
||||||
|
)
|
||||||
|
|
||||||
|
generate_manifest(args.package, args.name, args.version, args.admin, args.outdir)
|
||||||
|
write_rc_file(args.name, args.resource, args.outdir)
|
||||||
|
|
||||||
|
|
||||||
|
def generate_manifest(package, name, version, admin, outdir):
|
||||||
|
if version.count(".") == 0:
|
||||||
|
manifest_package_version = version + ".0.0.0"
|
||||||
|
elif version.count(".") == 1:
|
||||||
|
manifest_package_version = version + ".0.0"
|
||||||
|
elif version.count(".") == 2:
|
||||||
|
manifest_package_version = version + ".0"
|
||||||
|
elif version.count(".") == 3:
|
||||||
|
manifest_package_version = version
|
||||||
|
else:
|
||||||
|
parts = version.split(".")
|
||||||
|
manifest_package_version = ""
|
||||||
|
for x in (0, 1, 2, 3):
|
||||||
|
if x == 0:
|
||||||
|
manifest_package_version += parts[x]
|
||||||
|
else:
|
||||||
|
manifest_package_version += "." + parts[x]
|
||||||
|
|
||||||
|
if outdir is not None:
|
||||||
|
output_file_base_name = os.path.join(outdir, name)
|
||||||
|
else:
|
||||||
|
output_file_base_name = name
|
||||||
|
|
||||||
|
outfile = open(output_file_base_name + ".exe.manifest", "w+")
|
||||||
|
outfile.write("<?xml version='1.0' encoding='UTF-8' standalone='yes'?>\n")
|
||||||
|
outfile.write(
|
||||||
|
"<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>\n"
|
||||||
|
)
|
||||||
|
outfile.write(" <assemblyIdentity version='%s'\n" % manifest_package_version)
|
||||||
|
outfile.write(" processorArchitecture='*'\n")
|
||||||
|
outfile.write(" name='%s.%s.%s.exe'\n" % (DOMAIN_NAME, package, name))
|
||||||
|
outfile.write(" type='win32' />\n")
|
||||||
|
outfile.write(" <trustInfo xmlns='urn:schemas-microsoft-com:asm.v3'>\n")
|
||||||
|
outfile.write(" <security>\n")
|
||||||
|
outfile.write(" <requestedPrivileges>\n")
|
||||||
|
outfile.write(" <requestedExecutionLevel\n")
|
||||||
|
|
||||||
|
if admin:
|
||||||
|
outfile.write(" level='requireAdministrator'\n")
|
||||||
|
else:
|
||||||
|
outfile.write(" level='asInvoker'\n")
|
||||||
|
|
||||||
|
outfile.write(" uiAccess='false' />\n")
|
||||||
|
outfile.write(" </requestedPrivileges>\n")
|
||||||
|
outfile.write(" </security>\n")
|
||||||
|
outfile.write(" </trustInfo>\n")
|
||||||
|
outfile.write("</assembly>\n")
|
||||||
|
outfile.close()
|
||||||
|
|
||||||
|
|
||||||
|
def write_rc_file(name, resource, outdir):
|
||||||
|
if outdir is not None:
|
||||||
|
output_file_base_name = os.path.join(outdir, name)
|
||||||
|
else:
|
||||||
|
output_file_base_name = name
|
||||||
|
|
||||||
|
if resource is None:
|
||||||
|
outfile = open(output_file_base_name + ".rc", "w+")
|
||||||
|
outfile.write("#define WIN32_LEAN_AND_MEAN\n")
|
||||||
|
outfile.write("#include <windows.h>\n")
|
||||||
|
else:
|
||||||
|
if resource != output_file_base_name + ".rc":
|
||||||
|
outfile = open(output_file_base_name + ".rc", "w+")
|
||||||
|
else:
|
||||||
|
outfile = open(output_file_base_name + ".final.rc", "w+")
|
||||||
|
srcfile = open(resource, "r")
|
||||||
|
outfile.write(srcfile.read())
|
||||||
|
srcfile.close()
|
||||||
|
|
||||||
|
outfile.write("\n")
|
||||||
|
outfile.write(
|
||||||
|
'CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "%s.exe.manifest"' % name
|
||||||
|
)
|
||||||
|
outfile.close()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
@ -24,3 +24,11 @@ if host_system != 'windows'
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
gen_visibility_macros = find_program('gen-visibility-macros.py')
|
gen_visibility_macros = find_program('gen-visibility-macros.py')
|
||||||
|
|
||||||
|
# This is only needed for 32-bit (x86) Windows builds
|
||||||
|
if host_system == 'windows' and host_machine.cpu_family() == 'x86'
|
||||||
|
embed_uac_manifest = true
|
||||||
|
gen_uac_manifest = find_program('generate-uac-manifest.py')
|
||||||
|
else
|
||||||
|
embed_uac_manifest = false
|
||||||
|
endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user