mirror of
				https://github.com/smaeul/u-boot.git
				synced 2025-10-31 20:18:18 +00:00 
			
		
		
		
	Once u-boot's build system invokes
python3 scripts/dtc/pylibfdt/setup.py --quiet build_ext --inplace
it may fail with
scripts/dtc/pylibfdt/setup.py:40: SyntaxWarning: invalid escape sequence '\w'
  RE_KEY_VALUE = re.compile('(?P<key>\w+) *(?P<plus>[+])?= *(?P<value>.*)$')
depending on the used Python version.
Explicitly mark the regex string as raw string to avoid the warning.
Signed-off-by: Florian Schmaus <flo@geekplace.eu>
Reviewed-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
		
	
			
		
			
				
	
	
		
			171 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			171 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/env python3
 | |
| # SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause)
 | |
| 
 | |
| """
 | |
| setup.py file for SWIG libfdt
 | |
| Copyright (C) 2017 Google, Inc.
 | |
| Written by Simon Glass <sjg@chromium.org>
 | |
| 
 | |
| This script is modified from the upstream version, to fit in with the U-Boot
 | |
| build system.
 | |
| 
 | |
| Files to be built into the extension are provided in SOURCES
 | |
| C flags to use are provided in CPPFLAGS
 | |
| Object file directory is provided in OBJDIR
 | |
| Version is provided in VERSION
 | |
| 
 | |
| If these variables are not given they are parsed from the Makefiles. This
 | |
| allows this script to be run stand-alone, e.g.:
 | |
| 
 | |
|     ./pylibfdt/setup.py install [--prefix=...]
 | |
| """
 | |
| 
 | |
| from setuptools import setup, Extension
 | |
| from setuptools.command.build_py import build_py as _build_py
 | |
| import os
 | |
| import re
 | |
| import sys
 | |
| 
 | |
| try:
 | |
|     from setuptools import sic
 | |
| except ImportError:
 | |
|     pass
 | |
| 
 | |
| srcdir = os.path.dirname(__file__)
 | |
| 
 | |
| with open(os.path.join(srcdir, "../README"), "r") as fh:
 | |
|     long_description = fh.read()
 | |
| 
 | |
| # Decodes a Makefile assignment line into key and value (and plus for +=)
 | |
| RE_KEY_VALUE = re.compile(r'(?P<key>\w+) *(?P<plus>[+])?= *(?P<value>.*)$')
 | |
| 
 | |
| def get_top_builddir():
 | |
|     if '--top-builddir' in sys.argv:
 | |
|         index = sys.argv.index('--top-builddir')
 | |
|         sys.argv.pop(index)
 | |
|         return sys.argv.pop(index)
 | |
|     else:
 | |
|         return os.path.join(srcdir, '..')
 | |
| 
 | |
| top_builddir = get_top_builddir()
 | |
| 
 | |
| def ParseMakefile(fname):
 | |
|     """Parse a Makefile to obtain its variables.
 | |
| 
 | |
|     This collects variable assigments of the form:
 | |
| 
 | |
|         VAR = value
 | |
|         VAR += more
 | |
| 
 | |
|     It does not pick out := assignments, as these are not needed here. It does
 | |
|     handle line continuation.
 | |
| 
 | |
|     Returns a dict:
 | |
|         key: Variable name (e.g. 'VAR')
 | |
|         value: Variable value (e.g. 'value more')
 | |
|     """
 | |
|     makevars = {}
 | |
|     with open(fname) as fd:
 | |
|         prev_text = ''  # Continuation text from previous line(s)
 | |
|         for line in fd.read().splitlines():
 | |
|           if line and line[-1] == '\\':  # Deal with line continuation
 | |
|             prev_text += line[:-1]
 | |
|             continue
 | |
|           elif prev_text:
 | |
|             line = prev_text + line
 | |
|             prev_text = ''  # Continuation is now used up
 | |
|           m = RE_KEY_VALUE.match(line)
 | |
|           if m:
 | |
|             value = m.group('value') or ''
 | |
|             key = m.group('key')
 | |
| 
 | |
|             # Appending to a variable inserts a space beforehand
 | |
