从shell转换到Makefile

时间:2017-01-12 22:23:23

标签: bash shell makefile

我想知道如何将此shell script转换为Makefile并使用make all执行所有脚本的操作。我有两个目录picturesthumbs,其中thumbs在运行脚本之前为空,pictures包含一些.jpg文件。最后,这是我要转换为shell script的{​​{1}}:

Makefile

2 个答案:

答案 0 :(得分:2)

从Makefile中你可以调用一个程序。

实施例

$ cat a.sh
echo From Makefile
$ cat Makefile
all:
    ./a.sh

测试:

$ make
./a.sh
From Makefile

答案 1 :(得分:1)

您可以更简单地将shell代码的行为实现为Makefile,至少如果您愿意依赖GNU make。我将此解释为您所要求的(特别是对GNU make的模数依赖)。这是一个非常实用的粗剪:

THUMBS = $(patsubst pictures/%,thumbs/%,$(wildcard pictures/*jpg*))

all: $(THUMBS)

thumbs/%: pictures/% thumbs
    convert -thumbnail 100 '$<' '$@'

thumbs:
    mkdir -p '$@'

.PHONY: all

注意:

  • THUMBS make变量设置为您要管理的缩略图图像列表,基于展开shell glob pictures/*jpg*并将pictures/的每个匹配项替换为thumbs/ $(wildcard pictures/*.jpg)

    • 选择模式以匹配您的shell代码,但也许您真的想要更像patsub
    • 的内容
    • 如果您需要担心它们,那么带有空格的文件名将会出现一个棘手的问题;带有某些其他特殊字符的文件名,虽然稍微不那么
    • wildcardTHUMBS函数是GNU扩展
    • 您还可以将all的定义合并到thumbs/%: pictures/% thumbs的规则中,并避免使用单独的变量
  • make的规则使用GNU特定的模式规则语法;这种特殊形式很难表达给POSIX thumbs

  • 如果缺少make all目录,则会创建make目录,但如果该名称的普通文件的方式存在错误

  • .PHONY(或只是make)会更新所有过时的缩略图;它不依赖于与原始脚本相同的日期比较逻辑(这是好的事物)

  • -O2规则只是要小心。它可以防止存在名为“all”的实际文件干扰#include <stdio.h> static unsigned long hash(const char *str) { unsigned long hash = 5381; int c; while ((c = *str++)) hash = ((hash << 5) + hash) + c; return hash; } int main( int argc, char **argv ) { size_t size=0; printf("%ld",hash("exit")); // I want this to evaluate in compile time return 0; } 的操作。