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
之间的不相容性。