Запутался, как включить / скомпилировать зависимость в make-файле - PullRequest
0 голосов
/ 19 января 2019

У меня есть программа с этой иерархией:

-| base folder
- - main.c
- - Makefile
- -| motor control
- - - controller.c
- - - controller.h
- -| Build-Assets
- - - Makefile.Release

Суть в том, чтобы очистить main.c.

В controller.c Я в основном добавляю еще один уровень абстракции для обработки возможных ошибок и скрытия всей логики, которая обрабатывает движение прямо и т. Д.

Мне интересно, как я мог бы написать make-файл, чтобы сначала скомпилировать управление двигателем, а затем скомпилировать main.c.

Это код, который я использую (и я, честно говоря, не очень хорошо понимаю второй, я взял его со страницы «Начало работы» над проектом, над которым я работаю)

Makefile

MAKEFILE_BASE = ./Build-Assets/Makefile

.PHONY: default clean release release-clean

default: release

clean: release-clean

release:
    $(MAKE) -f $(MAKEFILE_BASE).Release

release-clean:
    $(MAKE) -f $(MAKEFILE_BASE).Release clean

Makefile.Release

TARGET = $(notdir $(shell pwd))

LIBS = -lm -lev3dev-c
D_BIN = Build-Assets

ifeq ($(OS),Windows_NT)
LIBS := $(LIBS) -lws2_32
D_BIN := $(D_BIN)/mingw
endif

D_H = ../../source/ev3
CFLAGS = $(addprefix -I, $(D_H)) -O2 -std=gnu99 -W -Wall -Wno-comment

ifeq ($(OS),Windows_NT)
CC = gcc
else
CC = arm-linux-gnueabi-gcc
endif

ifeq ($(OS),Windows_NT)
E_BIN = .exe
else
E_BIN =
endif

F_BIN = $(TARGET)$(E_BIN)

OBJECTS = $(addprefix $(D_BIN)/, $(patsubst %.c, %.o, $(wildcard *.c)))

.PHONY: default all clean

default: $(F_BIN)
all: default

$(OBJECTS): $(D_BIN)/%.o: %.c
    $(CC) $(CFLAGS) -c $< -o $@

.PRECIOUS: $(F_BIN) $(OBJECTS)

$(F_BIN): $(OBJECTS)
    $(CC) $(OBJECTS) -Wall $(LIBS) -o $@

clean:
    -rm -f $(D_BIN)/*.o
    -rm -f $(F_BIN)

1 Ответ

0 голосов
/ 19 января 2019

Вот как можно изменить Makefile.

Эта строка определяет, какие файлы .o создаются:

OBJECTS = $(addprefix $(D_BIN)/, $(patsubst %.c, %.o, $(wildcard *.c)))

Часть $(wildcard *.c) соответствует всем файлам .c в каталоге верхнего уровня. Это не будет соответствовать файлам .c в любом другом каталоге.

Измените это на:

OBJECTS = $(addprefix $(D_BIN)/, $(patsubst %.c, %.o, $(wildcard *.c motor/*.c)))

(motor должно быть именем вашего подкаталога контроллера мотора.)

Обратите внимание, что если у вас есть motor/controller.c, Makefile попытается собрать его и поместить в Build-Assets/motor/controller.o. Чтобы это работало, каталог Build-Assets/motor должен уже существует .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...