You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
130 lines
4.8 KiB
130 lines
4.8 KiB
#!/usr/bin/env python3
|
|
|
|
# SPDX-License-Identifier: ISC
|
|
# Copyright © 2025 VideoLabs, VLC authors and VideoLAN
|
|
#
|
|
# Authors: Steve Lhomme <robux4@videolabs.io>
|
|
|
|
import argparse
|
|
import os
|
|
import pathlib
|
|
import re
|
|
import subprocess
|
|
import sys
|
|
|
|
def call_qmake(qmake:str, qtconf, builddir, pro, debug:bool) -> str:
|
|
if builddir and builddir != '' and not os.path.exists(builddir):
|
|
os.makedirs(builddir)
|
|
qmake_cmd = [ qmake ]
|
|
if debug:
|
|
qmake_cmd += ['CONFIG+=debug']
|
|
if qtconf and qtconf != '':
|
|
qmake_cmd += [ '-qtconf', qtconf ]
|
|
qmake_cmd += [pro, '-o', '-' ]
|
|
call = subprocess.Popen(qmake_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=builddir)
|
|
stdout_bin, stderr_bin = call.communicate()
|
|
errcode = call.wait()
|
|
|
|
if errcode != 0:
|
|
sys.stderr.write(stderr_bin.decode('utf-8'))
|
|
sys.exit(errcode)
|
|
|
|
return stdout_bin.decode('utf-8')
|
|
|
|
if __name__ == "__main__":
|
|
parser = argparse.ArgumentParser(
|
|
description="This program provides the list of directories/defines to use with Qt static"
|
|
)
|
|
parser.add_argument("--qmake",
|
|
type=pathlib.Path, required=True,
|
|
help="native qmake path")
|
|
parser.add_argument("--qtconf",
|
|
type=str, required=False,
|
|
help="qmake qtconf path")
|
|
parser.add_argument("--pro",
|
|
type=pathlib.Path, required=True,
|
|
help=".pro file to use as base")
|
|
parser.add_argument("--builddir",
|
|
type=str, required=True,
|
|
help="build directory path")
|
|
|
|
parser.add_argument("--cflags",
|
|
required=False, action='store_true',
|
|
help="get the list of compiler flags")
|
|
parser.add_argument("--libs",
|
|
required=False, action='store_true',
|
|
help="get the list of libraries")
|
|
parser.add_argument("--ldflags",
|
|
required=False, action='store_true',
|
|
help="get the list of linker flags")
|
|
parser.add_argument("--debug",
|
|
required=False, action='store_true',
|
|
help="debug mode")
|
|
parser.add_argument("--moc_include_dirs",
|
|
required=False, action='store_true',
|
|
help="moc include dirs")
|
|
args = parser.parse_args()
|
|
|
|
result = ''
|
|
sources = [ os.path.join(args.builddir, '.qmake.stash') ]
|
|
in_sources = False
|
|
makefile = call_qmake(args.qmake, args.qtconf, args.builddir, args.pro, args.debug)
|
|
|
|
moc_include_dirs_re = re.compile(r"^\s+moc_include_dirs\s+(.*)")
|
|
for line in makefile.splitlines():
|
|
if in_sources:
|
|
l = line.strip()
|
|
in_sources = l.endswith('\\')
|
|
if in_sources:
|
|
l = l[:-1].strip()
|
|
sources += l.split(' ')
|
|
elif line.startswith('SOURCES '):
|
|
l = re.sub(r'SOURCES[\W]+=', ' ', line).strip()
|
|
in_sources = l.endswith(' \\')
|
|
if in_sources:
|
|
l = l[:-1].strip()
|
|
sources += l.split(' ')
|
|
elif line.startswith('DEFINES '):
|
|
if args.cflags:
|
|
l = re.sub(r'DEFINES[\W]+=', ' ', line)
|
|
for i in l.strip().split(' '):
|
|
result += ' ' + i
|
|
elif line.startswith('INCPATH '):
|
|
if args.cflags:
|
|
l = re.sub(r'INCPATH[\W]+=', ' ', line)
|
|
for i in l.strip().split(' '):
|
|
result += ' ' + i
|
|
elif line.startswith('LFLAGS '):
|
|
if args.ldflags:
|
|
l = re.sub(r'LFLAGS[\W]+=', ' ', line)
|
|
for i in l.strip().split(' '):
|
|
result += ' ' + i
|
|
elif line.startswith('LIBS '):
|
|
if args.libs:
|
|
l = re.sub(r'LIBS[\W]+=', ' ', line).split(' ')
|
|
for lib in l:
|
|
if lib == '':
|
|
continue
|
|
if lib == '$(SUBLIBS)':
|
|
continue
|
|
if lib.startswith('-l'):
|
|
result += ' ' + lib
|
|
elif lib.endswith('.so') or lib.endswith('.a'):
|
|
libname = os.path.splitext(os.path.basename(lib))[0]
|
|
if libname.startswith('lib'):
|
|
libdir = os.path.dirname(lib)
|
|
result += ' -L' + libdir
|
|
result += ' -l' + libname[3:]
|
|
else:
|
|
result += ' ' + lib
|
|
elif args.moc_include_dirs:
|
|
m = moc_include_dirs_re.match(line)
|
|
if m:
|
|
for i in l.strip().split(' '):
|
|
result += f"-I{i}"
|
|
|
|
for generated in sources:
|
|
if os.path.exists(generated):
|
|
os.remove(generated)
|
|
|
|
sys.stdout.write(result)
|
|
|