diff --git a/libmamba/CMakeLists.txt b/libmamba/CMakeLists.txt index 8880fecdff..72fd8cc913 100644 --- a/libmamba/CMakeLists.txt +++ b/libmamba/CMakeLists.txt @@ -12,6 +12,7 @@ project(libmamba) set(LIBMAMBA_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/include) set(LIBMAMBA_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src) +set(LIBMAMBA_DATA_DIR ${CMAKE_CURRENT_SOURCE_DIR}/data) # Versionning # =========== @@ -70,6 +71,30 @@ endif () # Source files # ============ +set(SHELL_SCRIPTS + micromamba.sh + micromamba.bat + activate.bat + _mamba_activate.bat + mamba_hook.bat + mamba_hook.ps1 + Mamba.psm1 + mamba.xsh + mamba.fish + compile_pyc.py + mamba_completion.posix) + +foreach(script ${SHELL_SCRIPTS}) + string(REPLACE "." "_" script_var ${script}) + add_custom_command(OUTPUT shell_scripts/${script}.cpp + DEPENDS data/${script} + COMMAND python3 ${LIBMAMBA_DATA_DIR}/bin2header.py + --extern + -v data_${script_var} + -i ${CMAKE_CURRENT_SOURCE_DIR}/data/${script} + -o ${CMAKE_CURRENT_BINARY_DIR}/shell_scripts/${script}.cpp) +endforeach() + set(LIBMAMBA_SOURCES ${LIBMAMBA_SOURCE_DIR}/version.cpp # Core API (low-level) @@ -122,6 +147,9 @@ set(LIBMAMBA_SOURCES ${LIBMAMBA_SOURCE_DIR}/api/shell.cpp ${LIBMAMBA_SOURCE_DIR}/api/update.cpp ) +foreach(script ${SHELL_SCRIPTS}) + list(APPEND LIBMAMBA_SOURCES shell_scripts/${script}.cpp) +endforeach() set(LIBMAMBA_HEADERS ${LIBMAMBA_INCLUDE_DIR}/mamba/version.hpp diff --git a/libmamba/data/Mamba.psm1 b/libmamba/data/Mamba.psm1 index e2f881dc39..08b9bdcc65 100644 --- a/libmamba/data/Mamba.psm1 +++ b/libmamba/data/Mamba.psm1 @@ -1,4 +1,3 @@ -R"MAMBARAW( ## ENVIRONMENT MANAGEMENT ###################################################### <# @@ -287,4 +286,3 @@ Export-ModuleMember ` # We don't export TabExpansion as it's currently not implemented for Micromamba # TabExpansion -)MAMBARAW" diff --git a/libmamba/data/_mamba_activate.bat b/libmamba/data/_mamba_activate.bat index f4ed29e5f9..9890946f1e 100644 --- a/libmamba/data/_mamba_activate.bat +++ b/libmamba/data/_mamba_activate.bat @@ -1,4 +1,3 @@ -R"MAMBARAW( @REM Copyright (C) 2012 Anaconda, Inc @REM SPDX-License-Identifier: BSD-3-Clause @REM Helper routine for activation, deactivation, and reactivation. @@ -51,4 +50,3 @@ R"MAMBARAW( @IF "%CONDA_TEST_SAVE_TEMPS%x"=="x" @DEL /F /Q "%_TEMP_SCRIPT_PATH%" @SET _TEMP_SCRIPT_PATH= @SET "PROMPT=%CONDA_PROMPT_MODIFIER%%PROMPT%" -)MAMBARAW" diff --git a/libmamba/data/activate.bat b/libmamba/data/activate.bat index 3d6778452c..0ac0e4def3 100644 --- a/libmamba/data/activate.bat +++ b/libmamba/data/activate.bat @@ -1,6 +1,4 @@ -R"MAMBARAW( @REM Copyright (C) 2021 QuantStack @REM SPDX-License-Identifier: BSD-3-Clause @CALL "%~dp0..\condabin\mamba_hook.bat" micromamba activate %* -)MAMBARAW" diff --git a/libmamba/data/bin2header.py b/libmamba/data/bin2header.py index 6a7b9ff61a..f843146b6e 100644 --- a/libmamba/data/bin2header.py +++ b/libmamba/data/bin2header.py @@ -25,65 +25,44 @@ import argparse import sys +from pathlib import Path -comment = """ -/* -This is a conda-specific repackaged launcher.c from Python setuptools. -The original source code for launcher.c can be found here: - https://raw.githubusercontent.com/python/cpython/3.7/PC/launcher.c - -The source code for the conda.exe launcher can be found here: - - https://github.com/conda/conda-build/tree/master/conda_build/launcher_sources - -In conda-build / launcher_sources -*/ -""" - - -def bin2header(data, var_name="var"): - out = [] - out.append(comment) - out.append("\n") - out.append("char {var_name}[] = {{".format(var_name=var_name)) - elems = [data[i : i + 12] for i in range(0, len(data), 12)] - for i, x in enumerate(elems): - line = ", ".join(["0x{val:02x}".format(val=c) for c in x]) - out.append( - " {line}{end_comma}".format( - line=line, end_comma="," if i < len(elems) - 1 else "" - ) - ) - out.append("};") - out.append( - "std::size_t {var_name}_len = {data_len};".format( - var_name=var_name, data_len=len(data) - ) - ) - return "\n".join(out) +def bin2header(comment, data, var_name, extern=False): + yield comment + yield "#include " + if extern: + yield f"extern const char {var_name}[];" + yield f"extern const std::size_t {var_name}_len;" + yield f"const char {var_name}[] = {{" + indent = " " + for i in range(0, len(data), 12): + hex_chunk = ", ".join(f"0x{x:02x}" for x in data[i:][:12]) + yield indent + hex_chunk + "," + yield indent + "0x00 // Terminating null byte" + yield "};" + yield f"const std::size_t {var_name}_len = {len(data)};" def main(): parser = argparse.ArgumentParser(description="Generate binary header output") - parser.add_argument("-i", "--input", required=True, help="Input file") - parser.add_argument("-o", "--out", required=True, help="Output file") + parser.add_argument("-i", "--input", required=True, help="Input file", type=Path) + parser.add_argument("-o", "--out", required=True, help="Output file", type=Path) parser.add_argument( "-v", "--var", required=True, help="Variable name to use in file" ) - + parser.add_argument( + "-e", "--extern", action="store_true", help="Add 'extern' declaration" + ) args = parser.parse_args() - if not args: - return 1 - with open(args.input, "rb") as f: - data = f.read() - - out = bin2header(data, args.var) - with open(args.out, "w") as f: - f.write(out) + argv_pretty = " ".join( + Path(arg).name if "/" in arg or "\\" in arg else arg for arg in sys.argv + ) + comment = f"/* This file was generated using {argv_pretty} */" - return 0 + out = bin2header(comment, args.input.read_bytes(), args.var, args.extern) + args.out.write_text("\n".join(out)) if __name__ == "__main__": diff --git a/libmamba/data/compile_pyc.py.hpp b/libmamba/data/compile_pyc.py similarity index 96% rename from libmamba/data/compile_pyc.py.hpp rename to libmamba/data/compile_pyc.py index e7cf9f5420..4d7581f4f3 100644 --- a/libmamba/data/compile_pyc.py.hpp +++ b/libmamba/data/compile_pyc.py @@ -1,8 +1,8 @@ -R"MAMBARAW( -from compileall import compile_file -from concurrent.futures import ProcessPoolExecutor import os import sys +from compileall import compile_file +from concurrent.futures import ProcessPoolExecutor + def main(): max_workers = int(os.environ.get("MAMBA_EXTRACT_THREADS", "0")) @@ -20,8 +20,7 @@ def main(): success = all(r.result() for r in results) return success + if __name__ == "__main__": success = main() sys.exit(int(not success)) - -)MAMBARAW" diff --git a/libmamba/data/mamba.fish b/libmamba/data/mamba.fish index 2b33006bc0..baa3fba6b6 100644 --- a/libmamba/data/mamba.fish +++ b/libmamba/data/mamba.fish @@ -1,5 +1,3 @@ -R"MAMBARAW( - if not set -q MAMBA_SHLVL set -gx MAMBA_SHLVL "0" set -gx PATH $MAMBA_ROOT_PREFIX/condabin $PATH @@ -169,5 +167,3 @@ complete -x -c micromamba -n '__fish_mamba_using_command remove' -a '(__fish_mam complete -x -c micromamba -n '__fish_mamba_using_command uninstall' -a '(__fish_mamba_packages)' complete -x -c micromamba -n '__fish_mamba_using_command upgrade' -a '(__fish_mamba_packages)' complete -x -c micromamba -n '__fish_mamba_using_command update' -a '(__fish_mamba_packages)' - -)MAMBARAW" diff --git a/libmamba/data/mamba.xsh b/libmamba/data/mamba.xsh index b5bc649650..c7bcbd2750 100644 --- a/libmamba/data/mamba.xsh +++ b/libmamba/data/mamba.xsh @@ -1,4 +1,3 @@ -R"MAMBARAW( # Copyright (C) 2012 Anaconda, Inc # SPDX-License-Identifier: BSD-3-Clause # Much of this forked from https://github.com/gforsyth/xonda @@ -111,5 +110,3 @@ def _mamba_completer(prefix, line, start, end, ctx): __xonsh__.completers['mamba'] = _mamba_completer # bump to top of list __xonsh__.completers.move_to_end('mamba', last=False) - -)MAMBARAW" diff --git a/libmamba/data/mamba_completion.posix b/libmamba/data/mamba_completion.posix index 9a09d1e015..8807040d67 100644 --- a/libmamba/data/mamba_completion.posix +++ b/libmamba/data/mamba_completion.posix @@ -1,4 +1,3 @@ -R"MAMBARAW( if [ -n "${ZSH_VERSION:+x}" ]; then autoload -U +X compinit && compinit autoload -U +X bashcompinit && bashcompinit @@ -17,4 +16,3 @@ if [ -n "${BASH_VERSION:+x}" ]; then } complete -o default -F _umamba_bash_completions micromamba fi -)MAMBARAW" diff --git a/libmamba/data/mamba_hook.bat b/libmamba/data/mamba_hook.bat index 76cf3ae805..defd8c9ece 100644 --- a/libmamba/data/mamba_hook.bat +++ b/libmamba/data/mamba_hook.bat @@ -1,4 +1,3 @@ -R"MAMBARAW( @REM Copyright (C) 2021 QuantStack @REM SPDX-License-Identifier: BSD-3-Clause @REM This file is derived from conda_hook.bat @@ -17,4 +16,3 @@ __MAMBA_INSERT_MAMBA_EXE__ @DOSKEY micromamba="%MAMBA_BAT%" $* @SET CONDA_SHLVL=0 -)MAMBARAW" diff --git a/libmamba/data/mamba_hook.ps1 b/libmamba/data/mamba_hook.ps1 index 55ab7d1d21..e78b4269e7 100644 --- a/libmamba/data/mamba_hook.ps1 +++ b/libmamba/data/mamba_hook.ps1 @@ -1,3 +1 @@ -R"MAMBARAW( Import-Module "$Env:MAMBA_ROOT_PREFIX\condabin\Mamba.psm1" -)MAMBARAW" diff --git a/libmamba/data/micromamba.bat b/libmamba/data/micromamba.bat index 22cd0662ee..d3b4cd9783 100644 --- a/libmamba/data/micromamba.bat +++ b/libmamba/data/micromamba.bat @@ -1,4 +1,3 @@ -R"MAMBARAW( @REM Copyright (C) 2012 Anaconda, Inc @REM SPDX-License-Identifier: BSD-3-Clause @@ -29,4 +28,3 @@ __MAMBA_INSERT_ROOT_PREFIX__ @IF [%1]==[uninstall] "%~dp0_mamba_activate" reactivate @EXIT /B %errorlevel% -)MAMBARAW" diff --git a/libmamba/data/micromamba.sh b/libmamba/data/micromamba.sh index 3be3c86b54..4d010bf54a 100644 --- a/libmamba/data/micromamba.sh +++ b/libmamba/data/micromamba.sh @@ -1,4 +1,3 @@ -R"MAMBARAW( # Copyright (C) 2012 Anaconda, Inc # SPDX-License-Identifier: BSD-3-Clause @@ -111,4 +110,3 @@ if [ -z "${CONDA_SHLVL+x}" ]; then PS1= fi fi -)MAMBARAW" diff --git a/libmamba/include/mamba/core/shell_init.hpp b/libmamba/include/mamba/core/shell_init.hpp index 293e394dd4..3458fcb5c9 100644 --- a/libmamba/include/mamba/core/shell_init.hpp +++ b/libmamba/include/mamba/core/shell_init.hpp @@ -11,6 +11,17 @@ #include "mamba_fs.hpp" +extern const char data_micromamba_sh[]; +extern const char data_micromamba_bat[]; +extern const char data_activate_bat[]; +extern const char data__mamba_activate_bat[]; +extern const char data_mamba_hook_bat[]; +extern const char data_mamba_hook_ps1[]; +extern const char data_Mamba_psm1[]; +extern const char data_mamba_xsh[]; +extern const char data_mamba_fish[]; +extern const char data_mamba_completion_posix[]; + namespace mamba { std::string guess_shell(); diff --git a/libmamba/src/core/activation.cpp b/libmamba/src/core/activation.cpp index 4cfbf79be8..10b35acb90 100644 --- a/libmamba/src/core/activation.cpp +++ b/libmamba/src/core/activation.cpp @@ -18,11 +18,7 @@ namespace mamba fs::path PREFIX_STATE_FILE = fs::path("conda-meta") / "state"; fs::path PACKAGE_ENV_VARS_DIR = fs::path("etc") / "conda" / "env_vars.d"; std::string CONDA_ENV_VARS_UNSET_VAR = "***unset***"; // NOLINT(runtime/string) - - constexpr const char mamba_posix_completion[] = -#include "../data/mamba_completion.posix" - ; - } // namespace + } // namespace /**************************** * Activator implementation * @@ -705,7 +701,7 @@ namespace mamba { if (shell() == "posix") { - builder << mamba_posix_completion; + builder << data_mamba_completion_posix; } } if (Context::instance().auto_activate_base) diff --git a/libmamba/src/core/shell_init.cpp b/libmamba/src/core/shell_init.cpp index 6d73d28461..7c3a9f0de0 100644 --- a/libmamba/src/core/shell_init.cpp +++ b/libmamba/src/core/shell_init.cpp @@ -28,35 +28,6 @@ namespace mamba { namespace { - // Here we are embedding the shell scripts - constexpr const char micromamba_sh[] = -#include "../data/micromamba.sh" - ; - constexpr const char mamba_bat[] = -#include "../data/micromamba.bat" - ; - constexpr const char activate_bat[] = -#include "../data/activate.bat" - ; - constexpr const char _mamba_activate_bat[] = -#include "../data/_mamba_activate.bat" - ; - constexpr const char mamba_hook_bat[] = -#include "../data/mamba_hook.bat" - ; - constexpr const char mamba_hook_ps1[] = -#include "../data/mamba_hook.ps1" - ; - constexpr const char mamba_psm1[] = -#include "../data/Mamba.psm1" - ; - constexpr const char mamba_xsh[] = -#include "../data/mamba.xsh" - ; - constexpr const char mamba_fish[] = -#include "../data/mamba.fish" - ; - std::regex CONDA_INITIALIZE_RE_BLOCK("# >>> mamba initialize >>>(?:\n|\r\n)?" "([\\s\\S]*?)" "# <<< mamba initialize <<<(?:\n|\r\n)?"); @@ -376,13 +347,13 @@ namespace mamba if (shell == "zsh" || shell == "bash" || shell == "posix") { - std::string contents = micromamba_sh; + std::string contents = data_micromamba_sh; replace_all(contents, "$MAMBA_EXE", exe.string()); return contents; } else if (shell == "xonsh") { - std::string contents = mamba_xsh; + std::string contents = data_mamba_xsh; replace_all(contents, "$MAMBA_EXE", exe.string()); return contents; } @@ -390,7 +361,7 @@ namespace mamba { std::stringstream contents; contents << "$Env:MAMBA_EXE='" << exe.native() << "'\n"; - std::string psm1 = mamba_psm1; + std::string psm1 = data_Mamba_psm1; psm1 = psm1.substr(0, psm1.find("## EXPORTS ##")); contents << psm1; return contents.str(); @@ -406,7 +377,7 @@ namespace mamba } else if (shell == "fish") { - std::string contents = mamba_fish; + std::string contents = data_mamba_fish; replace_all(contents, "$MAMBA_EXE", exe.string()); return contents; } @@ -428,7 +399,7 @@ namespace mamba } std::ofstream mamba_bat_f = open_ofstream(root_prefix / "condabin" / "micromamba.bat"); - std::string mamba_bat_contents(mamba_bat); + std::string mamba_bat_contents(data_micromamba_bat); replace_all(mamba_bat_contents, std::string("__MAMBA_INSERT_ROOT_PREFIX__"), std::string("@SET \"MAMBA_ROOT_PREFIX=" + root_prefix.string() + "\"")); @@ -439,10 +410,10 @@ namespace mamba mamba_bat_f << mamba_bat_contents; std::ofstream _mamba_activate_bat_f = open_ofstream(root_prefix / "condabin" / "_mamba_activate.bat"); - _mamba_activate_bat_f << _mamba_activate_bat; + _mamba_activate_bat_f << data__mamba_activate_bat; - std::string activate_bat_contents(activate_bat); + std::string activate_bat_contents(data_activate_bat); replace_all(activate_bat_contents, std::string("__MAMBA_INSERT_ROOT_PREFIX__"), std::string("@SET \"MAMBA_ROOT_PREFIX=" + root_prefix.string() + "\"")); @@ -459,7 +430,7 @@ namespace mamba = open_ofstream(root_prefix / "Scripts" / "activate.bat"); scripts_activate_bat_f << activate_bat_contents; - std::string hook_content = mamba_hook_bat; + std::string hook_content = data_mamba_hook_bat; replace_all(hook_content, std::string("__MAMBA_INSERT_MAMBA_EXE__"), std::string("@SET \"MAMBA_EXE=" + exe.string() + "\"")); @@ -485,7 +456,7 @@ namespace mamba // Maybe the prefix isn't writable. No big deal, just keep going. } std::ofstream sh_file = open_ofstream(sh_source_path); - sh_file << micromamba_sh; + sh_file << data_micromamba_sh; } if (shell == "xonsh") { @@ -500,7 +471,7 @@ namespace mamba // Maybe the prefix isn't writable. No big deal, just keep going. } std::ofstream sh_file = open_ofstream(sh_source_path); - sh_file << mamba_xsh; + sh_file << data_mamba_xsh; } else if (shell == "cmd.exe") { @@ -517,9 +488,9 @@ namespace mamba // Maybe the prefix isn't writable. No big deal, just keep going. } std::ofstream mamba_hook_f = open_ofstream(root_prefix / "condabin" / "mamba_hook.ps1"); - mamba_hook_f << mamba_hook_ps1; + mamba_hook_f << data_mamba_hook_ps1; std::ofstream mamba_psm1_f = open_ofstream(root_prefix / "condabin" / "Mamba.psm1"); - mamba_psm1_f << mamba_psm1; + mamba_psm1_f << data_Mamba_psm1; } } diff --git a/libmamba/src/core/transaction_context.cpp b/libmamba/src/core/transaction_context.cpp index 5e49015d8e..b0269da93e 100644 --- a/libmamba/src/core/transaction_context.cpp +++ b/libmamba/src/core/transaction_context.cpp @@ -14,14 +14,13 @@ #include "mamba/core/output.hpp" #include "mamba/core/util.hpp" +extern const char data_compile_pyc_py[]; + namespace mamba { void compile_python_sources(std::ostream& out) { - constexpr const char script[] = -#include "../data/compile_pyc.py.hpp" - ; - out << script; + out << data_compile_pyc_py; } std::string compute_short_python_version(const std::string& long_version)