168 lines
5.4 KiB
Bash
Executable file
168 lines
5.4 KiB
Bash
Executable file
#!/usr/bin/env nix-shell
|
|
#! nix-shell -p coreutils -p jq -p unzip -i bash
|
|
set -euo pipefail
|
|
|
|
#
|
|
# A little script to help maintaining this package. It will:
|
|
#
|
|
# - download the specified version of the extension to the store and print its url, packed store path and hash
|
|
# - unpack the extension, bring it to the store and print its store path and hash
|
|
# - fetch its runtimes dependencies from the 'package.json' file using the 'jq' utility, unpack those to the store
|
|
# and print its url store path and hash
|
|
# - patch elf of the binaries that got a nix replacement
|
|
# - bring the patched version to the store
|
|
# - run their '--version' and call 'ldd'
|
|
# - print the version of the runtime deps nix replacements.
|
|
#
|
|
# TODO: Print to a properly formated nix file all the required information to fetch everything (extension + runtime deps).
|
|
# TODO: Print x86 and maybe darwin runtime dependencies.
|
|
#
|
|
|
|
scriptDir=$(cd "`dirname "$0"`"; pwd)
|
|
echo "scriptDir='$scriptDir'"
|
|
|
|
extPublisher="vscode"
|
|
extName="cpptools"
|
|
defaultExtVersion="0.16.1"
|
|
extVersion="${1:-$defaultExtVersion}"
|
|
|
|
echo
|
|
echo "------------- Downloading extension ---------------"
|
|
|
|
extZipStoreName="${extPublisher}-${extName}.zip"
|
|
extUrl="https://ms-vscode.gallery.vsassets.io/_apis/public/gallery/publisher/ms-vscode/extension/cpptools/${extVersion}/assetbyname/Microsoft.VisualStudio.Services.VSIXPackage"
|
|
echo "extUrl='$extUrl'"
|
|
storePathWithSha=$(nix-prefetch-url --name "$extZipStoreName" --print-path "$extUrl" 2> /dev/null)
|
|
|
|
cpptoolsZipStorePath="$(echo "$storePathWithSha" | tail -n1)"
|
|
cpptoolsZipSha256="$(echo "$storePathWithSha" | head -n1)"
|
|
echo "cpptoolsZipStorePath='$cpptoolsZipStorePath'"
|
|
echo "cpptoolsZipSha256='$cpptoolsZipSha256'"
|
|
|
|
|
|
extStoreName="${extPublisher}-${extName}"
|
|
|
|
|
|
function rm_tmpdir() {
|
|
#echo "Removing \`tmpDir='$tmpDir'\`"
|
|
rm -rf -- "$tmpDir"
|
|
unset tmpDir
|
|
trap - INT TERM HUP EXIT
|
|
}
|
|
function make_trapped_tmpdir() {
|
|
tmpDir=$(mktemp -d)
|
|
trap rm_tmpdir INT TERM HUP EXIT
|
|
}
|
|
|
|
echo
|
|
echo "------------- Unpacked extension ---------------"
|
|
|
|
make_trapped_tmpdir
|
|
unzip -q -d "$tmpDir" "$cpptoolsZipStorePath"
|
|
|
|
cpptoolsStorePath="$(nix add-to-store -n "$extStoreName" "$tmpDir")"
|
|
cpptoolsSha256="$(nix hash-path --base32 --type sha512 "$cpptoolsStorePath")"
|
|
echo "cpptoolsStorePath='$cpptoolsStorePath'"
|
|
echo "cpptoolsSha256='$cpptoolsSha256'"
|
|
|
|
rm_tmpdir
|
|
|
|
storePathWithSha=$(nix-prefetch-url --print-path "file://${cpptoolsStorePath}/extension/package.json" 2> /dev/null)
|
|
|
|
extPackageJSONStorePath="$(echo "$storePathWithSha" | tail -n1)"
|
|
extPackageJSONSha256="$(echo "$storePathWithSha" | head -n1)"
|
|
echo "extPackageJSONStorePath='$extPackageJSONStorePath'"
|
|
echo "extPackageJSONSha256='$extPackageJSONSha256'"
|
|
|
|
print_runtime_dep() {
|
|
|
|
local outName="$1"
|
|
local extPackageJSONStorePath="$2"
|
|
local depDesc="$3"
|
|
|
|
local urlRaw=$(cat "$extPackageJSONStorePath" | jq -r --arg desc "$depDesc" '.runtimeDependencies[] | select(.description == $desc) | .url')
|
|
local url=$(echo $urlRaw | xargs curl -Ls -o /dev/null -w %{url_effective})
|
|
|
|
local urlRawVarStr="${outName}_urlRaw='$urlRaw'"
|
|
local urlVarStr="${outName}_url='$url'"
|
|
echo "$urlRawVarStr"
|
|
echo "$urlVarStr"
|
|
|
|
local storePathWithSha="$(nix-prefetch-url --unpack --print-path "$url" 2> /dev/null)"
|
|
|
|
local storePath="$(echo "$storePathWithSha" | tail -n1)"
|
|
local sha256="$(echo "$storePathWithSha" | head -n1)"
|
|
|
|
local sha256VarStr="${outName}_sha256='$sha256'"
|
|
local storePathVarStr="${outName}_storePath='$storePath'"
|
|
echo "$sha256VarStr"
|
|
echo "$storePathVarStr"
|
|
|
|
eval "$urlRawVarStr"
|
|
eval "$urlVarStr"
|
|
eval "$sha256VarStr"
|
|
eval "$storePathVarStr"
|
|
}
|
|
|
|
echo
|
|
echo "------------- Runtime dependencies ---------------"
|
|
|
|
print_runtime_dep "langComponentBinaries" "$extPackageJSONStorePath" "C/C++ language components (Linux / x86_64)"
|
|
print_runtime_dep "monoRuntimeBinaries" "$extPackageJSONStorePath" "Mono Runtime (Linux / x86_64)"
|
|
print_runtime_dep "clanFormatBinaries" "$extPackageJSONStorePath" "ClangFormat (Linux / x86_64)"
|
|
|
|
|
|
echo
|
|
echo "------------- Runtime deps missing elf deps ---------------"
|
|
|
|
source "$scriptDir/missing_elf_deps.sh"
|
|
|
|
echo
|
|
echo "------------- Runtime dep mono ---------------"
|
|
|
|
make_trapped_tmpdir
|
|
find "$monoRuntimeBinaries_storePath" -mindepth 1 -maxdepth 1 | xargs -d '\n' cp -rp -t "$tmpDir"
|
|
chmod -R a+rwx "$tmpDir"
|
|
|
|
ls -la "$tmpDir/debugAdapters"
|
|
|
|
patchelf_mono "$tmpDir/debugAdapters/mono.linux-x86_64"
|
|
|
|
chmod a+x "$tmpDir/debugAdapters/mono.linux-x86_64"
|
|
ldd "$tmpDir/debugAdapters/mono.linux-x86_64"
|
|
"$tmpDir/debugAdapters/mono.linux-x86_64" --version
|
|
|
|
monoRuntimeBinariesPatched_storePath="$(nix add-to-store -n "monoRuntimeBinariesPatched" "$tmpDir")"
|
|
echo "monoRuntimeBinariesPatched_storePath='$monoRuntimeBinariesPatched_storePath'"
|
|
|
|
rm_tmpdir
|
|
|
|
|
|
echo
|
|
echo "------------- Runtime dep clang ---------------"
|
|
make_trapped_tmpdir
|
|
find "$clanFormatBinaries_storePath" -mindepth 1 -maxdepth 1 | xargs -d '\n' cp -rp -t "$tmpDir"
|
|
chmod -R a+rwx "$tmpDir"
|
|
|
|
ls -la "$tmpDir/bin"
|
|
|
|
patchelf_clangformat "$tmpDir/bin/clang-format"
|
|
|
|
chmod a+x "$tmpDir/bin/clang-format"
|
|
ldd "$tmpDir/bin/clang-format"
|
|
"$tmpDir/bin/clang-format" --version
|
|
|
|
|
|
clanFormatBinariesPatched_storePath="$(nix add-to-store -n "clanFormatBinariesPatched" "$tmpDir")"
|
|
echo "clanFormatBinariesPatched_storePath='$clanFormatBinariesPatched_storePath'"
|
|
|
|
rm_tmpdir
|
|
|
|
echo
|
|
echo "------------- Nix mono ---------------"
|
|
print_nix_version_clangtools
|
|
|
|
echo
|
|
echo "------------- Nix mono ---------------"
|
|
print_nix_version_mono
|
|
|