[vlc-devel] [PATCH] contrib: Workaround for absolute paths in pc files
Steve Lhomme
robux4 at ycbcr.xyz
Fri Oct 4 15:08:52 CEST 2019
Can't Python create a temporary file and move it on its own ? That would
be easier to read and cleaner to use.
On 2019-10-04 14:23, 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 | 5 ++
> contrib/src/pkg-rewrite-absolute.py | 107 ++++++++++++++++++++++++++++
> 2 files changed, 112 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..ef3d0f19ef 100644
> --- a/contrib/src/libplacebo/rules.mak
> +++ b/contrib/src/libplacebo/rules.mak
> @@ -36,4 +36,9 @@ 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 \
> + "$(PREFIX)/lib/pkgconfig/libplacebo.pc" "$(PREFIX)/lib/pkgconfig/libplacebo.pc.tmp" && \
> + mv "$(PREFIX)/lib/pkgconfig/libplacebo.pc.tmp" "$(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..4eb78b92e8
> --- /dev/null
> +++ b/contrib/src/pkg-rewrite-absolute.py
> @@ -0,0 +1,107 @@
> +#!/usr/bin/env python3
> +import os
> +import 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)
> +
> +# Remove all absolute paths to static libraries like /foo/bar/baz.a
> +# and replace with -L/foo/bar -lbaz instead.
> +def libs_replace_absolutes(args):
> + lib_paths = []
> + out_args = []
> + for arg in args:
> + if arg[:2] == '-L':
> + path = arg[2:]
> + path = pc_file.expand_pc_vars(path)
> + lib_paths.append(path)
> +
> + # Filter all absolute static library paths
> + if arg[0] == '/' and arg[-2:] == '.a':
> + lib_path = os.path.dirname(arg)
> + lib_filename = os.path.basename(arg)
> + lib_name = lib_filename[3:-2] # Remove lib prefix and .a suffix
> + 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)
> + return out_args
> +
> +# Argument parsing
> +parser = argparse.ArgumentParser()
> +parser.add_argument('infile', type=argparse.FileType('r'))
> +parser.add_argument('outfile', type=argparse.FileType('w'))
> +args = parser.parse_args()
> +
> +with args.infile:
> + pc_file = PkgConfigFile(args.infile)
> +
> + linker_args_list = pc_file.get_keyword('Libs', expand=False).split()
> +
> + linker_args_list = libs_replace_absolutes(linker_args_list)
> + linker_args = ' '.join(linker_args_list)
> + pc_file.set_keyword('Libs', linker_args)
> + pc_file.write(args.outfile)
> --
> 2.20.1 (Apple Git-117)
>
> _______________________________________________
> 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