meson: fix cross-compilation issues with gperf header file preprocessing

Pass c_args to the compiler when preprocessing the gperf header file,
they might contain important bits without which compilation/preprocessing
might fail (e.g. with clang on Android). cc.cmd_array() does not include
the c_args and we can't easily look them up from the meson.build file, so
we have to retrieve from the introspection info.

This is basically the Meson equivalent to commit 57103773.
This commit is contained in:
Tim-Philipp Müller 2021-01-17 12:51:59 +00:00 committed by Akira TAGOH
parent 7bfbaecf81
commit ae9ac2a1bf
2 changed files with 18 additions and 3 deletions

View File

@ -1,5 +1,6 @@
import argparse
import subprocess
import json
import os
import re
@ -7,12 +8,23 @@ if __name__== '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('input')
parser.add_argument('output')
parser.add_argument('buildroot')
args = parser.parse_known_args()
print (args[0].output)
# c_args might contain things that are essential for crosscompilation, but
# are not included in cc.cmd_array(), so we have to look them up ourselves
host_cargs = []
buildroot = args[0].buildroot
with open(os.path.join(buildroot, 'meson-info', 'intro-buildoptions.json')) as json_file:
bopts = json.load(json_file)
for opt in bopts:
if opt['name'] == 'c_args' and opt['section'] == 'compiler' and opt['machine'] == 'host':
host_cargs = opt['value']
break
cpp = args[1]
ret = subprocess.run(cpp + [args[0].input], stdout=subprocess.PIPE, check=True)
ret = subprocess.run(cpp + host_cargs + [args[0].input], stdout=subprocess.PIPE, check=True)
stdout = ret.stdout.decode('utf8')

View File

@ -44,10 +44,13 @@ endif
cpp += ['-I', join_paths(meson.current_source_dir(), '..')]
# Can use meson.project_build_dir() once we require Meson 0.56
project_build_dir = meson.current_build_dir() / '..'
fcobjshash_gperf = custom_target('fcobjshash.gperf',
input: 'fcobjshash.gperf.h',
output: 'fcobjshash.gperf',
command: [python3, files('cutout.py')[0], '@INPUT@', '@OUTPUT@', cpp],
command: [python3, files('cutout.py')[0], '@INPUT@', '@OUTPUT@', project_build_dir, cpp],
build_by_default: true,
)