为什么使用shell脚本目标调用make会创建可执行文件?

时间:2017-04-06 19:57:06

标签: linux bash shell gnu-make

我编写了一个简单的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将自动创建可执行文件的受支持“隐含后缀”列表?

2 个答案:

答案 0 :(得分:3)

这是许多隐含规则之一"这是内置于Gnu制造的。 (每个make实现都会有一些隐含的规则,但不能保证它们是相同的。)

  
      
  1. 为什么make会自动创建一个没有.sh扩展名的可执行脚本?
  2.   

有一个名为Source Code Control System(SCCS)的旧源存储库系统。虽然它不再有太多用处,但它曾经是维护源代码库的最常用方法。它有一个怪癖,它没有保留文件权限,所以如果你在SCCS中保留一个(可执行的)shell脚本并稍后检查它,它将不再是可执行的。 Gnu make可以自动从SCCS存储库中提取文件;为了弥补消失的可执行权限问题,通常将.sh扩展名与shell脚本一起使用;然后,make可以执行两步提取,首先从存储库中提取foo.sh,然后将其复制到foo,添加可执行权限。

  
      
  1. 这是正常/预期/标准行为吗?我可以在所有Linux机器上依赖此行为吗?
  2.   

安装了开发工具集的Linux系统倾向于使用Gnu make,因此您应该能够依赖用于开发的Linux系统上的这种行为。

BSD make还附带.sh的默认规则,但它只复制文件;它不会更改权限(至少在我的机器上的bsdmake发行版上)。所以这种行为并不普遍。

  
      
  1. 是否有受支持的"隐式后缀列表" make会自动创建一个可执行文件吗?
  2.   

是的,有。您可以在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

make options summary

中所述

答案 1 :(得分:1)

来自 make 手册页:

  

make实用程序的目的是自动确定   哪一个          需要重新编译大型程序的各个部分,然后发出命令          重新编译它们。该手册描述了GNU的实现          make,由Richard Stallman和Roland McGrath编写,是          目前由Paul Smith维护。我们的示例显示了C个程序,          因为它们是最常见的,但你可以使用make进行任何编程          可以使用shell命令运行其编译器的语言。事实上,制作          不仅限于节目。您可以使用它来描述任何任务          有些文件必须在其他文件发生变化时自动更新。

make确实比大多数人 制作 更多...