2013-10-10 14 views
3

У меня есть некоторые C++ классов, каждый в свою собственную папку с Makefile, test.cpp для целей тестирования и т.д.Как включить makefile в другой файл makefile?

Main folder 
|-> Class1 folder 
|-> Class2 folder 
     |-> Class2.1 folder 
|-> Class2 folder 

У меня есть главный проект, который должен включать в себя эти классы. Я пытаюсь включить все подфайлы в основной файл makefile.

Я судимый с «ВКЛЮЧИТЬ Poo/Makefile», но это решение имеет 2 проблемы:

  • Путь суб-Makefiles неверен, так что файлы не найдены ("Там не исключало в построить цель «Vector3D.cpp»).
  • Файл «test.cpp» является перекрытая, вероятно, из-за проблемы пути («Предупреждение: Игнорирование рецепт цели ...»).

Я хотел бы все Makefile независимы, поэтому я могу скопировать/мимо папки класса в новый проект и все еще работает, или я могу выполнить makefile самостоятельно без изменений.

Итак, вопрос: как включить (правильно) makefile в другой файл makefile?

Пример, только для целей тестирования.

Главная Makefile (упрощенный)

include Vector3D/makefile 
include Color/makefile 

CPP  = g++ 
CXXFLAGS = $(CXXINCS) -Wall -O0 

all: main 

main: main.o Vector3D.o Color.o 
    $(CPP) main.o Vector3D.o Color.o -o main 

main.o: main.cpp 
    $(CPP) -c main.cpp -o main.o $(CXXFLAGS) 

Sub-Makefile пример (упрощенный)

#Vector3D 
CPP  = g++ 
CXXFLAGS = $(CXXINCS) -Wall -O0 


all: test 

test: Vector3D.o test.o 
    $(CPP) Vector3D.o test.o -o test 

Vector3D/test.o: test.cpp 
    $(CPP) -c test.cpp -o test.o $(CXXFLAGS) 

Vector3D.o: Vector3D.cpp Vector3D.hpp 
    $(CPP) -c Vector3D.cpp -o Vector3D.o $(CXXFLAGS) 

Похожие на Color/Makefile, чем Vector3D

ответ

4

Я хотел бы все Makefile независимым , поэтому я могу скопировать/пропустить папку класса в новый проект и все еще работать, или я могу выполнить makefi без изменений на нем.

Я уверен, что это невозможно. Ваши make-файлы либо должны быть автономными, и в этом случае вы можете заставить файлы верхнего уровня вызывать make в каталогах нижнего уровня рекурсивно (так что не include их) или у вас может быть один нерекурсивный make-файл, сформированный путем включения других make-файлов , Я не думаю, что можно сделать и то, и другое.

Как включить (правильно) makefile в другой файл makefile?

Единственный допустимый ответ «с помощью include директивы» (кроме обычного «это зависит».) Любые другие советы зависят от структуры Makefiles. Makefiles разработано, который будет включен, очевидно, будет проще включать. Просто включив какой-то случайный make-файл и надеясь, что он будет работать ... не будет работать. Проверьте Implementing non-recursive make и Boilermake, как сделать нерекурсивные make-файлы.

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

+0

Спасибо вам за ответ, я написал ответ с решением я использовал –

0

Благодаря @Jonathan Wakely, чтобы предоставить мне некоторые идеи для этого решения.

Возможно, есть много вещей, которые могут быть улучшены, но это работает.

резюме Requirment:

  • Makefiles должно быть автономным
  • Основной Makefile должен включать суб-мейкфайлы
  • не shouls появляется никаких конфликтов или путем проблемы.

Простое решение заключается в вызове рекурсивно MAKEFILES:

  • Создать «нормальный» сценарий для листьев Makefiles
  • с использованием пустой цели позволяют выполнять всегда совершать вызовы, например «суб- make: «без каких-либо требований после»: «
  • Используйте параметр« -C », чтобы установить корневой каталог для вызова вызова.
  • Создайте окончательную ссылку с двоичными файлами, созданными подфайлами.

Пример главного Makefile:

#all make recursive calls 
sub-make: 
    make -C Vector3D 
    make -C Color 

#final linking 
CPP  = g++ 
FLAGS = $(CXXINCS) -Wall -O0 

all: main 

main: main.o Vector3D/Vector3D.o Color/Color.o 
    $(CPP) main.o Vector3D/Vector3D.o Color/Color.o -o main 

main.o: main.cpp 
    $(CPP) -c main.cpp -o main.o $(FLAGS) 

Существует, вероятно, лучший способ обеспечить * .o исполняемых файлов в линкера без сочинительства все полный путь, но это уже другая проблема.

Создание чистой цели. Для листовых make-файлов не требуется никаких особых соображений, но для основного файла makefile он должен вызывать правила подчистки.

clean: 
    make -C Vector3D clean 
    make -C Color clean 
    rm -f *.o main 

РЕДАКТИРОВАНИЕ:

Вот структура Makefile я сделал, потому что если это может быть полезным для всех.

Для работы Все классы должны находиться в отдельной папке есть с:

  • заголовка .hpp
  • .cpp код
  • каталог main.cpp для тестирования
  • Требуемые классы (LIBS) являются указанный с помощью «$ (LIBSPATH) LibName» в отношении этого make-файла.

Makefile

#Following configuration may be set with a parameter: 
# e.g: make FLAGS="-Wall -O0" 
FLAGS = $(CXXINCS) -Wall -O0 

#Configurable variables 
EXEC  = main 
CLASS = World 
LIBS  = Color Vector3D Triangle 
LIBSPATH = ../ 

#Static content 
CPP  = g++ 
OBJS  = $(foreach dir, $(LIBS), $(LIBSPATH)$(dir)/$(dir)) 

all: $(EXEC) 

clean: 
    rm -f *.o $(EXEC) 
    $(foreach dir,$(LIBS),make clean --no-print-directory -C $(LIBSPATH)$(dir);) 

$(EXEC): $(CLASS).o $(EXEC).o $(OBJS:=.o) 
    $(CPP) $(CLASS).o $(OBJS:=.o) $(EXEC).o -o $(EXEC) 

$(EXEC).o: $(EXEC).cpp 
    $(CPP) -c $(EXEC).cpp -o $(EXEC).o $(CXXFLAGS) 

$(CLASS).o: $(CLASS).cpp $(CLASS).hpp 
    $(CPP) -c $(CLASS).cpp -o $(CLASS).o $(CXXFLAGS) 

$(OBJS:=.o): $(OBJS:=.cpp) $(OBJS:=.hpp) 
    make --no-print-directory -C $(LIBSPATH)$(strip $(foreach dir,$(LIBS),$(if $(findstring $(dir),[email protected]),$(dir)))) 
Смежные вопросы