2016-02-17 2 views
0

Приносим извинения, если это несколько нубийский вопрос, я искал какое-то время и не нашел ответа.Правила зависимостей Makefile для множественной компиляции исходного объекта

Я новичок в makefiles и пытаюсь создать тот, который скомпилирует несколько исходных файлов в разных каталогах в объектные файлы в одном каталоге, а затем свяжет их.

Он работает, но он всегда перекомпилирует все файлы, даже если я их не изменил. Насколько мне известно, он должен делать это только в том случае, если зависимости старше целевых. Что я делаю не так?

Вот мой Makefile:

CC = mpic++ 
CCU = nvcc 

ARCH = -arch=sm_52 

SOURCEDIR = ./source 
SOLVERDIR = $(SOURCEDIR)/solvers 
OBJECTDIR = ./bin 

INCLUDE = -I./include -I/home/alexander/.openmpi/include -I/usr/local/cuda-7.5/include 

LIBRARY = -L/usr/local/cuda-7.5/lib64 -lcublas -lcudart 

OUT = cgsolve 

CDEPS = $(OBJECTDIR)/main.o $(OBJECTDIR)/timer.o $(OBJECTDIR)/cgMPIFuncs.o 

compileC: $(CDEPS) 
    $(CC) $(INCLUDE) -c $(SOURCEDIR)/main.cpp -o $(OBJECTDIR)/main.o 
    $(CC) $(INCLUDE) -c $(SOURCEDIR)/timer.cpp -o $(OBJECTDIR)/timer.o 
    $(CC) $(INCLUDE) -c $(SOURCEDIR)/cgMPIFuncs.cpp -o $(OBJECTDIR)/cgMPIFuncs.o 

CUDEPS = $(OBJECTDIR)/BiCGStab.o $(OBJECTDIR)/CG.o $(OBJECTDIR)/solverUtil.o $(OBJECTDIR)/cudaKernels.o 

compileCU: $(CUDEPS) 
    $(CCU) $(ARCH) $(INCLUDE) -c $(SOLVERDIR)/BiCGStab.cu -o $(OBJECTDIR)/BiCGStab.o 
    $(CCU) $(ARCH) $(INCLUDE) -c $(SOLVERDIR)/CG.cu -o $(OBJECTDIR)/CG.o 
    $(CCU) $(ARCH) $(INCLUDE) -c $(SOURCEDIR)/solverUtil.cu -o $(OBJECTDIR)/solverUtil.o 
    $(CCU) $(ARCH) $(INCLUDE) -c $(SOURCEDIR)/cudaKernels.cu -o $(OBJECTDIR)/cudaKernels.o 

OBJDEPS = $(OBJECTDIR)/main.o $(OBJECTDIR)/BiCGStab.o $(OBJECTDIR)/CG.o $(OBJECTDIR)/solverUtil.o $(OBJECTDIR)/cudaKernels.o $(OBJECTDIR)/timer.o $(OBJECTDIR)/cgMPIFuncs.o 

build: 
    $(CC) $(OBJDEPS) $(LIBRARY) -o $(OUT) 

all: compileC compileCU build 

И опять же, жаль, если это повторение или что-то. Я не смог найти предыдущую версию этого вопроса. Спасибо за помощь!

ответ

0

Вместо того, чтобы устанавливать правила явно в целом, попробуйте шаблонное правило, как показано ниже, также лучше добавить OBJDEPS в качестве предварительного условия для цели сборки (тогда нет необходимости в compileC и compileCU, если вы не хотите сохранить эти цели)

compileC: $(CDEPS) 

compileCU: $(CUDEPS) 

build: $(OBJDEPS) 
    $(CC) $^ $(LIBRARY) -o $(OUT) 

$(OBJECTDIR)/%.o : $(SOURCEDIR)/%.cpp 
    $(CC) $(INCLUDE) -c $^ -o [email protected] 

$(OBJECTDIR)/%.o : $(SOLVERDIR)/%.cu 
    $(CCU) $(ARCH) $(INCLUDE) -c $^ -o [email protected] 
+0

Хороший пример, я выяснил, как make-файлы работают из этого. Это было бы намного проще, если бы примеры онлайн были менее загадочными. Большое спасибо! –

Смежные вопросы