我编写了一个简单的shell脚本(称为test.sh
),使用两个不同的编译器(g ++和clang ++)编译测试C ++文件,并放入一些echo
语句来比较输出。在命令行中,我不小心输入了make test
,即使该目录中没有Makefile。它没有抱怨没有Makefile或没有定义目标,而是执行了以下命令(我的系统使用GNU Make 4.1运行64位Debian延伸操作系统):
user@hostname test_dir$ make test
cat test.sh >test
chmod a+x test
user@hostname test_dir$
很好奇,我制作了另一个shell脚本(other.sh
)并做了同样的事情。
这是我的
other.sh
文件:
#!/bin/bash
echo ""
echo "This is another test script!"
echo ""
命令行:
user@hostname test_dir$ make other
cat other.sh >other
chmod a+x other
user@hostname test_dir$
我的问题是为什么make
在终端中运行.sh
命令时会自动创建可执行脚本(没有make
扩展名)?这是正常/预期/标准行为吗?我可以在所有Linux机器上依赖这种行为吗?
附带问题/注意:是否有make
将自动创建可执行文件的受支持“隐含后缀”列表?
答案 0 :(得分:3)
这是许多隐含规则之一"这是内置于Gnu制造的。 (每个make实现都会有一些隐含的规则,但不能保证它们是相同的。)
- 为什么make会自动创建一个没有.sh扩展名的可执行脚本?
醇>
有一个名为Source Code Control System(SCCS)的旧源存储库系统。虽然它不再有太多用处,但它曾经是维护源代码库的最常用方法。它有一个怪癖,它没有保留文件权限,所以如果你在SCCS中保留一个(可执行的)shell脚本并稍后检查它,它将不再是可执行的。 Gnu make可以自动从SCCS存储库中提取文件;为了弥补消失的可执行权限问题,通常将.sh
扩展名与shell脚本一起使用;然后,make
可以执行两步提取,首先从存储库中提取foo.sh
,然后将其复制到foo
,添加可执行权限。
- 这是正常/预期/标准行为吗?我可以在所有Linux机器上依赖此行为吗?
醇>
安装了开发工具集的Linux系统倾向于使用Gnu make,因此您应该能够依赖用于开发的Linux系统上的这种行为。
BSD make还附带.sh
的默认规则,但它只复制文件;它不会更改权限(至少在我的机器上的bsdmake发行版上)。所以这种行为并不普遍。
- 是否有受支持的"隐式后缀列表" make会自动创建一个可执行文件吗?
醇>
是的,有。您可以在make manual:
中找到它默认后缀列表为:
.out
,.a
,.ln
,.o
,.c
,.cc
,.C
,.cpp
,.p
,.f
,.F
,.m
,.r
,.y
,.l
,{ {1}},.ym
,.lm
,.s
,.S
,.mod
,.sym
,.def
,.h
,.info
,.dvi
,{{ 1}},.tex
,.texinfo
,.texi
,.txinfo
,.w
,.ch
,.web
,.sh
。
有关隐式规则的更准确列表,您可以使用命令
.elc
中所述
答案 1 :(得分:1)
来自 make
手册页:
make实用程序的目的是自动确定 哪一个 需要重新编译大型程序的各个部分,然后发出命令 重新编译它们。该手册描述了
GNU
的实现 make,由Richard Stallman和Roland McGrath编写,是 目前由Paul Smith维护。我们的示例显示了C
个程序, 因为它们是最常见的,但你可以使用make进行任何编程 可以使用shell命令运行其编译器的语言。事实上,制作 不仅限于节目。您可以使用它来描述任何任务 有些文件必须在其他文件发生变化时自动更新。
make
确实比大多数人 制作 更多...