2010-08-26 4 views
7

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

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

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

ответ

8

Вы можете написать Makefile, что делает это для вас:

SOURCES=$(shell find . -name "*.cpp") 
OBJECTS=$(SOURCES:%.cpp=%.o) 
TARGET=foo 

.PHONY: all 
all: $(TARGET) 

$(TARGET): $(OBJECTS) 
     $(LINK.cpp) $^ $(LOADLIBES) $(LDLIBS) -o [email protected] 

.PHONY: clean 
clean: 
     rm -f $(TARGET) $(OBJECTS) 

Просто поместите это в корневой директории вашей исходной иерархии и запустить make (вам потребуется GNU Make для этой работы).

(Обратите внимание, что я не владеет Makefile МОГ поэтому, возможно, это может быть сделано проще.)

+2

Также make имеет функцию подстановки для поиска файлов. –

+1

+1 Почему бы не использовать стандартные имена для вещей. И стандартные правила будут работать для цели, не нужно делать ничего особенного. –

+0

@Martin: Я пытался использовать неявное правило для цели, но не получилось. Это кажется возможным только в том случае, если один из исходных файлов называется '$ (TARGET) .cpp'. Что вы имеете в виду под «стандартными именами для вещей»? – Job

3

Там очень старый сценарий под названием «makedepend», который используется, чтобы сделать очень простые make-файлы. С тех пор я перешел на cmake почти на все.

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

EDIT: Как кто-то указал мне на другой вопрос, gcc -MM *.cpp > Makefile создает довольно красивый простой make-файл. У вас есть только предварять свои CPPFLAGS и правила для построения всех бинарного ... который будет принимать форму:

CPPFLAGS=-Wall 
LDFLAGS=-lm 
all: binary_name 
binary_name: foo.o bar.o baz.o biff.o 
+0

Как это делает то, что хочет OP? AFAIK, 'makedepend' просто генерирует зависимости, а не правила для сборки файлов. – Job

+0

В версии makedepend я играл с фактически созданным функциональным make-файлом. – jkerian

+0

99% времени, неявные правила будут обрабатывать все, кроме финального двоичного кода. – jkerian

7

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

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

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

Затем перейдите в чистую каталог и введите:

cmake /path/to/project/ 

Это создаст MAKEFILES на этот чистый каталог сборки.

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

Почему сценарий тогда? При условии, что все исходные файлы проекта являются *.cpp и в текущем каталоге:

all: $(notdir $(CURDIR)) 
$(notdir $(CURDIR)): $(subst .cpp,.o,$(wildcard *.cpp)) 
     $(LINK.cpp) $^ $(LOADLIBES) $(LDLIBS) -o [email protected] 

Makefile, будет строить все исходные файлы с настройками по умолчанию компилятор/компоновщик в исполняемый файл с именем после того, как имя текущего каталога.

В противном случае я рекомендую людям попробовать SCons вместо того, чтобы сделать там, где он намного проще и интуитивно.Добавлен бонус, что нет необходимости вводить код вручную clean целей, проверка зависимостей источника/заголовка встроена, она носит рекурсивный характер и поддерживает соответствующие библиотеки.

5

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

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

+0

+1 Начиная с простого шаблона makefile - неплохая идея IMO. Я не знаю, почему вы решили это сделать. – StackedCrooked

+0

Для GNU, по крайней мере, функция $ (wildcard) не $ (подстановочные знаки) –

0

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

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

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