Давайте рассмотрим это небольшими шагами.
У вас уже есть правило для создания объектных файлов:
.c.o:
$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
, которое можно записать как:
%.o: %.c
$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
Это будет использовать ../LwMesh/phy/at86rf212/src/phy.c
для построения ../LwMesh/phy/at86rf212/src/phy.c
.Но представьте на мгновение, что phy.c
были в рабочем каталоге.Тогда Make может использовать это правило для сборки phy.o
из phy.c
.В этом случае мы могли бы сделать небольшое изменение в правиле:
$(OBJDIR)/%.o: %.c
$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
и Make построит obj/phy.o
.
Как мы скажем Make, где найти phy.c
?Есть два хороших способа.Один из них использует vpath :
vpath %.c ../LwMesh/phy/at86rf212/src
После того, как мы подтвердим, что это работает, мы можем добавить другие каталоги для других наборов объектов (например, PHY
и SYS
):
vpath %.c ../LwMesh/phy/at86rf212/src ../LwMesh/hal/atmega1281/src ../LwMesh/sys/src ...
Теперь все, что нам нужно сделать, это правильно составить списки объектов:
PHY_OBJS = phy.o
HAL_OBJS = hal.o halPhy.o halTimer.o
SYS_OBJS = sys.o sysEncrypt.o sysTimer.o
...
Как только все это будет работать правильно, возможны дальнейшие уточнения.