编译器
编译器
从 2022/8/12 开始,Hydro 为了避免宿主机环境变化对于评测的影响,对于 此后新安装的实例 默认使用 nix 管理环境。
如果你是在这之前安装的 Hydro,请使用 apt 安装编译器后使用 pm2 restart hydro-sandbox
重启沙箱,并忽略本章节。
以下是 nix 的简要操作说明:
使用 nix-env -iA nixpkgs.编译器名
安装新编译器,后重启沙箱 pm2 restart hydro-sandbox
生效。
可以在 Nixos Search 中搜索你需要的编译器。
以下是常用编译器的示例:
nix-env -iA nixpkgs.busybox nixpkgs.bash nixpkgs.diffutils nixpkgs.unzip # 基础组件,已预装,不建议删除
nix-env -iA nixpkgs.gcc nixpkgs.fpc # C/C++ 和 Pascal,已预装,不建议删除
nix-env -iA nixpkgs.ghc # Haskell
nix-env -iA nixpkgs.rustc # Rust
nix-env -iA nixpkgs.python2 # Python2
nix-env -iA nixpkgs.pythonPackages.numpy # Python2 Numpy 库
nix-env -iA nixpkgs.python3Minimal
nix-env -iA nixpkgs.python3Packages.numpy
nix-env -iA nixpkgs.php # PHP
nix-env -iA nixpkgs.go # Golang
nix-env -iA nixpkgs.nodejs # NodeJS
nix-env -iA nixpkgs.openjdk_headless # Java
nix-env -iA nixpkgs.ruby # Ruby
nix-env -iA nixpkgs.mono # C#
nix-env -iA nixpkgs.julia_17-bin # Julia
使用 nix-env -q
查看已安装的列表,后使用 nix-env -e 编译器名
即可删除对应的编译器。
请注意不要误删 Hydro 基础组件,且操作完成后需要重启沙箱 pm2 restart hydro-sandbox
生效。
Tips
部分语言(特指 Java 等)因为语言特性,编译需要使用较长的 CPU 时间,这在单核机器上尤为明显, 可能需要花费数秒甚至数十秒才能完成 A+B 的编译。
预期性能可以通过在主机上手动运行编译命令来测试:
javac -d /w -encoding utf8 ./Main.java && jar cvf Main.jar *.class
同时部分编译器在可能时会尝试创建大量进程利用多核并行编译,请确保 judge 设置中 processLimit
项足够大, 否则会因编译器无法创建进程失败导致编译失败。
在编译器利用多核并行编译时,Hydro 会统计这些进程的 CPU 占用之和作为 CPU 资源限制,如出现编译超时错误, 请调整系统设置中对应语言选项下的 compile_time_limit
项(单位 ms)。
进阶
如果你需要更加复杂的编译环境配置,我们建议使用编写单独的 nix 文件。
{
system ? builtins.currentSystem,
pkgs ? import <nixpkgs> { system = system; }
}:
pkgs.buildEnv {
name = "hydrojudge-rootfs";
paths = with pkgs; [
coreutils bash diffutils nix zip unzip gcc
# 上方包是评测所需要的,请勿删除,
# 在下方列出你所需要的包,查找方式同上文:
fpc python3 rustc
];
ignoreCollisions = true;
pathsToLink = [ "/" ];
# 导出一些基本信息和部分编译器所需的 /etc/passwd
postBuild = ''
mkdir $out/buildInfo
echo 'root:x:0:0:root:/root:/bin/bash' >$out/etc/passwd
date >$out/buildInfo/timestamp
'';
}
复制以上文件,保存为 default.nix
,使用 nix-build
进行构建。
构建后会产生一个 result
文件夹,记住该文件夹所在的路径。
打开 ~/.hydro/mount.yaml
将其中 /root/.nix-profile
替换为编译出的 result
文件夹(切换到新的环境)
之后保存并重启沙箱。
后续若需更改环境配置,仅需要修改 default.nix
文件之后 nix-build
重新构建,再重启沙箱即可生效。
构建过程中的缓存文件可以使用 nix-collect-garbage
进行清理。
更详细的 nix 语言介绍,请参照 Nix Guide 和 Nix Manual。