diff --git a/backend/sandbox.bash b/backend/sandbox.bash index b80caef..a08e84d 100644 --- a/backend/sandbox.bash +++ b/backend/sandbox.bash @@ -41,6 +41,9 @@ function repl { } function main { + if get main | grep -q /; then + mkdir -p "$(dirname "$(get main)")" + fi : > "$(get main)" has prefix && get prefix >> "$(get main)" get template >> "$(get main)" diff --git a/docker/admin/install.bash b/docker/admin/install.bash index 38a3a00..ee71495 100755 --- a/docker/admin/install.bash +++ b/docker/admin/install.bash @@ -31,6 +31,7 @@ EOF packages=" apt-file +dctrl-tools docker-ce-cli g++ git diff --git a/docker/packaging/install.bash b/docker/packaging/install.bash index 8a4383c..982f791 100755 --- a/docker/packaging/install.bash +++ b/docker/packaging/install.bash @@ -19,15 +19,18 @@ wget https://letsencrypt.org/certs/lets-encrypt-r3.pem -O /usr/local/share/ca-ce update-ca-certificates -curl -fsSL https://downloads.ceylon-lang.org/apt/ceylon-debian-repo.gpg.key | apt-key add - -curl -fsSL https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add - -curl -fsSL https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - - ubuntu_ver="$(lsb_release -rs)" ubuntu_name="$(lsb_release -cs)" node_repo="$(curl -sS https://deb.nodesource.com/setup_current.x | grep NODEREPO= | grep -Eo 'node_[0-9]+\.x' | head -n1)" +wget "https://packages.microsoft.com/config/ubuntu/${ubuntu_ver}/packages-microsoft-prod.deb" +apt-get install ./packages-microsoft-prod.deb + +curl -fsSL https://downloads.ceylon-lang.org/apt/ceylon-debian-repo.gpg.key | apt-key add - +curl -fsSL https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add - +curl -fsSL https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - + tee -a /etc/apt/sources.list.d/custom.list >/dev/null </dev/null </dev/null; do sleep 0.01; done && mongo --host "$PWD/mongodb-27017.sock" diff --git a/langs/mysql.yaml b/langs/mysql.yaml index 5988e96..7154010 100644 --- a/langs/mysql.yaml +++ b/langs/mysql.yaml @@ -6,6 +6,9 @@ name: "MySQL" install: apt: - mysql-server + - mysql-client + riju: + - sqls repl: | rm -rf data && mysqld -h "$PWD/data" --initialize-insecure && (mysqld -h "$PWD/data" --socket="$PWD/socket" --pid-file="$PWD/pid-file" --mysqlx=OFF --skip-networking &) && until [[ -e socket ]]; do sleep 0.01; done && mysql --socket="$PWD/socket" -u root diff --git a/langs/oberon.yaml b/langs/oberon.yaml index 51086a4..0f33ad1 100644 --- a/langs/oberon.yaml +++ b/langs/oberon.yaml @@ -7,6 +7,18 @@ install: prepare: apt: - clang + - libgc-dev + apt: + - libgc-dev + manual: | + path="$(curl -sSL https://miasap.se/obnc/ | grep -F obnc_ | grep -Eo 'obnc_[^"]+' | grep -v win | head -n1)" + wget "https://miasap.se/obnc/downloads/${path}" -O obnc.tar.gz + mkdir obnc + tar -xf obnc.tar.gz -C obnc --strip-components=1 + pushd obnc + ./build + ./install --destdir="${pkg}" + popd main: "Main.obn" template: | diff --git a/langs/objectivec++.yaml b/langs/objectivec++.yaml index c0d236d..8b128b9 100644 --- a/langs/objectivec++.yaml +++ b/langs/objectivec++.yaml @@ -10,6 +10,8 @@ install: - gcc - gnustep-devel - gobjc++ + - clang-format + - clangd main: "main.mm" template: | diff --git a/langs/objectivec.yaml b/langs/objectivec.yaml index 30dd5c2..82ed99f 100644 --- a/langs/objectivec.yaml +++ b/langs/objectivec.yaml @@ -9,6 +9,8 @@ install: apt: - gcc - gnustep-devel + - clang-format + - clangd main: "main.m" template: | diff --git a/langs/ocaml.yaml b/langs/ocaml.yaml index 0dd6ac5..ec598e5 100644 --- a/langs/ocaml.yaml +++ b/langs/ocaml.yaml @@ -3,10 +3,13 @@ name: "OCaml" install: apt: - - ocaml + - ocaml-nox opam: - ocamlformat - - ocaml-lsp-server: "https://github.com/ocaml/ocaml-lsp.git" + - name: ocaml-lsp-server + source: "https://github.com/ocaml/ocaml-lsp.git" + binaries: + - ocamllsp repl: | ocaml diff --git a/langs/omgrofl.yaml b/langs/omgrofl.yaml index 95fe38a..21d30fd 100644 --- a/langs/omgrofl.yaml +++ b/langs/omgrofl.yaml @@ -4,6 +4,13 @@ aliases: - "rofl" name: "Omgrofl" +install: + manual: | + install -d "${pkg}/opt/omgrofl" + + ver="$(latest_release OlegSmelov/omgrofl-interpreter)" + wget "https://github.com/OlegSmelov/omgrofl-interpreter/releases/download/${ver}/Omgrofl.jar" -O "${pkg}/opt/omgrofl/omgrofl.jar" + main: "main.omgrofl" template: | lol iz 72 @@ -33,4 +40,4 @@ template: | rofl lol run: | - java -jar /opt/omgrofl/Omgrofl.jar main.omgrofl + java -jar /opt/omgrofl/omgrofl.jar main.omgrofl diff --git a/langs/ook.yaml b/langs/ook.yaml index c8ffed9..0eb0b68 100644 --- a/langs/ook.yaml +++ b/langs/ook.yaml @@ -5,6 +5,16 @@ install: prepare: apt: - autoconf + - libtool + - libgmp-dev + manual: | + git clone https://git.code.sf.net/p/esco/code esco + pushd esco + autoreconf -fi + ./configure --prefix="${pkg}/usr/local" + make + make install + popd main: "main.ook" template: | diff --git a/langs/oz.yaml b/langs/oz.yaml index 068395d..2b57b2c 100644 --- a/langs/oz.yaml +++ b/langs/oz.yaml @@ -4,6 +4,13 @@ aliases: - "mozart2" name: "Oz" +install: + manual: | + ver="$(latest_release mozart/mozart2 | sed 's/^v//')" + wget "https://github.com/mozart/mozart2/releases/download/v${ver}/mozart2-${ver}-x86_64-linux.deb" -O mozart.deb + deb: + - mozart.deb + main: "main.oz" template: | functor diff --git a/langs/pawn.yaml b/langs/pawn.yaml index 3f94a9b..3a6f2a0 100644 --- a/langs/pawn.yaml +++ b/langs/pawn.yaml @@ -4,6 +4,22 @@ aliases: - "pawnrun" name: "PAWN" +install: + prepare: + apt: + - cmake + manual: | + install -d "${pkg}/opt/pawn" + install -d "${pkg}/usr/local/bin" + + git clone https://github.com/compuphase/pawn.git + pushd pawn + cmake . + make + cp pawncc pawnrun "${pkg}/usr/local/bin/" + cp -R include "${pkg}/opt/pawn/" + popd + main: "main.pawn" template: | #include diff --git a/langs/pikachu.yaml b/langs/pikachu.yaml index 61348a2..34c3289 100644 --- a/langs/pikachu.yaml +++ b/langs/pikachu.yaml @@ -13,6 +13,8 @@ aliases: name: "Pikachu" install: + apt: + - python3-setuptools pip: - pikalang diff --git a/langs/pike.yaml b/langs/pike.yaml index c0fa1e7..0296c03 100644 --- a/langs/pike.yaml +++ b/langs/pike.yaml @@ -3,8 +3,8 @@ name: "Pike" install: apt: - - $(grep-aptavail -eF Package "^pike[0-9.]+$" -s Package -n | sort -Vr | head -n1) - - $(grep-aptavail -eF Package "^pike[0-9.]+$" -s Package -n | sort -Vr | head -n1)-doc + - $(grep-aptavail -wF Package "pike[0-9.]+" -s Package -n | sort -Vr | head -n1) + - $(grep-aptavail -wF Package "pike[0-9.]+" -s Package -n | sort -Vr | head -n1)-doc repl: | pike diff --git a/langs/postgresql.yaml b/langs/postgresql.yaml index e8a35be..fe308b2 100644 --- a/langs/postgresql.yaml +++ b/langs/postgresql.yaml @@ -11,6 +11,8 @@ install: apt: - postgresql - postgresql-client + riju: + - sqls repl: | rm -rf data && /usr/lib/postgresql/*/bin/initdb -D data && (echo "listen_addresses = ''" && echo "unix_socket_directories = '.'") >> data/postgresql.conf && /usr/lib/postgresql/*/bin/pg_ctl -D data -w start && psql -h "$PWD/data" postgres diff --git a/langs/powershell.yaml b/langs/powershell.yaml index d84cbcc..db6a710 100644 --- a/langs/powershell.yaml +++ b/langs/powershell.yaml @@ -5,6 +5,21 @@ aliases: name: "PowerShell" monacoLang: powershell +install: + manual: | + install -d "${pkg}/opt/powershell" + install -d "${pkg}/usr/local/bin" + + ver="$(latest_release PowerShell/PowerShell | sed 's/^v//')" + wget "https://github.com/PowerShell/PowerShell/releases/download/v${ver}/powershell-${ver}-linux-x64.tar.gz" -O powershell.tar.gz + tar -xf powershell.tar.gz -C "${pkg}/opt/powershell" + ln -s /opt/powershell/pwsh "${pkg}/usr/local/bin/" + + ver="$(latest_release PowerShell/PowerShellEditorServices)" + wget "https://github.com/PowerShell/PowerShellEditorServices/releases/download/${ver}/PowerShellEditorServices.zip" + unzip PowerShellEditorServices.zip + cp -RT PowerShellEditorServices "${pkg}/opt/powershell-editor-services" + repl: | SHELL=/usr/bin/pwsh pwsh input: | diff --git a/langs/pseint.yaml b/langs/pseint.yaml index d59266f..cb8e2b7 100644 --- a/langs/pseint.yaml +++ b/langs/pseint.yaml @@ -3,6 +3,14 @@ aliases: - "psc" name: "PSeInt" +install: + manual: | + install -d "${pkg}/usr/local/bin" + + wget "$(curl -sSL "http://pseint.sourceforge.net/index.php?page=descargas.php&os=lnx" | grep -Eo 'http://[^"]+l64[^"]+\.tgz\?download')" -O pseint.tgz + tar -xf pseint.tgz + cp pseint/bin/pseint "${pkg}/usr/local/bin/" + main: "main.psc" template: | Proceso Main diff --git a/langs/purescript.yaml b/langs/purescript.yaml index 7962b3f..bca1f49 100644 --- a/langs/purescript.yaml +++ b/langs/purescript.yaml @@ -5,14 +5,41 @@ aliases: name: "PureScript" install: + prepare: + apt: + - libtinfo5 + npm: + - purescript + - spago apt: - libtinfo5 npm: - purescript - spago + manual: | + install -d "${pkg}/opt/purescript" + + mkdir skel + pushd skel + spago init -C + rm -rf .gitignore test + sed -i 's#, "test/\*\*/\*\.purs"##' spago.dhall + cat <<"EOF" > src/Main.spago + import Prelude + + import Effect (Effect) + + main :: Effect Unit + main = pure unit + EOF + spago build + spago repl < /dev/null + rm -rf src + popd + cp -R skel "${pkg}/opt/purescript/" setup: | - shopt -s dotglob; cp -R /opt/purescript/project-template/* "$PWD/" + shopt -s dotglob; cp -R /opt/purescript/skel/* "$PWD/" repl: | spago repl diff --git a/langs/qsharp.yaml b/langs/qsharp.yaml index 24cb7d3..d78306a 100644 --- a/langs/qsharp.yaml +++ b/langs/qsharp.yaml @@ -5,11 +5,23 @@ aliases: name: "Q#" install: + prepare: + apt: + - $(grep-aptavail -wF Package "dotnet-sdk-[0-9.]+" -s Package -n | sort -Vr | head -n1) apt: - - $(grep-aptavail -eF Package "^dotnet-sdk-[0-9.]+$" -s Package -n | sort -Vr | head -n1) + - $(grep-aptavail -wF Package "dotnet-sdk-[0-9.]+" -s Package -n | sort -Vr | head -n1) + manual: | + install -d "${pkg}/opt/qsharp" + + dotnet new -i Microsoft.Quantum.ProjectTemplates + dotnet new console -lang Q# -o main + cp -R main "${pkg}/opt/qsharp/skel" + rm "${pkg}/opt/qsharp/skel/Program.qs" + cp -R "$HOME/.dotnet" "${pkg}/opt/qsharp/dotnet" + chmod -R a=u,go-w "${pkg}/opt/qsharp/dotnet" setup: | - cp -R /opt/qsharp/dotnet ./.dotnet && cp -R /opt/qsharp/project-template/* ./ + cp -R /opt/qsharp/dotnet ./.dotnet && cp -R /opt/qsharp/skel/* ./ main: "Main.qs" template: | diff --git a/langs/ratfor.yaml b/langs/ratfor.yaml index a1f3cf2..43a0897 100644 --- a/langs/ratfor.yaml +++ b/langs/ratfor.yaml @@ -6,14 +6,14 @@ name: "Ratfor" install: apt: - ratfor - - flang + - gfortran main: "main.r" template: | - print *, 'Hello, world!' - end + PRINT *, 'Hello, world!' + END compile: | - ratfor main.r -o main.f && flang main.f -o main + ratfor main.r -o main.f && gfortran main.f -o main run: | ./main diff --git a/langs/reasonml.yaml b/langs/reasonml.yaml index fd4fff7..e8aaede 100644 --- a/langs/reasonml.yaml +++ b/langs/reasonml.yaml @@ -8,10 +8,31 @@ aliases: name: "ReasonML" install: + prepare: + apt: + - yarn + npm: + - bs-platform npm: - bs-platform opam: - - reason + - name: reason + binaries: + - refmt + manual: | + install -d "${pkg}/opt/reasonml/skel" + install -d "${pkg}/usr/local/bin" + + ver="$(latest_release jaredly/reason-language-server)" + wget "https://github.com/jaredly/reason-language-server/releases/download/${ver}/rls-linux.zip" + unzip rls-linux.zip + cp rls-linux/reason-language-server "${pkg}/usr/local/bin/" + + pushd "${pkg}/opt/reasonml/skel" + bsb -init . + cat bsconfig.json | jq '.name = "riju-project"' | sponge bsconfig.json + yarn install + popd main: "main.re" template: | @@ -30,7 +51,7 @@ format: lsp: setup: | - cp -a /opt/reasonml/project-template/* ./ + cp -a /opt/reasonml/skel/* ./ start: | reason-language-server diff --git a/langs/rebol.yaml b/langs/rebol.yaml index 1f9e57b..8539fcc 100644 --- a/langs/rebol.yaml +++ b/langs/rebol.yaml @@ -1,6 +1,15 @@ id: "rebol" name: "REBOL" +install: + manual: | + install -d "${pkg}/usr/local/bin" + + file="$(curl -sSL http://www.rebol.com/downloads.html | sed '0,/x86-64/d' | grep -Eo 'downloads/[^"]+' | head -n1)" + wget "http://www.rebol.com/${file}" -O rebol.tar.gz + tar -xf rebol.tar.gz + cp rebol-core/rebol "${pkg}/usr/local/bin/" + repl: | rebol diff --git a/langs/red.yaml b/langs/red.yaml index eb94ada..8afe8ab 100644 --- a/langs/red.yaml +++ b/langs/red.yaml @@ -4,12 +4,23 @@ name: "Red" install: apt: - libcurl5:i386 + manual: | + install -d "${pkg}/opt/red/skel" + install -d "${pkg}/usr/local/bin" + + path="$(curl -sSL https://static.red-lang.org/download.html | grep -Eo '/dl/linux/[^"]+' | head -n1)" + wget "https://static.red-lang.org/${path}" -O red + chmod +x red + cp red "${pkg}/usr/local/bin/" + + ./red <<< quit + cp -R "$HOME/.red" "${pkg}/opt/red/skel/" setup: | - cp -R /opt/red/template .red + shopt -s dotglob; cp -R /opt/red/skel/* ./ repl: | - /usr/local/bin/red + red input: | DELAY: 1 123 * 234 @@ -21,4 +32,4 @@ template: | print "Hello, world!" run: | - /usr/local/bin/red main.red; /usr/local/bin/red + red main.red; red diff --git a/langs/ruby.yaml b/langs/ruby.yaml index 1a61b1a..728559b 100644 --- a/langs/ruby.yaml +++ b/langs/ruby.yaml @@ -6,6 +6,9 @@ name: "Ruby" monacoLang: ruby install: + prepare: + apt: + - ruby-dev apt: - ruby gem: diff --git a/langs/rust.yaml b/langs/rust.yaml index 7679999..3586807 100644 --- a/langs/rust.yaml +++ b/langs/rust.yaml @@ -5,6 +5,23 @@ aliases: name: "Rust" monacoLang: rust +install: + manual: | + install -d "${pkg}/usr/local/bin" + + export CARGO_HOME="${pkg}/opt/rustup" + export RUSTUP_HOME="${pkg}/opt/rustup" + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --no-modify-path + "${pkg}/opt/rustup/bin/rustup" component add rls rust-analysis rust-src + + ls "${pkg}/opt/rustup/bin" | while read name; do + cat < "${pkg}/usr/local/bin/${name}" + #!/usr/bin/env bash + exec env RUSTUP_HOME=/opt/rustup "/opt/rustup/bin/${name}" "\$@" + EOF + chmod +x "${pkg}/usr/local/bin/${name}" + done + main: "main.rs" template: | fn main() { diff --git a/langs/sagemath.yaml b/langs/sagemath.yaml index ba50b87..e943b69 100644 --- a/langs/sagemath.yaml +++ b/langs/sagemath.yaml @@ -4,8 +4,29 @@ aliases: name: "SageMath" install: - apt: - - sagemath + manual: | + sudo tee -a /etc/apt/sources.list.d/focal.list >/dev/null < 0) { parts.push(`\ sudo apt-get install -y ${apt.join(" ")}`); + } + if (npm && npm.length > 0) { + parts.push(`\ +sudo npm install -g ${npm.join(" ")}`); } if (manual) { parts.push(manual); } } - if (npm) { + if (npm && npm.length > 0) { + depends.push("nodejs"); for (let fullname of npm) { let arg; if (typeof fullname === "string") { @@ -78,7 +86,8 @@ if [[ -d "$\{pkg}/opt/${basename}/bin" ]]; then fi`); } } - if (pip) { + if (pip && pip.length > 0) { + depends.push("python3"); for (const basename of pip) { parts.push(`\ install -d "\${pkg}/usr/local/bin" @@ -105,15 +114,41 @@ if [[ -d "\${pkg}/opt/${basename}/man" ]]; then fi`); } } - if (cpan) { + if (gem && gem.length > 0) { + depends.push("ruby"); + for (const name of gem) { + parts.push(`\ +install -d "\${pkg}/usr/local/bin" +gem install "${name}" -i "/opt/${name}" -n "/opt/${name}/bin" --build-root "\${pkg}" + +if [[ -d "\${pkg}/opt/${name}/bin" ]]; then + ( + set +e + ls "\${pkg}/opt/${name}/gems/${name}"-*/bin + ls "\${pkg}/opt/${name}/gems/${name}"-*/exe + true + ) | while read name; do + if [[ -x "\${pkg}/opt/${name}/bin/\${name}" ]]; then + cat < "\${pkg}/usr/local/bin/\${name}" +#!/usr/bin/env bash +exec env GEM_PATH="/opt/${name}" "/opt/${name}/bin/\${name}" "\\\$@" +EOF + chmod +x "\${pkg}/usr/local/bin/\${name}" + fi + done +fi`); + } + } + if (cpan && cpan.length > 0) { + depends.push("perl"); for (const fullname of cpan) { - const basename = fullname.replace(/^.+:/, "").toLowerCase(); + const basename = fullname.replace(/:+/g, "-").toLowerCase(); parts.push(`\ install -d "\${pkg}/usr/local/bin" cpanm -l "\${pkg}/opt/${basename}" -n "${fullname}" if [[ -d "\${pkg}/opt/${basename}/bin" ]]; then - ls "\${pkg}/opt/${basename}/bin" | while read name; do + ls "\${pkg}/opt/${basename}/bin" | (grep -v config_data || true) | while read name; do version="$(ls "\${pkg}/opt/${basename}/lib" | head -n1)" cat < "\${pkg}/usr/local/bin/\${name}" #!/usr/bin/env bash @@ -121,18 +156,37 @@ exec env PERL5LIB="/opt/${basename}/lib/\${version}" "/opt/${basename}/bin/\${na EOF chmod +x "\${pkg}/usr/local/bin/\${name}" done -fi - -if [[ -d "\${pkg}/opt/${basename}/man" ]]; then - ls "\${pkg}/opt/${basename}/man" | while read dir; do - install -d "\${pkg}/usr/local/man/\${dir}" - ls "\${pkg}/opt/${basename}/man/\${dir}" | while read name; do - ln -s "/opt/${basename}/man/\${dir}/\${name}" "\${pkg}/usr/local/man/\${dir}/\${name}" - done - done fi`); } } + if (opam && opam.length > 0) { + depends.push("ocaml-nox"); + for (let opts of opam) { + if (typeof opts === "string") { + opts = { name: opts, binaries: [opts] }; + } + const { name, source, binaries } = opts; + let installCmd; + if (source) { + installCmd = `opam pin add "${name}" "${source}" -y --root "\${pkg}/opt/${name}"`; + } else { + installCmd = `opam install "${name}" -y --root "\${pkg}/opt/${name}"`; + } + parts.push(`\ +install -d "\${pkg}/usr/local/bin" + +opam init -n --disable-sandboxing --root "\${pkg}/opt/${name}" +${installCmd}`); + parts.push( + binaries + .map( + (binary) => + `ln -s "/opt/${name}/default/bin/${binary}" "\${pkg}/usr/local/bin/"` + ) + .join("\n") + ); + } + } if (files) { for (const [file, contents] of Object.entries(files)) { const path = "${pkg}" + file; @@ -163,6 +217,9 @@ chmod +x "${path}"`); if (apt) { depends = depends.concat(apt); } + if (dependsCfg.unpin) { + depends = depends.concat(dependsCfg.unpin); + } if (riju) { depends = depends.concat(riju.map((name) => `riju-shared-${name}`)); } @@ -174,8 +231,9 @@ chmod +x "${path}"`); } parts.push(`depends=(${depends.map((dep) => `"${dep}"`).join(" ")})`); let stripDependsFilter = ""; - if (install && install.stripDepends && install.stripDepends.length > 0) { - stripDependsFilter = ` | sed -E 's/(^| )(${install.stripDepends.join( + const stripDepends = (dependsCfg.strip || []).concat(dependsCfg.unpin || []); + if (stripDepends.length > 0) { + stripDependsFilter = ` | sed -E 's/(^| )(${stripDepends.join( "|" )}) *(\\([^)]*\\))? *(,|$)/\\1/g' | sed -E 's/^ *//g'`; } @@ -187,7 +245,7 @@ Maintainer: Radon Rosborough Description: The ${name} ${ isShared ? "shared dependency" : "language" } packaged for Riju -Depends: \$(IFS=,; echo "\${depends[*]}" | sed -E 's/,([^ ])/, \\1/g'${stripDependsFilter} | sed -E 's/ +/ /g') +Depends: \$(IFS=,; echo "\${depends[*]}" | sed -E 's/,([^ ])/, \\1/g'${stripDependsFilter} | sed -E 's/ +/ /g' | sed -E 's/ *, *$//') Riju-Script-Hash: \$(sha1sum "\$0" | awk '{ print \$1 }')`; parts.push(`\ install -d "\${pkg}/DEBIAN"