#!/usr/bin/env python3 # # Copyright (c) 2024 Vojtech Horky # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # - Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # - Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # - The name of the author may not be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # pkg-config-like tool for HelenOS libraries # HelenOS Cross Compiler Wrapper (XCW) # Facilitate cross-compiling external software to HelenOS # import argparse import os import sys # Package dependencies: always list only immediate dependencies so that # we can get proper ordering for static libraries CONFIG_DEPENDENCIES = { 'libui': ['libdisplay', 'libcongfx', 'libgfxfont', 'libriff', 'libmemgfx', 'libconsole'], 'libdisplay': ['libgfx', 'libipcgfx', 'libinput'], 'libconsole': ['libinput', 'liboutput'], 'libipcfgfx': ['libgfx'], 'libgfximage': ['libpixconv'], } CONFIG_CFLAGS = { } CONFIG_LIBS = { } def get_with_dependencies(package, dependencies_first=True): deps = CONFIG_DEPENDENCIES.get(package, []) all_deps = [ i for d in deps for i in get_with_dependencies(d, dependencies_first) ] result = (all_deps if dependencies_first else []) + [package] + ([] if dependencies_first else all_deps) seen = set() return [ i for i in result if not (i in seen or seen.add(i)) ] def get_build_root(): dn = lambda x : os.path.dirname(x) return dn(dn(dn(dn(os.path.abspath(sys.argv[0]))))) def main(): args = argparse.ArgumentParser(description='pkg-config-like tool for HelenOS') args.add_argument( '--cflags', dest='cflags', action='store_true', default=False, help='Print required C compiler flags to stdout.' ) args.add_argument( '--libs', dest='libs', action='store_true', default=False, help='Print required linker flags to stdout.' ) args.add_argument('packages', metavar='PACKAGE', nargs='+') config = args.parse_args() export_dir = os.getenv('EXPORT_DIR', get_build_root() + '/export') result = [] for package in config.packages: if config.cflags: for i in get_with_dependencies(package, False): if i in CONFIG_CFLAGS: result.extend(CONFIG_CFLAGS[i]) else: result.append(f'-I{export_dir}/include/{i}') if config.libs: for i in get_with_dependencies(package, False): if i in CONFIG_LIBS: result.extend(CONFIG_LIBS[i]) else: result.append(f'{export_dir}/lib/{i}.a') print(' '.join(result)) if __name__ == '__main__': main()