Неявное правило для каждого имени файла с неопределенным подкаталогом - PullRequest
0 голосов
/ 07 февраля 2019

Это структура каталогов, которую я пытаюсь встроить в свой двоичный файл.

library_name:
    library_module:
        foo.h
        foo.c
    library_module:
        bar.h
        bar.c
        boo.h
        boo.c
    (etc...)

И я пытаюсь создать правило, которое собирает все эти объекты в объекты:

obj:
    foo.o
    bar.o
    boo.o
    (etc...)
LIBRARY_NAME := $(patsubst %.c, %, $(notdir $(wildcard src/library_name/**/*.c)))
# This is a list of all file names with path and extension removed.

$(LIBRARY_NAME:%=obj/%.o): obj/%.o: src/library_name/**/%.c
    $(CC) -c $< $(FLAGS) -o $@

# make: *** No rule to make target 'src/library_name/**/foo.c', needed by 'obj/foo.o'.  Stop.

Я также попробовал следующее:

... $(wildcard src/alabaster/**/$(%).c) ...

Но, похоже, я не могу использовать «%» таким образом.

Возможно, это на самом деле неЧтобы сделать это, я обычно не прикасаюсь к своему make-файлу, если он мне действительно не нужен.

1 Ответ

0 голосов
/ 08 февраля 2019

Вы можете сделать свой подход, но если у вас когда-нибудь будет файл с таким же именем, у вас возникнут проблемы.Лучше сохранить структуру папок для вашего каталога объектов.Я не тестировал make-файл ниже (но я думаю, что его 99%).Но это дает вам представление о том, как вы можете достичь того, чего хотите - обратите внимание, что в двух папках библиотеки есть дубликаты имен для файлов ...

# Get your source list (use wildcard or what ever, but just for clarity you should end up with a list of files with full paths to start with):
SOURCES = \
    lib1/fred.c \
    lib1/bob.c \
    lib1/carl.c \
    lib2/fred.c \
    lib2/bob.c \
    lib2/carl.c \

# Output folders/targets
OBJ_DIR = obj
BIN_DIR = bin
OUTPUT_FILE = output

# Create your objects list in the obj directory
OBJECTS = $(addprefix $(OBJ_DIR)/,$(addsuffix .o,$(basename $(SOURCES))))

# Create list of unique folders to create
DIRS = $(sort $(dir $(OBJECTS))) $(BIN_DIR)

# Create list of include paths
INCS = $(addprefix -I,$(sort $(dir $(SOURCES))))

# Main target rule
bin/$(OUTPUT_FILE): $(DIRS)  $(OBJECTS)
    @echo linker: gcc $(OBJECTS) -o $@
    @touch $@

# Rule to build your object file - ensure that the folders are created first (also create a dummy obj file) - note this works for parallel builds too (make -j
$(OBJ_DIR)/%.o: %.c | $(DIRS)
    @echo compile: gcc $(INCS) -c $? -o $@
    @touch $@

# Create your directories here
$(DIRS):
    @echo Creating dir: $@
    @mkdir -p $@

# Clean if needed
.PHONY: clean
clean:
    rm -rf $(OBJ_DIR) $(BIN_DIR)

Если вы действительно хотите сделать это по-своему,вам нужно будет посмотреть на VPATH, я верю - мне никогда не нравилось делать это таким образом, хотя по той причине, о которой я упоминал ранее, я столкнулся слишком много раз в будущем, чтобы когда-либо захотеть использовать снова!:)

Обновлено только что вернулся домой, проверил это и сделал несколько настроек, чтобы убедиться, что оно работает.

...