Как скомпилировать разные файлы, сохранив их имена в переменной в makefile - PullRequest
0 голосов
/ 30 мая 2019

У меня проблема с 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 имеет только одно имя, как и другая переменная, если она имеет более одного, возвращает ошибку.

Есть предложения? Может быть, кто-то знает лучший способ получить имена файлов, это попытка, которую я сделал, но я не уверен, что это правильно, возможно, ошибка здесь. Заранее благодарю и извините за длинное сообщение.

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