|             if 'plus' in m.groupdict() and key in makevars:
 | |
|               makevars[key] += ' ' + value
 | |
|             else:
 | |
|               makevars[key] = value
 | |
|     return makevars
 | |
| 
 | |
| def GetEnvFromMakefiles():
 | |
|     """Scan the Makefiles to obtain the settings we need.
 | |
| 
 | |
|     This assumes that this script is being run from the top-level directory,
 | |
|     not the pylibfdt directory.
 | |
| 
 | |
|     Returns:
 | |
|         Tuple with:
 | |
|             List of swig options
 | |
|             Version string
 | |
|             List of files to build
 | |
|             List of extra C preprocessor flags needed
 | |
|             Object directory to use (always '')
 | |
|     """
 | |
|     basedir = os.path.dirname(os.path.dirname(os.path.abspath(sys.argv[0])))
 | |
|     swig_opts = ['-I%s' % basedir]
 | |
|     makevars = ParseMakefile(os.path.join(basedir, 'Makefile'))
 | |
|     version = '%s.%s.%s' % (makevars['VERSION'], makevars['PATCHLEVEL'],
 | |
|                             makevars['SUBLEVEL'])
 | |
|     makevars = ParseMakefile(os.path.join(basedir, 'libfdt', 'Makefile.libfdt'))
 | |
|     files = makevars['LIBFDT_SRCS'].split()
 | |
|     files = [os.path.join(basedir, 'libfdt', fname) for fname in files]
 | |
|     files.append('libfdt.i')
 | |
|     cflags = ['-I%s' % basedir, '-I%s/libfdt' % basedir]
 | |
|     objdir = ''
 | |
|     return swig_opts, version, files, cflags, objdir
 | |
| 
 | |
| 
 | |
| progname = sys.argv[0]
 | |
| files = os.environ.get('SOURCES', '').split()
 | |
| cflags = os.environ.get('CPPFLAGS', '').split()
 | |
| objdir = os.environ.get('OBJDIR')
 | |
| try:
 | |
|     version = sic(os.environ.get('VERSION'))
 | |
| except:
 | |
|     version = os.environ.get('VERSION')
 | |
| swig_opts = os.environ.get('SWIG_OPTS', '').split()
 | |
| 
 | |
| # If we were called directly rather than through our Makefile (which is often
 | |
| # the case with Python module installation), read the settings from the
 | |
| # Makefile.
 | |
| if not all((swig_opts, version, files, cflags, objdir)):
 | |
|     swig_opts, version, files, cflags, objdir = GetEnvFromMakefiles()
 | |
| 
 | |
| libfdt_module = Extension(
 | |
|     '_libfdt',
 | |
|     sources=files,
 | |
|     include_dirs=[os.path.join(srcdir, 'libfdt')],
 | |
|     library_dirs=[os.path.join(top_builddir, 'libfdt')],
 | |
|     swig_opts=swig_opts,
 | |
| )
 | |
| 
 | |
| class build_py(_build_py):
 | |
|     def run(self):
 | |
|         self.run_command("build_ext")
 | |
|         return super().run()
 | |
| 
 | |
| setup(
 | |
|     name='libfdt',
 | |
|     version=version,
 | |
|     cmdclass = {'build_py' : build_py},
 | |
|     author='Simon Glass',
 | |
|     author_email='sjg@chromium.org',
 | |
|     description='Python binding for libfdt',
 | |
|     ext_modules=[libfdt_module],
 | |
|     package_dir={'': objdir},
 | |
|     py_modules=['libfdt'],
 | |
| 
 | |
|     long_description=long_description,
 | |
|     long_description_content_type="text/plain",
 | |
|     url="https://git.kernel.org/pub/scm/utils/dtc/dtc.git",
 | |
|     license="BSD",
 | |
|     license_files=["GPL", "BSD-2-Clause"],
 | |
| 
 | |
|     classifiers=[
 | |
|         "Programming Language :: Python :: 3",
 | |
|         "License :: OSI Approved :: BSD License",
 | |
|         "License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+)",
 | |
|         "Operating System :: OS Independent",
 | |
|     ],
 | |
| 
 | |
| )
 |