123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- #
- # preprocessor.py
- #
- import subprocess
- nocache = 1
- verbose = 0
- def blab(str):
- if verbose:
- print(str)
- ################################################################################
- #
- # Invoke GCC to run the preprocessor and extract enabled features
- #
- preprocessor_cache = {}
- def run_preprocessor(env, fn=None):
- filename = fn or 'buildroot/share/PlatformIO/scripts/common-dependencies.h'
- if filename in preprocessor_cache:
- return preprocessor_cache[filename]
- # Process defines
- build_flags = env.get('BUILD_FLAGS')
- build_flags = env.ParseFlagsExtended(build_flags)
- cxx = search_compiler(env)
- cmd = ['"' + cxx + '"']
- # Build flags from board.json
- #if 'BOARD' in env:
- # cmd += [env.BoardConfig().get("build.extra_flags")]
- for s in build_flags['CPPDEFINES']:
- if isinstance(s, tuple):
- cmd += ['-D' + s[0] + '=' + str(s[1])]
- else:
- cmd += ['-D' + s]
- cmd += ['-D__MARLIN_DEPS__ -w -dM -E -x c++']
- depcmd = cmd + [ filename ]
- cmd = ' '.join(depcmd)
- blab(cmd)
- try:
- define_list = subprocess.check_output(cmd, shell=True).splitlines()
- except:
- define_list = {}
- preprocessor_cache[filename] = define_list
- return define_list
- ################################################################################
- #
- # Find a compiler, considering the OS
- #
- def search_compiler(env):
- global nocache
- from pathlib import Path, PurePath
- ENV_BUILD_PATH = Path(env['PROJECT_BUILD_DIR'], env['PIOENV'])
- GCC_PATH_CACHE = ENV_BUILD_PATH / ".gcc_path"
- gccpath = None
- try:
- gccpath = env.GetProjectOption('custom_gcc')
- blab("Getting compiler from env")
- return gccpath
- except:
- pass
- # Warning: The cached .gcc_path will obscure a newly-installed toolkit
- if not nocache and GCC_PATH_CACHE.exists():
- blab("Getting g++ path from cache")
- return GCC_PATH_CACHE.read_text()
- path_separator = ':'
- gcc_exe = '*g++'
- if env['PLATFORM'] == 'win32':
- path_separator = ';'
- gcc_exe += ".exe"
- envpath = map(Path, env['ENV']['PATH'].split(path_separator))
- # Search for the compiler in PATH
- for ppath in envpath:
- # Use any item in $PATH corresponding to a platformio toolchain bin folder
- if ppath.match(env['PROJECT_PACKAGES_DIR'] + "/**/bin"):
- for gpath in ppath.glob(gcc_exe):
- # Skip '*-elf-g++' (crosstool-NG) except for xtensa32
- if not gpath.stem.endswith('-elf-g++') or "xtensa32" in str(gpath):
- gccpath = str(gpath.resolve())
- break
- if not gccpath:
- for ppath in envpath:
- for gpath in ppath.glob(gcc_exe):
- # Skip macOS Clang
- if not (gpath == 'usr/bin/g++' and env['PLATFORM'] == 'darwin'):
- gccpath = str(gpath.resolve())
- break
- if not gccpath:
- gccpath = env.get('CXX')
- blab("Couldn't find a compiler! Fallback to '%s'" % gccpath)
- nocache = 1
- # Cache the g++ path to speed up the next build
- if not nocache and gccpath and ENV_BUILD_PATH.exists():
- blab("Caching g++ for current env")
- GCC_PATH_CACHE.write_text(gccpath)
- return gccpath
|