# 3.3 安装评测系统

还有一份专门为开发者准备&#x7684;_&#x7EF4;护者安&#x88C5;_&#x65B9;法，请参考[附录：开发者信息](../a-appendix/10-developer-information)，并跳过本节其余内容。

Domjudge 的构建/安装系统包括一个 `configure` 脚本和 `makefiles`，但是安装的时候，您必须更加小心，而不是仅仅执行 `./configure && make && make install`。 Domjudge 需要同时安装在服务器和 judgehost 上，这就要求整个系统可以被部分安装；在安装系统中，这些部分分别是：`domserver`、`judgehost` 和 `docs(文档)`。

domjudge 可以安装成两种不同的目录结构：

## 单目录树 (Single directory tree)

> 使用此方法，所有和 Domjudge 相关的文件和程序都将安装在同一个目录树中，该目录树的前缀由 `configure` 的 `prefix` 选项指定，例如：
>
> ```
> ./configure --prefix=$HOME/domjudge --with-baseurl=https://domjudge.example.com/
> ```
>
> 这将会给 `domserve`、`judgehost`、`docs` 在 `$HOME/domjudge` 中分别创建一个子目录。可以使用 `--with-domserver\_root=DIR` 等选项更改这些默认值，详细请参考 `configure --help`；默认的目录前缀是 `/opt/domjudge`。
>
> 除了这些安装文件，还有一些用于存放日志文件，临时文件，提交的源码和测试数据的目录：
>
> * **log**：包含了所有的日志文件。
> * **tmp**：包含了所有的临时文件。
> * **submissions**：(可选) 仅仅作为备份，数据库中的文件更具有权威性；_注意_：未使用此功能，在 web 服务器上，该文件夹必须是 **可写** 的。
> * **judgings**：在 judgehost(评测机) 中；每一个提交都对应该文件夹中的一个子文件夹。
>
> 这是默认的安装方式，对于一般情景而言，这或许是最实用的安装方式，因为它最大限度地保证了所有的文件都在同一个地方，并且很容易就能找到。

## 符合 FHS 标准

> 此方法安装的 Domjudge 目录结构符合 [文件系统层级结构标准(FHS)](http://www.pathname.com/fhs/)；可以通过 `configure` 的 `--enable-fhs` 参数启用，此时目录结构的前缀是 `/usr/local`；文件将会放到例如 `PREFIX/share/domjudge`、`PREFIX/bin`、`PREFIX/var/log`、`PREFIX/etc/domjudge` 中，并且缓存文件将被放置在 `/temp` 中；您可能需要通过 `configure` 的 `--sysconfdir=/etc` 和 `--localstatedir=/var` 选项更改这些默认目录。

注意：`configure` 的 `--with-baseurl` 参数虽然不是必须的，但强烈建议您设置此选项，因为它允许您通过预设的 URL 来构建提交客户端(`submit client`)和队伍手册；~~单当您使用~~ [~~OpenID~~](3.10-openid-connect) ~~的时候，该选项是必须的；~~ 如果有需要，稍后可以在 domserver 上的 `etc/domserver-static.php` 和源码中的 `etc/submit-config.h` 中更新该设置以重建提交客户端。

运行过 `configure` 后就可以开始编译安装系统了；`domserver`、`judgehost` 和 `docs` 都可以单独安，例如：

```
make domserver && sudo make install-domserver
make judgehost && sudo make install-judgehost
make docs && sudo make install-docs
```

注意：root 权限是必须的，它用来设置密码文件和一些目录的权限和用户和用户组的所有权；如果&#x60A8;_&#x975E;_ root 权限执行，程序将发出警告，您必须手动执行这些操作；虽然 Domjudge 的安装需要 root 权限，但您**不**应该在 root 用户下运行 Domjudge 程序和守护进程：因为 `runguard` 是唯一需要 root 权限的部分(通过 `sudo` 获取权限)；此外，以 root 权限运行还会产生一些问题，参见常见问题章节 [runguard：root 权不失](broken-reference)。

关于 make 的目标(`make target`)列表，在源码根目录不带参数执行 `make` 查看。
