diff options
author | Jukka Jylänki <jujjyl@gmail.com> | 2013-09-04 20:49:38 +0300 |
---|---|---|
committer | Jukka Jylänki <jujjyl@gmail.com> | 2013-09-10 00:19:10 +0300 |
commit | de70a4803489017a3cb1f4f6f6462bcf6f3c884b (patch) | |
tree | ad0500b0049cfc891495eaaaed243b9cfe0d80ad /tools | |
parent | 2456359a7c8e31ce62fb16c2072b612b675c2c4c (diff) |
Add Building.which() function to help find a tool in PATH. Use mingw32-make instead of the nonexistent 'make' with cmake on Windows if mingw32-make is found in PATH. Helps with issue #695.
Diffstat (limited to 'tools')
-rw-r--r-- | tools/shared.py | 55 |
1 files changed, 50 insertions, 5 deletions
diff --git a/tools/shared.py b/tools/shared.py index 8031d99c..5beaab60 100644 --- a/tools/shared.py +++ b/tools/shared.py @@ -820,14 +820,52 @@ class Building: env['EMSCRIPTEN'] = path_from_root() return env + # Finds the given executable 'program' in PATH. Operates like the Unix tool 'which'. + @staticmethod + def which(program): + import os + def is_exe(fpath): + return os.path.isfile(fpath) and os.access(fpath, os.X_OK) + + fpath, fname = os.path.split(program) + if fpath: + if is_exe(program): + return program + else: + for path in os.environ["PATH"].split(os.pathsep): + path = path.strip('"') + exe_file = os.path.join(path, program) + if is_exe(exe_file): + return exe_file + + if WINDOWS and not '.' in fname: + if is_exe(exe_file + '.exe'): + return exe_file + '.exe' + if is_exe(exe_file + '.cmd'): + return exe_file + '.cmd' + if is_exe(exe_file + '.bat'): + return exe_file + '.bat' + + return None + @staticmethod def handle_CMake_toolchain(args, env): - # Don't append a toolchain file if the user specified one already. - for arg in args: - if '-DCMAKE_TOOLCHAIN_FILE' in arg: - return args - args.append('-DCMAKE_TOOLCHAIN_FILE=' + path_from_root('cmake', 'Platform', 'Emscripten.cmake')) + def has_substr(array, substr): + for arg in array: + if substr in arg: + return True + return False + + # Append the Emscripten toolchain file if the user didn't specify one. + if not has_substr(args, '-DCMAKE_TOOLCHAIN_FILE'): + args.append('-DCMAKE_TOOLCHAIN_FILE=' + path_from_root('cmake', 'Platform', 'Emscripten.cmake')) + + # On Windows specify MinGW Makefiles if we have MinGW and no other toolchain was specified, to avoid CMake + # pulling in a native Visual Studio, or Unix Makefiles. + if not '-G' in args and Building.which('mingw32-make'): + args += ['-G', 'MinGW Makefiles'] + return args @staticmethod @@ -858,6 +896,13 @@ class Building: logging.error('Executable to run not specified.') sys.exit(1) #args += ['VERBOSE=1'] + + # On Windows prefer building with mingw32-make instead of make, if it exists. + if WINDOWS and args[0] == 'make': + mingw32_make = Building.which('mingw32-make') + if mingw32_make: + args[0] = mingw32_make + try: process = Popen(args, stdout=stdout, stderr=stderr, env=env) process.communicate() |