Just 避免了 Make 的哪些特异性?

make 有一些行为令人感到困惑、复杂,或者使它不适合作为通用的命令运行器。

一个例子是,在某些情况下,make 不会实际运行配方中的命令。例如,如果你有一个名为 test 的文件和以下 makefile:

test:
  ./test

make 将会拒绝运行你的测试:

$ make test
make: `test' is up to date.

make 假定 test 配方产生一个名为 test 的文件。由于这个文件已经存在,而且由于配方没有其他依赖,make 认为它没有任何事情可做并退出。

公平地说,当把 make 作为一个构建系统时,这种行为是可取的,但当把它作为一个命令运行器时就不可取了。你可以使用 make 内置的 .PHONY 目标名称 为特定的目标禁用这种行为,但其语法很冗长,而且很难记住。明确的虚假目标列表与配方定义分开写,也带来了意外定义新的非虚假目标的风险。在 just 中,所有的配方都被当作是虚假的。

其他 make 特异行为的例子包括赋值中 =:= 的区别;如果你弄乱了你的 makefile,将会产生混乱的错误信息;需要 $$ 在配方中使用环境变量;以及不同口味的 make 之间的不相容性。