devenver: Add linux installation

This commit is contained in:
Doyle 2023-02-08 16:53:32 +11:00
parent 844cb7e363
commit 05e7fdddf1
4 changed files with 144 additions and 134 deletions

View File

@ -464,13 +464,13 @@ def get_manifest(is_windows):
executables = [
{
"path": f"bin/clang++",
"checksum": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"checksum": "388be41dc565a891ced9e78da2e89a249ca9b9a26f71a3c912e8ba89585be89c",
"symlink": [f"clang++-{version}"],
"add_to_devenv_path": True,
},
{
"path": f"bin/clang.exe",
"checksum": "none",
"path": f"bin/clang",
"checksum": "388be41dc565a891ced9e78da2e89a249ca9b9a26f71a3c912e8ba89585be89c",
"symlink": [f"clang-{version}"],
"add_to_devenv_path": True,
}
@ -505,17 +505,17 @@ def get_manifest(is_windows):
else:
version = "14.0.0" # Only version with linux downloads
download_url = f"https://github.com/llvm/llvm-project/releases/download/llvmorg-{version}/clang+llvm-{version}-x86_64-linux-gnu-ubuntu-18.04.tar.xz"
download_checksum = "none"
download_checksum = "61582215dafafb7b576ea30cc136be92c877ba1f1c31ddbbd372d6d65622fef5"
executables = [
{
"path": f"bin/clang++",
"checksum": "none",
"checksum": "3557c2deadae7e2bc3bffce4afd93ddab6ef50090971c8ce3bf15c80b27134a0",
"symlink": [f"clang++-{version}"],
"add_to_devenv_path": False,
},
{
"path": f"bin/clang.exe",
"checksum": "none",
"path": f"bin/clang",
"checksum": "3557c2deadae7e2bc3bffce4afd93ddab6ef50090971c8ce3bf15c80b27134a0",
"symlink": [f"clang-{version}"],
"add_to_devenv_path": False,
}
@ -548,18 +548,18 @@ def get_manifest(is_windows):
}
]
else:
download_checksum = "none"
download_checksum = "84a54c69781ad90615d1b0276a83ff87daaeded99fbc64457c350679df7b4ff0"
download_url = f"https://github.com/llvm/llvm-project/releases/download/llvmorg-{version}/clang+llvm-{version}-x86_64-linux-gnu-ubuntu-18.04.tar.xz"
executables = [
{
"path": f"bin/clang++",
"checksum": "none",
"checksum": "ae47e6cc9f6d95f7a39e4800e511b7bdc3f55464ca79e45cd63cbd8a862a82a1",
"symlink": [f"clang++-{version}"],
"add_to_devenv_path": False,
},
{
"path": f"bin/clang.exe",
"checksum": "none",
"path": f"bin/clang",
"checksum": "ae47e6cc9f6d95f7a39e4800e511b7bdc3f55464ca79e45cd63cbd8a862a82a1",
"symlink": [f"clang-{version}"],
"add_to_devenv_path": False,
}
@ -585,25 +585,25 @@ def get_manifest(is_windows):
"add_to_devenv_path": False,
},
{
"path": f"bin/clang.exe",
"path": f"bin/clang",
"checksum": "9f0748de7f946c210a030452de226986bab46a0121d7236ea0e7b5079cb6dfef",
"symlink": [f"clang-{version}.exe"],
"symlink": [f"clang-{version}"],
"add_to_devenv_path": False,
}
]
else:
download_checksum = "none"
download_url = f"https://github.com/llvm/llvm-project/releases/download/llvmorg-{version}/clang+llvm-{version}-x86_64-linux-gnu-ubuntu-18.04.tar.xz"
download_checksum = "6b3cc55d3ef413be79785c4dc02828ab3bd6b887872b143e3091692fc6acefe7"
download_url = f"https://github.com/llvm/llvm-project/releases/download/llvmorg-{version}/clang+llvm-{version}-x86_64-linux-gnu-ubuntu-16.04.tar.xz"
executables = [
{
"path": f"bin/clang++",
"checksum": "none",
"checksum": "329bba976c0cef38863129233a4b0939688eae971c7a606d41dd0e5a53d53455",
"symlink": [f"clang++-{version}"],
"add_to_devenv_path": False,
},
{
"path": f"bin/clang.exe",
"checksum": "none",
"path": f"bin/clang",
"checksum": "329bba976c0cef38863129233a4b0939688eae971c7a606d41dd0e5a53d53455",
"symlink": [f"clang-{version}"],
"add_to_devenv_path": False,
}
@ -636,18 +636,18 @@ def get_manifest(is_windows):
}
]
else:
download_checksum = "none"
download_url = f"https://github.com/llvm/llvm-project/releases/download/llvmorg-{version}/clang+llvm-{version}-x86_64-linux-gnu-ubuntu-18.04.tar.xz"
download_checksum = "c691a558967fb7709fb81e0ed80d1f775f4502810236aa968b4406526b43bee1"
download_url = f"https://github.com/llvm/llvm-project/releases/download/llvmorg-{version}/clang+llvm-{version}-x86_64-linux-gnu-ubuntu-16.04.tar.xz"
executables = [
{
"path": f"bin/clang++",
"checksum": "none",
"checksum": "656bfde194276cee81dc8a7a08858313c5b5bdcfa18ac6cd6116297af2f65148",
"symlink": [f"clang++-{version}"],
"add_to_devenv_path": False,
},
{
"path": f"bin/clang.exe",
"checksum": "none",
"path": f"bin/clang",
"checksum": "656bfde194276cee81dc8a7a08858313c5b5bdcfa18ac6cd6116297af2f65148",
"symlink": [f"clang-{version}"],
"add_to_devenv_path": False,
}
@ -676,8 +676,8 @@ def get_manifest(is_windows):
exe_path = "ninja.exe"
else:
download_url = f"https://github.com/ninja-build/ninja/releases/download/v{version}/ninja-linux.zip"
download_checksum = "none"
checksum = "none"
download_checksum = "b901ba96e486dce377f9a070ed4ef3f79deb45f4ffe2938f8e7ddc69cfb3df77"
checksum = "ac35c7992e95c5f2cadb44097d9988bcc71e5e39d9908ec312eb46872844f2e8"
exe_path = "ninja"
result.append({
@ -717,9 +717,9 @@ def get_manifest(is_windows):
symlink = [f"node-{version}.exe"]
else:
download_url = f"https://nodejs.org/dist/v{version}/node-v{version}-linux-x64.tar.xz"
download_checksum = "none"
checksum = "none"
exe_path = "node"
download_checksum = "c88b52497ab38a3ddf526e5b46a41270320409109c3f74171b241132984fd08f"
checksum = "45afcfc9a45df626e8aa2b883753d1cf7f222ad9243f3003d1aa372696120df6"
exe_path = "bin/node"
symlink = [f"node-{version}"]
result.append({
@ -764,10 +764,12 @@ def get_manifest(is_windows):
]
else:
download_url = f"https://github.com/indygreg/python-build-standalone/releases/download/{date}/cpython-{version}-x86_64_v2-unknown-linux-gnu-pgo+lto-full.tar.zst"
download_checksum = "none"
download_checksum = "49f4a8c02efff2debbb258973b1f6efbd568e4be2e5dca07c7dcd754a7bff9cf"
checksum = "none"
exe_path = "bin/python"
# TODO: Get ZST somehow on linux
if is_windows:
result.append({
"label": label,
"manifests": [
@ -803,8 +805,8 @@ def get_manifest(is_windows):
exe_path = "qrenderdoc.exe"
else:
download_url = f"https://renderdoc.org/stable/{version}/renderdoc_{version}.tar.gz"
download_checksum = "none"
checksum = "none"
download_checksum = "fbdf67131ade655a7e635aa34e8b6fcd1aac9d88ebbe7d3da39fb075e05b1f41"
checksum = "00508f6532f73a38873b92777fa8b7fb317c0b5f411fb50d2722823027993252"
exe_path = "bin/qrenderdoc"
result.append({
@ -867,9 +869,9 @@ def get_manifest(is_windows):
exe_path = "zig.exe"
symlink = [f"zig-{version}.exe"]
else:
download_url = f"https://ziglang.org/download/{version}/zig-linux-x86_64-{version}.zip"
download_checksum = "none"
checksum = "none"
download_url = f"https://ziglang.org/download/{version}/zig-linux-x86_64-{version}.tar.xz"
download_checksum = "6699f0e7293081b42428f32c9d9c983854094bd15fee5489f12c4cf4518cc380"
checksum = "b298cd869e11709b9c7a1313315b5ea2a9d8a0718f555c6990ee209d7c533442"
exe_path = "zig"
symlink = [f"zig-{version}"]
@ -983,8 +985,8 @@ def get_manifest(is_windows):
symlink = [f"fzf.exe"]
else:
download_url = f"https://github.com/junegunn/fzf/releases/download/{version}/fzf-{version}-linux_amd64.tar.gz"
download_checksum = "none"
checksum = "none"
download_checksum = "ffa3220089f2ed6ddbef2d54795e49f46467acfadd4ad0d22c5f07c52dc0d4ab"
checksum = "6475c41e56d949da753782fef56017657b77846f23e71fca88378e3f55c1d6d0"
exe_path = "fzf"
symlink = [f"fzf"]
@ -1073,7 +1075,7 @@ def get_manifest(is_windows):
exe_path = "nvim.appimage"
download_url = f"https://github.com/neovim/neovim/releases/download/v{version}/{exe_path}"
download_checksum = "bb0d4599cb506fc6e29bf0e9cef3b52e06dcb4bb930b56d6eb88320f1d46a908"
checksum = "none"
checksum = download_checksum
result.append({
"label": "NVim",
@ -1110,8 +1112,8 @@ def get_manifest(is_windows):
exe_path = "neovide.exe"
else:
download_url = f"https://github.com/neovide/neovide/releases/download/{version}/neovide.tar.gz"
download_checksum = "fc0593a0f55e99fa8398e8137ac89632ea7fc97a90cbd32d8c2a69afc1eff6f"
checksum = "none"
download_checksum = "0fc0593a0f55e99fa8398e8137ac89632ea7fc97a90cbd32d8c2a69afc1eff6f"
checksum = "73c8dc6cb9840f568663d532d12ae54109af690866a51011cc1f874e2ae308e2"
exe_path = "neovide"
result.append({
@ -1148,10 +1150,10 @@ def get_manifest(is_windows):
checksum = "ddd448c0d8fe71295bbcc5b52c9e9f4b06956a79572b7d634436a49728f5f341"
exe_path = "imhex.exe"
else:
download_url = f"https://github.com/WerWolv/ImHex/releases/download/v{version}/imhex-{version}.AppImage"
download_checksum = "none"
checksum = "none"
exe_path = "imhex-{version}.AppImage"
exe_path = f"imhex-{version}.AppImage"
download_url = f"https://github.com/WerWolv/ImHex/releases/download/v{version}/{exe_path}"
download_checksum = "229d7f2f36dca0d4aa2eeb4f637114ffa94db7d67db74b34ed7eda34d72e4bed"
checksum = download_checksum
result.append({
"label": "ImHex",
@ -1237,7 +1239,7 @@ def get_manifest(is_windows):
else:
download_url = f"https://github.com/BurntSushi/ripgrep/releases/download/{version}/ripgrep-{version}-x86_64-unknown-linux-musl.tar.gz"
download_checksum = "ee4e0751ab108b6da4f47c52da187d5177dc371f0f512a7caaec5434e711c091"
checksum = "none"
checksum = "4ef156371199b3ddac1bf584e0e52b1828279af82e4ea864b4d9c816adb5db40"
exe_path = "rg"
result.append({
@ -1275,9 +1277,9 @@ def get_manifest(is_windows):
exe_path = "sioyek.exe"
else:
download_url = f"https://github.com/ahrm/sioyek/releases/download/v{version}/sioyek-release-linux-portable.zip"
download_checksum = "none"
checksum = "none"
exe_path = "sioyek"
download_checksum = "3f90659c1f29705de680b3607ae247582eab8860015c208d364a0f3fc15d3222"
checksum = "7abc12e8fe71b0285e067866bcea2ea0e025e37291f6bce450675a567172e44f"
exe_path = "Sioyek-x86_64.AppImage"
result.append({
"label": "Sioyek",
@ -1318,9 +1320,9 @@ def get_manifest(is_windows):
"set FZF_DEFAULT_COMMAND=fd --type f --strip-cwd-prefix --hidden --follow --exclude .git --exclude .cache --exclude .vs",
]
else:
download_url = f"https://github.com/sharkdp/fd/releases/download/v{version}/fd-v{version}-x86_64-pc-unknown-linux-musl.tar.gz"
download_checksum = "none"
checksum = "none"
download_url = f"https://github.com/sharkdp/fd/releases/download/v{version}/fd-v{version}-x86_64-unknown-linux-musl.tar.gz"
download_checksum = "9fdb370648fb8256fc9a36355c652546bd4c62925babcad80f95f90f74fc81e7"
checksum = "702eb951e6b37be64cca66da976e0fcb0be587121034c1d6f841ce7fad3bd8e3"
exe_path = "fd"
add_to_devenv_script = [
"FZF_DEFAULT_OPTS=--multi --layout=reverse",
@ -1434,7 +1436,7 @@ def get_manifest(is_windows):
checksum = "12d62abb9ad4db43c2b9b1398acae66857eb6e64205364631a3d3bda0ff17e2e"
exe_path = "ripcord.exe"
else:
exe_path = "Ripcord-{version}-x86_64.AppImage"
exe_path = f"Ripcord-{version}-x86_64.AppImage"
download_url = f"https://cancel.fm/dl/{exe_path}"
download_checksum = "e320cb3c4043b0f296b4bc1da664b29776f95c2c0b02bdbf115b4d46b1669899"
checksum = download_checksum
@ -1498,7 +1500,7 @@ def get_manifest(is_windows):
exe_path = "yt-dlp.exe"
else:
download_url = f"https://github.com/yt-dlp/yt-dlp/releases/download/{version}/yt-dlp_linux"
download_checksum = "none"
download_checksum = "3b2d1bd378e08570b0fb5bee000cd6968563c4f47527197a5c57463bae8cb2ac"
checksum = download_checksum
exe_path = "yt-dlp_linux"
@ -1538,7 +1540,7 @@ def get_manifest(is_windows):
else:
download_url = f"https://bitbucket.org/heldercorreia/speedcrunch/downloads/SpeedCrunch-{version}-linux64.tar.bz2"
download_checksum = "9347bef2068053ad15c5914ee147bf11a1ccb1d30cb18d63d0178380c327e8fc"
checksum = "none"
checksum = "06c7e7f68027f133dc7874f663873244b695c8a7d2aec9cde0e40b7a5b9a4db1"
exe_path = "speedcrunch"
result.append({
@ -1577,8 +1579,8 @@ def get_manifest(is_windows):
else:
exe_path = f"KeePassXC-{version}-x86_64.AppImage"
download_url = f"https://github.com/keepassxreboot/keepassxc/releases/download/{version}/{exe_path}"
download_checksum = "none"
checksum = "none"
download_checksum = "15fdc15f340e84e3b7a25a19bfb8c3b16f1e04685c07e5de1616b7cd6bcdded6"
checksum = download_checksum
result.append({
"label": "KeePassXC",

View File

@ -222,18 +222,19 @@ def download_and_install_archive(download_url,
# Install the archive by unpacking it
# ----------------------------------------------------------------------
archive_path = download_path
os.makedirs(exe_install_dir, exist_ok=True)
if unzip_method == UnzipMethod.DEFAULT:
if archive_path.suffix == '.exe' or archive_path.suffix == '.AppImage':
if archive_path.suffix == '.exe' or archive_path.suffix.lower() == '.appimage' or len(archive_path.suffix) == 0:
unzip_method = UnzipMethod.NO_UNZIP
if unzip_method == UnzipMethod.NO_UNZIP:
os.makedirs(exe_install_dir, exist_ok=True)
shutil.copy(archive_path, exe_install_dir)
elif unzip_method == UnzipMethod.SHUTILS:
lprint(f'- SHUtils unzip install {label} to: {exe_install_dir}', level=1)
shutil.unpack_archive(download_path, exe_install_dir)
elif unzip_method == UnzipMethod.ZIP7_BOOTSTRAP:
command = f'"{zip7_bootstrap_exe}" x -bd "{download_path}" -o"{exe_install_dir}"'
command = [str(zip7_bootstrap_exe), "x", "-bd", str(download_path), "-o", str(exe_install_dir)]
lprint(f'- 7z (bootstrap) unzip {label} to: {exe_install_dir}', level=1)
lprint(f' Command: {command}', level=1)
subprocess.run(command)
@ -252,37 +253,49 @@ def download_and_install_archive(download_url,
# We call this an intermediate zip file, we will extract that file
# with 7zip. After we're done, we will delete that _intermediate_
# file to cleanup our install directory.
if archive_path.suffix == '.zst' or archive_path.suffix == '.xz' or archive_path.suffix == '.gz':
unzip_command = [str(zip7_exe), "x", "-aoa", "-spe", "-bso0", str(archive_path), f"-o{exe_install_dir}"]
linux_used_tar = False
if archive_path.suffix == '.zst' or archive_path.suffix == '.xz' or archive_path.suffix == '.gz' or archive_path.suffix == '.bz2':
archive_without_suffix = pathlib.Path(str(archive_path)[:-len(archive_path.suffix)]).name
next_archive_path = pathlib.Path(exe_install_dir, archive_without_suffix)
if os.path.exists(next_archive_path) == False:
command = ""
if archive_path.suffix == '.zst':
command = f'"{zstd_exe}" --output-dir-flat "{exe_install_dir}" -d "{archive_path}"'
command = [str(zstd_exe), "--output-dir-flat", str(exe_install_dir), "-d", str(archive_path)]
lprint(f'- zstd unzip {label} to: {exe_install_dir}', level=1)
lprint(f' Command: {command}', level=1)
else:
command = f'"{zip7_exe}" x -aoa -spe -bso0 "{archive_path}" -o"{exe_install_dir}"'
command = command.replace('\\', '/')
lprint(f'- 7z unzip install {label} to: {exe_install_dir}', level=1)
lprint(f' Command: {command}', level=1)
if not is_windows:
linux_used_tar = True
unzip_command = ["tar", "xf", str(archive_path), "--directory", str(exe_install_dir)]
os.makedirs(exe_install_dir)
subprocess.run(command)
command = unzip_command
for item in command:
item = item.replace('\\', '/')
lprint(f'- Unzip nested install {label} to: {exe_install_dir}', level=1)
lprint(f' Command: {command}', level=1)
subprocess.run(args=command)
# Remove the extension from the file, we just extracted it
archive_path = next_archive_path
# If there's still a suffix after we removed the ".zst" we got
# an additional archive to unzip, e.g. "app.tar" remaining.
if not linux_used_tar:
intermediate_zip_file_extracted = len(archive_path.suffix) > 0
# \note On Linux using tar xf will unpack the archive entirely, e.g.
# unpack tar.gz both in one shot. So we do not need a further
# extract step.
if not linux_used_tar and len(archive_path.suffix) > 0:
unzip_command = [str(zip7_exe), "x", "-aoa", "-spe", "-bso0", str(archive_path), f"-o{exe_install_dir}"]
command = unzip_command
for item in command:
item = item.replace('\\', '/')
if len(archive_path.suffix) > 0:
command = f'"{zip7_exe}" x -aoa -spe -bso0 "{archive_path}" -o"{exe_install_dir}"'
command = command.replace('\\', '/')
lprint(f'- 7z unzip install {label} to: {exe_install_dir}', level=1)
lprint(f'- Unzip install {label} to: {exe_install_dir}', level=1)
lprint(f' Command: {command}', level=1)
subprocess.run(command)
@ -528,7 +541,7 @@ def install_app_list(app_list, download_dir, install_dir, is_windows):
unzip_method = UnzipMethod.ZIP7_BOOTSTRAP
zip7_exe = exe_path
else:
unzip_method = UnzipMethod.ZIP7_SHUTILS
unzip_method = UnzipMethod.SHUTILS
zip7_exe = exe_path
zip7_bootstrap_exe = exe_path
elif label == 'zstd':
@ -571,7 +584,7 @@ def install_app_list(app_list, download_dir, install_dir, is_windows):
for line in manifest['add_to_devenv_script']:
devenv_script_buffer += (line + '\n')
if app_list is internal_app_list:
if (is_windows or os.name == 'nt') and app_list is internal_app_list:
if len(str(zip7_exe)) == 0 or len(str(zip7_bootstrap_exe)) == 0 or len(str(zstd_exe)) == 0:
exit("Internal app list did not install 7zip bootstrap, 7zip or zstd, we are unable to install archives\n"
f" - zip7_bootstrap_exe: {zip7_bootstrap_exe}\n"
@ -655,11 +668,12 @@ def run(user_app_list,
download_checksum = "b055fee85472921575071464a97a79540e489c1c3a14b9bdfbdbab60e17f36e4"
checksum = "254cf6411d38903b2440819f7e0a847f0cfee7f8096cfad9e90fea62f42b0c23"
exe_path = "7z.exe"
else:
download_url = f"https://www.7-zip.org/a/7z{version}-linux-x64.tar.xz"
download_checksum = "none"
checksum = "none"
exe_path = "7z"
download_checksum = "2c266f6794adec310c4631232c1d039f46988d51082fe5e80349c52ee7ed60bb"
checksum = "0c771994a00ee96a0fc85902f66fbfd162c3090091e523bb828cdf4cd09a2e73"
exe_path = "7zz"
internal_app_list[-1]["manifests"].append({ # Download proper 7zip, extract this exe with the bootstrap 7zip
"download_checksum": download_checksum,
@ -689,11 +703,6 @@ def run(user_app_list,
download_checksum = "68897cd037ee5e44c6d36b4dbbd04f1cc4202f9037415a3251951b953a257a09"
checksum = "f14e78c0651851a670f508561d2c5d647da0ba08e6b73231f2e7539812bae311"
exe_path = "zstd.exe"
else:
download_url = f"https://github.com/facebook/zstd/releases/download/v{version}/zstd-{version}.tar.gz"
download_checksum = "none"
checksum = "none"
exe_path = "zstd"
internal_app_list.append({
"label": "zstd",
@ -704,7 +713,7 @@ def run(user_app_list,
"version": version,
"executables": [
{
"path": "zstd.exe",
"path": exe_path,
"symlink": [],
"add_to_devenv_path": True,
"checksum": checksum,
@ -763,7 +772,7 @@ def run(user_app_list,
# Write the devenv script with environment variables
devenv_script_buffer += "set PATH=%~dp0Symlinks;%PATH%\n"
devenv_script_name = f"{devenv_script_name}.bat" if is_windows else f"{devenv_script_name}dev_env.sh"
devenv_script_name = f"{devenv_script_name}.bat" if is_windows else f"{devenv_script_name}.sh"
devenv_script_path = pathlib.Path(install_dir, devenv_script_name)
lprint(f"Writing script to augment the environment with installed applications: {devenv_script_path}")
with open(devenv_script_path, 'w') as file:

View File

@ -9,8 +9,8 @@ import tempfile
import argparse
import urllib.request
import win_app_manifest_dev
import win_app_manifest_user
import app_manifest_dev
import app_manifest_user
def git_clone(install_dir, git_exe, url, commit_hash):
devenver.lprint(f"Git clone {url} to {install_dir}", level=0)
@ -78,7 +78,7 @@ if args.with_dev_apps:
# Run DEVenver, installing the portable apps
# --------------------------------------------------------------------------
dev_env_script_name = "dev_env"
app_list = win_app_manifest_dev.get_manifest(is_windows=is_windows)
app_list = app_manifest_dev.get_manifest(is_windows=is_windows)
installed_dev_apps = devenver.run(user_app_list=app_list,
download_dir=download_dir,
install_dir=install_dir,
@ -376,11 +376,11 @@ pause
""")
(install_dir / "user_env_update.bat").write_text(f"""@echo off
setlocal EnableDelayedExpansion
set PYTHONHOME=%~dp0{python_install_dir}
%~dp0{python_rel_exe_path} {win_setup_script_path} --with-user-apps
pause
""")
setlocal EnableDelayedExpansion
set PYTHONHOME=%~dp0{python_install_dir}
%~dp0{python_rel_exe_path} {win_setup_script_path} --with-user-apps
pause
""")
# Install left-overs
# --------------------------------------------------------------------------
@ -411,13 +411,12 @@ pause
urllib.request.urlretrieve("https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim",
nvim_plug_vim_path)
# Install user apps
# ------------------------------------------------------------------------------
if args.with_user_apps:
app_list = win_app_manifest_user.get_manifest(is_windows=is_windows)
app_list = app_manifest_user.get_manifest(is_windows=is_windows)
installed_user_apps = devenver.run(user_app_list=app_list,
download_dir=download_dir,
install_dir=install_dir,
devenv_script_name="user_env",
is_windows=True)
is_windows=is_windows)