def run_in_windows_bash(conanfile, bashcmd, cwd=None, subsystem=None, msys_mingw=True, env=None): """ Will run a unix command inside a bash terminal It requires to have MSYS2, CYGWIN, or WSL """ env = env or {} if platform.system() != "Windows": raise ConanException("Command only for Windows operating system") subsystem = subsystem or os_info.detect_windows_subsystem() if not subsystem: raise ConanException("Cannot recognize the Windows subsystem, install MSYS2/cygwin or specify a build_require " "to apply it.") if subsystem == MSYS2 and msys_mingw: # This needs to be set so that msys2 bash profile will set up the environment correctly. env_vars = {"MSYSTEM": "MINGW32" if conanfile.settings.get_safe("arch") == "x86" else "MINGW64", "MSYS2_PATH_TYPE": "inherit"} else: env_vars = {} with environment_append(env_vars): hack_env = "" if subsystem != WSL: # In the bash.exe from WSL this trick do not work, always the /usr/bin etc at first place inherited_path = conanfile.env.get("PATH", None) if isinstance(inherited_path, list): paths = [unix_path(path, path_flavor=subsystem) for path in inherited_path] inherited_path = ":".join(paths) else: inherited_path = unix_path(inherited_path, path_flavor=subsystem) if "PATH" in env: tmp = unix_path(env["PATH"].replace(";", ":"), path_flavor=subsystem) inherited_path = "%s:%s" % (tmp, inherited_path) if inherited_path else tmp # Put the build_requires and requires path at the first place inside the shell hack_env = ' && PATH="%s:$PATH"' % inherited_path if inherited_path else "" for var_name, value in env.items(): if var_name == "PATH": continue hack_env += ' && %s=%s' % (var_name, value) # Needed to change to that dir inside the bash shell if cwd and not os.path.isabs(cwd): cwd = os.path.join(get_cwd(), cwd) curdir = unix_path(cwd or get_cwd(), path_flavor=subsystem) to_run = 'cd "%s"%s && %s ' % (curdir, hack_env, bashcmd) bash_path = os_info.bash_path() bash_path = '"%s"' % bash_path if " " in bash_path else bash_path wincmd = '%s --login -c %s' % (bash_path, escape_windows_cmd(to_run)) conanfile.output.info('run_in_windows_bash: %s' % wincmd) # https://github.com/conan-io/conan/issues/2839 (subprocess=True) return conanfile._runner(wincmd, output=conanfile.output, subprocess=True)
def run_in_windows_bash(conanfile, bashcmd, cwd=None, subsystem=None, msys_mingw=True): """ Will run a unix command inside a bash terminal It requires to have MSYS2, CYGWIN, or WSL """ if platform.system() != "Windows": raise ConanException("Command only for Windows operating system") subsystem = subsystem or os_info.detect_windows_subsystem() if not subsystem: raise ConanException("Cannot recognize the Windows subsystem, install MSYS2/cygwin or specify a build_require " "to apply it.") if subsystem == MSYS2 and msys_mingw: # This needs to be set so that msys2 bash profile will set up the environment correctly. env_vars = {"MSYSTEM": "MINGW32" if conanfile.settings.get_safe("arch") == "x86" else "MINGW64", "MSYS2_PATH_TYPE": "inherit"} else: env_vars = {} with environment_append(env_vars): hack_path = "" if subsystem != WSL: # In the bash.exe from WSL this trick do not work, always the /usr/bin etc at first place inherited_path = conanfile.env.get("PATH", None) if isinstance(inherited_path, list): paths = [unix_path(path, path_flavor=subsystem) for path in inherited_path] inherited_path = ":".join(paths) else: inherited_path = unix_path(inherited_path, path_flavor=subsystem) # Put the build_requires and requires path at the first place inside the shell hack_path = ' && PATH="%s:$PATH"' % inherited_path if inherited_path else "" # Needed to change to that dir inside the bash shell if cwd and not os.path.isabs(cwd): cwd = os.path.join(os.getcwd(), cwd) curdir = unix_path(cwd or os.getcwd(), path_flavor=subsystem) to_run = 'cd "%s"%s && %s ' % (curdir, hack_path, bashcmd) wincmd = '%s --login -c %s' % (os_info.bash_path(), escape_windows_cmd(to_run)) conanfile.output.info('run_in_windows_bash: %s' % wincmd) return conanfile.run(wincmd, win_bash=False)