Кто-нибудь знает об инструменте, который генерирует make-файл путем сканирования каталога на наличие исходных файлов?
Это может быть наивно:
Вы можете написать Makefile
, который сделает это за вас:
SOURCES=$(shell find . -name "*.cpp")
OBJECTS=$(SOURCES:%.cpp=%.o)
TARGET=foo
.PHONY: all
all: $(TARGET)
$(TARGET): $(OBJECTS)
$(LINK.cpp) $^ $(LOADLIBES) $(LDLIBS) -o $@
.PHONY: clean
clean:
rm -f $(TARGET) $(OBJECTS)
Просто поместите это в корневой каталог вашей исходной иерархии и запустите make
(для этого вам понадобится GNU Make).
(Обратите внимание, что я не очень хорошо разбираюсь в Makefile
, поэтому, возможно, это можно сделать проще.)
Существует очень старый скрипт makedepend, который использовался для создания очень простых make-файлов. С тех пор я перешел на cmake почти для всего.
Вот вики-статья http://en.wikipedia.org/wiki/Makedepend, обратите внимание на список альтернатив внизу, включая depcomp в automake и флаг -M в gcc.
РЕДАКТИРОВАТЬ: Как кто-то указал мне в другом вопросе, gcc -MM *.cpp > Makefile
создает довольно хороший простой make-файл. Вам нужно только добавить свои CPPFLAGS и правило для построения всего двоичного файла..., которое примет форму:
CPPFLAGS=-Wall
LDFLAGS=-lm
all: binary_name
binary_name: foo.o bar.o baz.o biff.o
- нет необходимости обнаруживать внешние зависимости
- использовать настройки компилятора/компоновщика по умолчанию
Зачем тогда скрипт? При условии, что все исходные файлы вашего проекта имеют формат *.cpp
и в текущем каталоге:
all: $(notdir $(CURDIR))
$(notdir $(CURDIR)): $(subst .cpp,.o,$(wildcard *.cpp))
$(LINK.cpp) $^ $(LOADLIBES) $(LDLIBS) -o $@
Makefile соберет все исходные файлы с настройками компилятора/компоновщика по умолчанию в исполняемый файл, названный в честь имени текущего каталога.
В противном случае я обычно рекомендую людям попробовать SCons вместо make там, где это намного проще и интуитивно понятно. Добавлен бонус в том, что нет необходимости кодировать вручную чистые
цели, встроена проверка зависимостей источника/заголовка, он изначально рекурсивен и поддерживает соответствующие библиотеки.
CMake делает это и даже создает make-файлы и проекты Visual Studio. http://www.cmake.org/
Все, что вам нужно сделать, это создать файл CMakeLists.txt, содержащий следующие строки:
file(GLOB sources *.h *.c *.cxx *.cpp *.hxx)
add_executable(Foo ${sources})
Затем перейдите в чистый каталог и введите:
cmake /path/to/project/
Это будет создайте make-файлы в этом чистом каталоге сборки.
Это то, что я бы использовал для простого проекта:
CC = $(CXX)
CXXFLAGS += -ansi -pedantic -W -Wall -Werror
CPPFLAGS += -I<Dir Where Boost Lives>
SOURCES = $(wildcard *.cpp)
OBJECTS = $(patsubst %.cpp,%.o,$(SOURCES))
all: myApp
myApp: $(OBJECTS)
Единственное ограничение заключается в том, что если вы создаете исполняемый файл с именем myApp. Тогда один из исходных файлов должен называться myApp.cpp (где я ставлю main).