| #!/usr/bin/env python3 |
| |
| # Helper for building resource files when building for windows. Always |
| # generates a .rc from the input .rc file. When building with msvc we |
| # additionally generate a .res file with 'rc', when building with gcc, we use |
| # windres to directly generate a .o. Additionally we generate basic |
| # dependencies if depfile is specified. |
| |
| import argparse |
| import os |
| import subprocess |
| import sys |
| |
| parser = argparse.ArgumentParser(description='generate PostgreSQL rc file') |
| |
| parser.add_argument('--srcdir', type=os.path.abspath, |
| required=True) |
| parser.add_argument('--builddir', type=os.path.abspath, |
| required=True) |
| |
| binaries = parser.add_argument_group('binaries') |
| binaries.add_argument('--windres', type=os.path.abspath) |
| binaries.add_argument('--rc', type=os.path.abspath) |
| |
| inout = parser.add_argument_group('inout') |
| inout.add_argument('--depfile', type=argparse.FileType('w')) |
| inout.add_argument('--input', type=argparse.FileType('r'), |
| required=True) |
| inout.add_argument('--rcout', type=argparse.FileType('w'), |
| required=True) |
| inout.add_argument('--out', type=str, |
| required=True) |
| |
| replacements = parser.add_argument_group('replacements') |
| replacements.add_argument('--FILEDESC', type=str) |
| replacements.add_argument('--NAME', type=str, required=True) |
| replacements.add_argument('--VFT_TYPE', type=str, required=True) |
| replacements.add_argument('--FILEENDING', type=str, required=True) |
| replacements.add_argument('--ICO', type=str) |
| |
| args = parser.parse_args() |
| |
| # determine replacement strings |
| |
| internal_name = '"{0}"'.format(args.NAME) |
| original_name = '"{0}.{1}"'.format(args.NAME, args.FILEENDING) |
| |
| # if no description is passed in, generate one based on the name |
| if args.FILEDESC: |
| filedesc = args.FILEDESC |
| elif args.NAME: |
| if args.VFT_TYPE == 'VFT_DLL': |
| filedesc = 'PostgreSQL {0} library'.format(args.NAME) |
| else: |
| filedesc = 'PostgreSQL {0} binary'.format(args.NAME) |
| filedesc = '"{0}"'.format(filedesc) |
| |
| |
| if args.ICO: |
| ico = 'IDI_ICON ICON "{0}"'.format(args.ICO) |
| if args.depfile: |
| args.depfile.write("{0} : {1}\n".format(args.rcout.name, args.ICO)) |
| else: |
| ico = '' |
| |
| |
| data = args.input.read() |
| |
| data = data.replace('VFT_APP', args.VFT_TYPE) |
| data = data.replace('_INTERNAL_NAME_', internal_name) |
| data = data.replace('_ORIGINAL_NAME_', original_name) |
| data = data.replace('FILEDESC', filedesc) |
| data = data.replace("_ICO_", ico) |
| |
| args.rcout.write(data) |
| args.rcout.close() |
| |
| if args.windres: |
| cmd = [ |
| args.windres, |
| '-I{0}/src/include/'.format(args.builddir), |
| '-I{0}/src/include/'.format(args.srcdir), |
| '-o', args.out, '-i', args.rcout.name, |
| ] |
| elif args.rc: |
| cmd = [ |
| args.rc, '/nologo', |
| '-I{0}/src/include/'.format(args.builddir), |
| '-I{0}/src/include/'.format(args.srcdir), |
| '/fo', args.out, args.rcout.name, |
| ] |
| else: |
| sys.exit('either --windres or --rc needs to be specified') |
| |
| sp = subprocess.run(cmd) |
| if sp.returncode != 0: |
| sys.exit(sp.returncode) |
| |
| # It'd be nicer if we could generate correct dependencies here, but 'rc' |
| # doesn't support doing so. It's unlikely we'll ever need more, so... |
| if args.depfile: |
| args.depfile.write("{0} : {1}\n".format( |
| args.rcout.name, args.input.name)) |
| args.depfile.write("{0} : {1}/{2}\n".format( |
| args.out, args.builddir, 'src/include/pg_config.h')) |