我想知道如何将此shell script
转换为Makefile
并使用make all
执行所有脚本的操作。我有两个目录pictures
和thumbs
,其中thumbs
在运行脚本之前为空,pictures
包含一些.jpg
文件。最后,这是我要转换为shell script
的{{1}}:
Makefile
答案 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)
。
patsub
wildcard
和THUMBS
函数是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;
}
的操作。