2016-09-21 3 views
0

моя проблема заключается в следующем: я хочу создать make-файл, который будет компилировать программы в нескольких каталогах, но поместит исполняемые файлы в подкаталог с именем исполняемые файлы в каждом из каталогов. У меня есть огромное количество программ для компиляции, поэтому писать правила для каждого из них кажутся утомительными. Предполагая, что мой текущий рабочий каталог Curr_dir Ниже приводится каталог корпусногоСкомпилируйте несколько программ в подкаталогах каталога и поместите исполняемые файлы в разные каталоги с помощью makefile

Curr_dir 
    | 
    |__dir1 
    | |__q1.c 
    | |__q2.c 
    | |__q3.c 
    | |__+executable 
    | 
    |__dir2 
    | |__q4.c 
    | |__q5.c 
    | |__q6.c 
    | |__+executable 
    | 
    |__Makefile 

Я перечислил вниз только 2 каталогов в моем корневом каталоге, но есть несколько каталогов, содержащих 3-4 .c файлы. Теперь я хочу скомпилировать все эти файлы .c с помощью Makefile в моем корневом каталоге и поместить исполняемые файлы в соответствующие исполняемые файлы. Вот мой make-файл, который компилирует каждую из программ и генерирует исполняемый файл в том же каталоге.

CC= gcc 
RM= rm -vrf 
CFLAGS= -lm -g 
SRCFILES =$(wildcard */*.c) 
SRCDIRS= $(wildcard */) 
EXECDIRS= $(SRCDIRS:%=%executables) 
EXECFILES = $(SRCFILES:%.c=%) 
dirs: 
    mkdir -p $(EXECDIRS) 

all: dirs $(EXECFILES) 

%: %.c 
    -$(CC) -o [email protected] $< $(CFLAGS) 

.PHONY: clean 
clean: 
    $(RM) $(EXECFILES) $(EXECDIRS) 

Любая помощь будет принята с благодарностью.

+0

наклоняет вы компилировать полный путь к каждому файлу, а затем использовать мв – proton

+0

@proton: Я мог бы сделать-й но с текущим makefile, который у меня есть, я не могу думать, как это можно добиться. Я редактировал вопрос с моим кодом makefile. Пожалуйста, взгляните на это. – yabhishek

+0

Очень просто иметь несколько исходных каталогов, просто поместите их в переменную 'VPATH', затем' make' будет искать источники в этих папках. Сложность заключается в размещении выходных файлов в нескольких каталогах. См. [GNU make documentation about VPATH] (https://www.gnu.org/software/make/manual/html_node/General-Search.html) – Tim

ответ

1

У вас есть две проблемы: создание списка файлов, которые вы хотите построить, и создание правила или набора правил для их создания. Как бы то ни было, обе проблемы затрудняются из-за отсутствия хорошей обработки шаблонов.

Первая часть:

SRCFILES := $(wildcard */*.c) 

EXECFILES := $(join $(addsuffix executables/,$(dir $(SRCFILES))), $(basename $(notdir $(SRCFILES)))) 

сырой, но эффективно.

Вторая часть требует связывания целевого имени (dir1/executables/q1) с именем соответствующим источника (dir1/q1.c) Возможно, наименее ужасным способом сделать это с правилом шаблона, который использует SECONDEXPANSION манипулировать целевое. Имя:

.SECONDEXPANSION: 
$(EXECFILES): $$(addsuffix .c,$$(subst executables/,,[email protected])) 
    @echo building [email protected] from $< 
    -$(CC) -o [email protected] $< $(CFLAGS) 

Там какие-то споры о лучшем способе для создания каталогов, но мне нравится этот подход:

.SECONDEXPANSION: 
$(EXECFILES): $$(addsuffix .c,$$(subst executables/,,[email protected])) $$(dir [email protected]) 
    @echo building [email protected] from $< 
    -$(CC) -o [email protected] $< $(CFLAGS) 

%/executables: 
    mkdir -p [email protected] 
+0

Раньше я использовал подстановку подстановки шаблонов, чтобы получить путь к исполняемым файлам: '' EXECFILES = $ (patsubst%/* c, $ (join $ (join%, executables), $ (basename $ (notdir%))), $ (SRCFILES)) '' и получал содержимое $ (SRCFILES) каждый раз. Я искал альтернативы, но не смог найти ответа. Еще раз спасибо !! – yabhishek

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