Skip to main content

编译器


编译器

从 2022/8/12 开始,Hydro 为了避免宿主机环境变化对于评测的影响,对于 此后新安装的实例 默认使用 nix 管理环境。
如果你是在这之前安装的 Hydro,请使用 apt 安装编译器后使用 pm2 restart hydro-sandbox 重启沙箱,并忽略本章节。

以下是 nix 的简要操作说明:

使用 nix-env -iA nixpkgs.编译器名 安装新编译器,后重启沙箱 pm2 restart hydro-sandbox 生效。

可以在 Nixos Searchopen in new window 中搜索你需要的编译器。
以下是常用编译器的示例:

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 Guideopen in new windowNix Manualopen in new window