[vlc-devel] [PATCH v2] contrib: Workaround for absolute paths in pc files
Steve Lhomme
robux4 at ycbcr.xyz
Thu Oct 24 14:32:09 CEST 2019
Works for me
On 2019-10-24 10:05, Marvin Scholz wrote:
> Meson generates pc files with absolute paths to static libraries, while
> this is completely fine, libtool can not deal with this and produces
> broken build results in that case.
> ---
> contrib/src/libplacebo/rules.mak | 3 +
> contrib/src/pkg-rewrite-absolute.py | 141 ++++++++++++++++++++++++++++
> 2 files changed, 144 insertions(+)
> create mode 100755 contrib/src/pkg-rewrite-absolute.py
>
> diff --git a/contrib/src/libplacebo/rules.mak b/contrib/src/libplacebo/rules.mak
> index 9d4295e72c..1f34691824 100644
> --- a/contrib/src/libplacebo/rules.mak
> +++ b/contrib/src/libplacebo/rules.mak
> @@ -36,4 +36,7 @@ libplacebo: $(PLACEBO_ARCHIVE) .sum-libplacebo
> cd $< && cd build && ninja install
> # Work-around messon issue https://github.com/mesonbuild/meson/issues/4091
> sed -i.orig -e 's/Libs: \(.*\) -L$${libdir} -lplacebo/Libs: -L$${libdir} -lplacebo \1/g' $(PREFIX)/lib/pkgconfig/libplacebo.pc
> +# Work-around for full paths to static libraries, which libtool does not like
> +# See https://github.com/mesonbuild/meson/issues/5479
> + (cd $(UNPACK_DIR) && $(SRC_BUILT)/pkg-rewrite-absolute.py -i "$(PREFIX)/lib/pkgconfig/libplacebo.pc")
> touch $@
> diff --git a/contrib/src/pkg-rewrite-absolute.py b/contrib/src/pkg-rewrite-absolute.py
> new file mode 100755
> index 0000000000..7cab6c89d4
> --- /dev/null
> +++ b/contrib/src/pkg-rewrite-absolute.py
> @@ -0,0 +1,141 @@
> +#!/usr/bin/env python3
> +import os, sys, argparse
> +
> +class PkgConfigFile():
> + """Representation of a pkg-config file (.pc)"""
> +
> + pc_variables = {}
> + pc_variables_expanded = {}
> +
> + pc_keywords = {}
> +
> + def __init__(self, file):
> + for line in file:
> + self.parse_pc_line(line)
> +
> + def parse_pc_line(self, line):
> + for i, c in enumerate(line):
> + if c is '=':
> + # This is a pkg-config variable line
> + key = line[:i].strip()
> + val = line[(i + 1):].strip()
> +
> + # Add unexpanded version of variable
> + self.pc_variables.update({ key : val })
> +
> + # Add expanded version of variable
> + self.pc_variables_expanded.update({ key : self.expand_pc_vars(val) })
> + elif c is ':':
> + # This is a pkg-config keyword line
> + key = line[:i].strip()
> + val = line[(i + 1):].strip()
> +
> + self.pc_keywords.update({ key : val })
> +
> + def expand_pc_vars(self, line):
> + for key, val in self.pc_variables_expanded.items():
> + line = line.replace('${' + key + '}', val)
> + return line
> +
> + def get_variable(self, key, expand=True):
> + if expand:
> + return self.pc_variables_expanded.get(key, None)
> + else:
> + return self.pc_variables.get(key, None)
> +
> + def get_keyword(self, key, expand=True):
> + keyword = self.pc_keywords.get(key, None)
> + if expand and keyword != None:
> + return self.expand_pc_vars(keyword)
> + else:
> + return keyword
> +
> + def set_keyword(self, key, value):
> + self.pc_keywords.update({ key : value })
> +
> + def write(self, file):
> + pc_contents = ''
> + # Print variables
> + for key, val in self.pc_variables.items():
> + pc_contents += key + '=' + val + '\n'
> + pc_contents += '\n'
> + # Print keywords
> + for key, val in self.pc_keywords.items():
> + pc_contents += key + ': ' + val + '\n'
> +
> + file.write(pc_contents)
> +
> +def remove_str_fix(text, prefix, suffix):
> + start = len(prefix) if text.startswith(prefix) else 0
> + end_offset = len(suffix) if text.endswith(suffix) else 0
> + end = len(text) - end_offset
> + return text[start:end]
> +
> +def rewrite_abs_to_rel(pc_file):
> + linker_args = pc_file.get_keyword('Libs', expand=False)
> + if linker_args is None:
> + raise KeyError('No "Libs" keyword in input .pc file found!')
> + linker_args_list = linker_args.split()
> +
> + # Replace absolute library paths with relative ones
> + # i.e. /foo/bar/baz.a to -L/foo/bar -lbaz
> + lib_paths = []
> + out_args = []
> + for arg in linker_args_list:
> + if arg.startswith('-L'):
> + path = arg[2:]
> + path = pc_file.expand_pc_vars(path)
> + lib_paths.append(path)
> +
> + # Filter all absolute static library paths
> + if arg.startswith('/') and arg.endswith('.a'):
> + lib_path = os.path.dirname(arg)
> + lib_filename = os.path.basename(arg)
> + # Remove lib prefix and .a suffix
> + lib_name = remove_str_fix(lib_filename, 'lib', '.a')
> + if lib_path not in lib_paths:
> + out_args.append('-L' + lib_path)
> + lib_paths.append(lib_path)
> + out_args.append('-l' + lib_name)
> + else:
> + out_args.append(arg)
> +
> + linker_args = ' '.join(out_args)
> + pc_file.set_keyword('Libs', linker_args)
> +
> +# Main function
> +# Do argument parsing and other stuff needed
> +# for CLI usage here.
> +def main():
> + if not sys.version_info >= (3, 4):
> + print("Python version 3.4 or higher required!", file=sys.stderr)
> + exit(1)
> +
> + # Create main parser
> + parser = argparse.ArgumentParser()
> + parser.add_argument('-i', '--input', required=True)
> + parser.add_argument('-o', '--output')
> +
> + args = parser.parse_args()
> +
> + # Default to input file (in-place editing) if no output file is given
> + args.output = args.output or args.input
> +
> + # Read .pc from input file
> + input_file = sys.stdin if args.input is '-' else open(args.input, 'r')
> + pc_file = PkgConfigFile(input_file)
> + if input_file is not sys.stdin:
> + input_file.close()
> +
> + rewrite_abs_to_rel(pc_file)
> +
> + # Write output
> + output_file = sys.stdout if args.output is '-' else open(args.output, 'w')
> + pc_file.write(output_file)
> + if output_file is not sys.stdout:
> + output_file.close()
> +
> + return 0
> +
> +if __name__ == "__main__":
> + exit(main())
> --
> 2.21.0 (Apple Git-122)
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
>
More information about the vlc-devel
mailing list