Я пытаюсь создать универсальный make-файл для своих лабораторных задач.Есть пять задач, и каждая требует отдельного файла C, скомпилированного и запущенного.Поскольку я должен включить некоторые дополнительные библиотеки при использовании gcc, я хотел бы просто набрать make ZAD=first second
и скомпилировать first.c и second.c.Проблема в том, что я не знаю, как правильно перебирать список ZAD
в make-файле.Я могу разделить задачи в цикле for
, но не могу принудительно ввести символ новой строки в этом цикле.Этот пример объяснит лучше (ниже мой make-файл):
ZAD = first second
main: $(foreach dir, $(ZAD), $(dir).o)
$(foreach dir, $(ZAD), gcc $(dir).o -lgsl -lgslcblas -lm -o $(dir))
$(foreach dir, $(ZAD), rm $(dir).o)
first.o: first.c
gcc -Wall -c first.c
second.o: second.c
gcc -Wall -c second.c
Вот что я получаю, когда, например, пытаюсь скомпилировать только second.c:
wojtasskorcz@wojtek-laptop:~/mownit/lab1dom$ make ZAD=second
gcc -Wall -c second.c
gcc second.o -lgsl -lgslcblas -lm -o second
rm second.o
И все хорошо, но когда я пытаюсь скомпилировать first.c и second.c за один раз, вот что происходит:
wojtasskorcz@wojtek-laptop:~/mownit/lab1dom$ make ZAD='first second'
gcc first.o -lgsl -lgslcblas -lm -o first gcc second.o -lgsl -lgslcblas -lm -o second
gcc: error: gcc: No such file or directory
make: *** [main] Error 1
Я пришел к выводу, что это потому, что во втором foreach
в makefile нет новой строкиперсонаж.Но я понятия не имею, как вставить его туда.Или, может быть, есть другой подход к этой проблеме?
РЕДАКТИРОВАТЬ:
Проблема решена с помощью бета-версии, хотя я нашел еще один способ здесь
Итак, мой отредактированный make-файлвыглядит так:
define \n
endef
ZAD = first second
main: $(foreach dir, $(ZAD), $(dir).o)
$(foreach dir, $(ZAD), gcc $(dir).o -lgsl -lgslcblas -lm -o $(dir)${\n})
$(foreach dir, $(ZAD), rm $(dir).o${\n})
%.o: %c
gcc -Wall -c %.c
Теперь все работает так, как задумано.И еще раз спасибо Бета за ваш ответ.