设计一个可移植的makefile循环

aud*_*tic 1 c loops makefile gnu-make

我需要设计一个make文件,它将连续运行多个(类似命名的)程序.它还需要是可移植的,因为它将在CentOS和Solaris(非GNU)系统上使用.我之前从未真正使用过makefile中的循环.以下是我的尝试.不幸的是,它似乎只执行第一个程序.

CC = gcc
CFLAGS = -g -Wall #-Werror

SRCS  := $(wildcard *.c)
PROGS := $(SRCS:.c=)
OBJS  := $(SRCS:.c=.o)

all: $(PROGS)

run:    $(PROGS)
    $(foreach prog, $(PROGS), ./$(prog))

clean: $(PROGS)
    rm $(PROGS)
Run Code Online (Sandbox Code Playgroud)

这是make run从终端运行的结果

./prog-14  ./prog-17  ./prog-20  ./prog-13  ./prog-18  ./prog-06  ./prog-07  ./prog-04  ./prog-19  ./prog-11  ./prog-03  ./prog-08  ./prog-12  ./prog-16  ./prog-21  ./prog-01  ./prog-10  ./prog-15  ./prog-05  ./prog-09  ./prog-02
in program 14
Run Code Online (Sandbox Code Playgroud)

Mad*_*ist 5

当你说Solaris时,你的意思是你在使用Solaris make吗?或者您在Solaris上使用GNU make?

你为什么要尝试使用make函数?如果您想要完全可移植,则必须使用shell进行循环:

run: $(PROGS)
        for p in $(PROGS); do ./$$p; done
Run Code Online (Sandbox Code Playgroud)

如果您在Solaris上使用GNU make,则可以使用GNU make模式规则以更"仿制"的方式执行此操作:

run: $(PROGS:%=run-%)

run-%: %
        ./$<

.PHONY: run $(PROGS:%=run-%)
Run Code Online (Sandbox Code Playgroud)