2014-10-18 2 views
1

Мне нужно создать файл make, который будет запускать несколько (аналогично названных) программ подряд. Он также должен быть портативным, поскольку он будет использоваться как в CentOS, так и в Solaris (не GNU). Раньше я никогда не работал с циклами в make-файле. Вот моя попытка ниже. К сожалению, кажется, что это только первая программа.Разработка портативного цикла 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) 

Вот результат работы 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 

ответ

5

Когда вы говорите, Solaris, вы имеете в виду вы используете Solaris make? Или вы используете GNU make на Solaris?

Почему вы пытаетесь использовать функции make? Если вы хотите быть полностью портативным, вы должны использовать оболочку для зацикливания:

run: $(PROGS) 
     for p in $(PROGS); do ./$$p; done 

Если вы используете GNU сделать на Solaris вы можете использовать GNU сделать шаблонные правила, чтобы сделать это в более «сделать подобные» путь:

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

run-%: % 
     ./$< 

.PHONY: run $(PROGS:%=run-%) 
+0

Я буду использовать Solaris сделать (как часть Hw задания, это не мой выбор) – audiFanatic

+0

Первое решение работает как шарм, спасибо большое! Теперь, почему мой цикл выполнял только первую программу (с GNU make)? – audiFanatic

+0

@audiFanatic: поскольку GNU делает функцию 'foreach', объединяет все строки foreach'd вместе с пространством между ними (а не, скажем, новой линией или точкой с запятой). Таким образом, первая программа получает список других программ в качестве аргументов командной строки. Для выполнения каждой программы вам нужно использовать «foreach» и «shell», но решение «MadScientist» намного лучше. – rici

Смежные вопросы