Простая утилита генерации makefile?

кто-нибудь знает инструмент, который генерирует makefile путем сканирования каталога для исходных файлов?

Это может быть наивный:

  • нет необходимости обнаруживать внешние зависимости
  • использовать настройки компилятора/компоновщика по умолчанию

6 ответов


вы можете написать 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 для этого, чтобы работать).

(обратите внимание, что я не бегло Makefileish поэтому, возможно, это можно сделать проще.)


CMake делает это, и он даже создает makefiles и проекты Visual Studio. http://www.cmake.org/

все, что вам нужно сделать, это создать CMakeLists.txt-файл, содержащий следующие строки:

file(GLOB sources *.h *.c *.cxx *.cpp *.hxx)
add_executable(Foo ${sources})

затем перейдите в чистый каталог и введите:

cmake /path/to/project/

это создаст файлы Makefile в этом чистом каталоге сборки.


Это то, что я бы использовал для простого проекта:

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).


есть очень старый скрипт под названием "makedepend", который использовал для создания очень простых файлов Makefile. С тех пор я переключился на cmake почти для всего.

вот статья wiki http://en.wikipedia.org/wiki/Makedepend, Обратите внимание на список альтернатив внизу, включая depcomp в automake и флаг-M в gcc.

EDIT: как кто-то указал мне в другом вопросе, gcc -MM *.cpp > Makefile создает довольно приятный простой файл makefile. У вас только начало ваши 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 вместо того, чтобы делать, где это намного проще и интуитивно понятно. Добавлен бонус, что нет необходимости кодировать вручную clean цели, проверка зависимостей источника / заголовка встроена, она изначально рекурсивна и поддерживает правильные библиотеки.


Как описано в связанном обсуждение, HWUT-это инструмент, который может генерировать довольно Makefiles, искать зависимости и включать файлы в каталоги, которые вы говорите. В windows необходимо установить MinGW и Ctags. Под Linux gcc и ctags, скорее всего, присутствуют. Это OpenSource и свободно использовать.

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