4

两个简化的 makefile

生成文件1

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

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

生成文件2

t1:
    echo “123144234” > a.txt

t2: t1
    cat a.txt > b.txt

两个 makefile 具有相同的功能。

由于on的依赖 两个 makefile 可以并行运行。t2 t1

但是,有一个关键的区别可能?/确实?在分布式构建方面有所作为。

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

这种差异很关键,因为gnu make(我假设distcc)不解析配方 - 也不在运行时分析文件系统 - 以确定给定目标的所有工件。在makefile2中,gnu make不会在a.txt和之间创建任何关系t1

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

但是让我们考虑一下可以做什么?/做什么?如果两个目标构建在两台不同的机器上,则在分布式构建期间发生

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

但是,在makefile1t2中, on的依赖a.txt是明确的,即distcc 知道make t2在单独的机器上,它必须将文件发送a.txt到该单独的机器。

问题

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

1 回答 1

3

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

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

make总是在本地运行。

回答您的问题:

  1. distcc不运行makemake运行distc而不是gcc. make在本地检查依赖项及其时间戳。
  2. make在本地运行,它不关心它使用的文件系统是本地的还是网络的。
于 2020-02-18T17:59:46.957 回答