У меня проблема с make-файлом, который мне не удалось устранить.
У меня есть такая структура файлов и папок.
├───bin
├───include
│ des.hh
│ des_CR.hh
│ des_CX.hh
│ des_JAK.hh
│ des_JK.hh
│ des_testbench.hh
│ des_VA1.hh
│
├───obj
└───src
des.cc
des_CR.cc
des_CX.cc
des_JAK.cc
des_JK.cc
des_testbench.cc
des_VA1.cc
main_des.cc
Я пишу make-файл таким образом (здесь я помещаю небольшую часть):
DESIGN_NAME=des
FULL_NAME=$(basename $(shell find ./src -name $(DESIGN_NAME)'_[A-Z]*.cc' -type f -printf "%f\t"))
EXECUTABLE=bin/$(DESIGN_NAME).x
SYSTEMC=$$SYSTEMC_HOME
LIBDIR = $(SYSC_LIBDIR)
LIBS = $(SYSC_LIBDIR)/libsystemc.a -lpthread
INCDIR = -I./include/ -I. -I$(SYSTEMC)/include/
CXX=g++
CFLAGS= -c
$(EXECUTABLE): obj/main_$(DESIGN_NAME).o obj/$(DESIGN_NAME)_testbench.o obj/$(FULL_NAME).o obj/$(DESIGN_NAME).o
@echo Building $@
$(CXX) -g $(INCDIR) -o $@ $^ $(LIBDIR)/libsystemc.a -lpthread
obj/main_$(DESIGN_NAME).o: src/main_$(DESIGN_NAME).cc
@echo Building $@
$(CXX) -g $(CFLAGS) $(INCDIR) -o $@ $<
obj/$(DESIGN_NAME)_testbench.o: src/$(DESIGN_NAME)_testbench.cc include/$(DESIGN_NAME)_testbench.hh
@echo Building $@
$(CXX) -g $(CFLAGS) $(INCDIR) -o $@ $<
obj/$(FULL_NAME).o: src/$(FULL_NAME).cc include/$(FULL_NAME).hh
@echo Building $@
$(CXX) -g $(CFLAGS) $(INCDIR) -o $@ $<
obj/$(DESIGN_NAME).o: src/$(DESIGN_NAME).cc include/$(DESIGN_NAME).hh
@echo Building $@
$(CXX) -g $(CFLAGS) $(INCDIR) -o $@ $<
Переменная FULL_NAME используется для получения списка всех файлов, которые начинаются с «des_», и их компиляции.
Все работает, за исключением того факта, что когда FULL_NAME содержит больше имен файлов, как это будет, он говорит это:
g++ src/des_CX.cc -o src/des_CX
src/des_CX.cc:1:29: fatal error: des_CX.hh: No such file or directory
compilation terminated.
<builtin>: recipe for target 'src/des_CX' failed
make: *** [src/des_CX] Error 1
Каждый файл cc имеет директиву включения, подобную этой (очевидно, с соответствующим правильным именем):
#include "des_CX.hh"
Я повторяю, это работает, если FULL_NAME имеет только одно имя, как и другая переменная, если она имеет более одного, возвращает ошибку.
Есть предложения? Может быть, кто-то знает лучший способ получить имена файлов, это попытка, которую я сделал, но я не уверен, что это правильно, возможно, ошибка здесь. Заранее благодарю и извините за длинное сообщение.