distcc - 在某些情况下它需要一个同步的网络文件系统

distcc - are there cases it requires a synchronized network filesystem

两个简化的 makefile

makefile1

a.txt:
    echo “123144234” > a.txt

t2: a.txt
    cat a.txt > b.txt

makefile2

t1:
    echo “123144234” > a.txt

t2: t1
    cat a.txt > b.txt

两个 makefile 具有相同的功能。

两个 makefile 可以 运行 并行,因为 of t2 on t1.

但是,在分布式构建方面,可能会?/是否会? 有一个重要的区别。

makefile1中,t2直接依赖于artifact a.txt也与目标本身的名称相同a.txt .但是,在 makefile2 中,虽然 t1 的配方和工件与 a.txt 相同,但目标名称不是 a.txt

这个区别是关键,因为 gnu make(我假设 distcc)不解析配方 - 也不在 运行 时分析文件系统 - 以确定所有工件给定的目标。在 makefile2 中,gnu make 不会在 a.txtt1.

之间创建任何关系

当构建以 make -j 方式完成时,即并行但非分布式,此差异无关紧要,因为所有 make 目标都 运行 在同一台机器上 即所有 make 个实例访问同一个文件系统。

但是让我们考虑一下如果两个目标是在两个单独的机器[上构建的,那么在分布式构建期间会发生什么?/会发生什么? =40=]

在两个 makefile 中,t2 的配方将是 运行 在 a.txt/t1 的配方之后。

但是,在 makefile1t2a.txt 的依赖是明确的,即 distcc 知道 在另一台机器上 make t2,它必须将文件 a.txt 发送到那台单独的机器。

问题

  1. 如果 makefile2 运行 使用 distcc,没有同步分布式文件系统,并且 t2 maked另一台机器,是否会因为 a.txt 在另一台机器上不存在而出现构建错误?
  2. 分布式 Linux 文件系统有哪些选项?

distcc 只是 gcc 的替代品。它使用本地 gcc 对源文件进行预处理,然后将其发送到另一台机器进行编译,接收回目标文件并将其保存到本地文件系统中。 distcc 不需要共享网络文件系统或参与主机之间的时钟同步。

还有新的 "pump" 功能可以在远程服务器上进行预处理,但它不需要共享网络文件系统或时钟同步。

你的 make 总是 运行 在本地。

回答您的问题:

  1. distcc 没有 运行 makemake 运行s distc 而不是 gccmake 在本地检查依赖项及其时间戳。
  2. make 运行在本地,它不关心它使用的文件系统是本地的还是网络的。