LINUX.ORG.RU

makefile дефолтный

 


0

1

Я знаю что существует дефолтный makefile, нужна инкрементная компиляция, проект разбит на папки с исходинками *.h, *.cpp - ничего сложного, очень нужно все автоматизировать. Гуглил, но в основном трэш находил. Если у кого есть, поделитесь плиз. Пытался сам написать, но как то все коряво.

инкрементная компиляция

Это что именно имеется ввиду?

Могу свой «дефолтный» скинуть, щас только специфику выкину.

arturpub ★★ ()
Ответ на: комментарий от arturpub
AOUT = a.out
SRCS = main.c
OBJS = $(SRCS:.c=.o)

ALLFLAGS = -g -Wall -fno-caret-diagnostics -fno-color-diagnostics -fno-diagnostics-show-option
CFLAGS = -std=gnu99 $(ALLFLAGS)
CPPFLAGS += -I/usr/local/include
LDFLAGS += -L/usr/local/lib
LDLIBS += -lm -lsqlite3 # etc

.PHONY: all build clean depend tags run debug

all: $(AOUT)

$(AOUT): $(OBJS)
	$(LINK.o) -o $@ $^ $(LDLIBS)

build: clean depend all

clean:
	$(RM) $(AOUT) $(OBJS) .depend tags
	$(RM) -r $(AOUT).dSYM

depend:
	$(CC) -MM $(CPPFLAGS) $(SRCS) > .depend

tags:
	exctags -R --c-kinds=+p .

run: all
	./$(AOUT)

debug: all
	lldb ./$(AOUT)

-include .depend

В общем-то тоже на основе треша из гугла, ничего особенного.

arturpub ★★ ()
Ответ на: комментарий от arturpub

При редактировании компиляция измененного файла и его зависимостей, а не всех = зависимости от инклюдов.

doubleGGFiltyFrannk ()
Ответ на: комментарий от doubleGGFiltyFrannk

зависимости от инклюдов

Видел какие-то решения, чтобы автоматом рулить .depend прямо в all, но это имхо оверкилл, проще при новых #include не забывать make depend. И еще, для .cpp нужно CXXFLAGS вместо CFLAGS.

arturpub ★★ ()
Ответ на: комментарий от doubleGGFiltyFrannk

Да, а чо. Обычно сразу видно, если забыл, implicit definition / undefined reference же. Подожди, сейчас может для к-н CMake универсал скинут.

arturpub ★★ ()
Ответ на: комментарий от doubleGGFiltyFrannk

Инклюды находятся обходом SRCS (см. depend), а сорцы только руками.

Мало ли чо там в папках временного валяется, не все же собирать.

arturpub ★★ ()
Последнее исправление: arturpub (всего исправлений: 1)

лучше изучи Automake, он тебе дефолтный мейкфайл сделает

Harald ★★★★★ ()
Ответ на: комментарий от arturpub

А если воспользоваться bmake, это будет выглядеть примерно так:

PROG=progname
SRCS=prog.c foo.c bar.c
NOMAN=
.include <bsd.prog.mk>

beastie ★★★★★ ()

Как-то я подотстал от моды. Скажите, а cmake нынче принято хвалить или ругать?

makoven ★★★★★ ()
Ответ на: комментарий от makoven

Да вроде это сейчас практически стандарт для новых крестопроектов.

vazgen05 ★★ ()
Ответ на: комментарий от beastie

Неправда, из моего это уберет лишь несколько строк. Но кому-то может и понравится. Сидя на бсде я тоже его юзал, и как по мне, так он удобнее gmake'а в плане конструкций.

arturpub ★★ ()

Just use cmake, bro!!!

anonymous ()

У меня использовался такой (сейчас make почти не пользуюсь, в основном qmake):


prog_name := kdk
DATE = `date +%y_%m_%d`

all: $(prog_name)

src_dirs := . base diag prot stat print fltk net dspg ping

##CC := g++34
CC := g++
compile_flags := -g -O2 -Wall -funsigned-char -fno-exceptions -DOBMENKDK_KDK
compile_flags += `fltk-config --cxxflags`
compile_flags += -Iini

link_flags := `fltk-config --ldflags`

mylibs := -lz -lsqlite3
mylibs += ini/libiniparser.a
mylibs += /usr/lib/libptypes.a /usr/local/lib/libspread.a
#mylibs += -lrlog
mylibs += ping/libping.a

src_mask := $(addsuffix /*.cc, $(src_dirs))
src_files := $(wildcard $(src_mask))

obj_files := $(notdir $(src_files))
obj_files := $(obj_files:.cc=.o)
#obj_files := $(addprefix obj/, $(obj_files))

VPATH := $(src_dirs):obj
vpath %.o ./obj
vpath %.d ./obj

ping/libping.a:
	make -C ../libping
	cp ../libping/lib/.libs/libping.a ping/
	cp ../libping/include/ping.h ping/

ini/libiniparser.a:
	make -C ini

##.PHONY: link_time.cc
link_time.cc:
	echo "// Link timestamp" > link_time.cc
	echo "char *LinkTime = \"" >> link_time.cc
	date +%d.%m.%Y >> link_time.cc
	echo " \";" >> link_time.cc

$(prog_name):	ping/libping.a ini/libiniparser.a $(obj_files)
	@echo "======================="
	@echo "Linking object files..."
	$(CC) $^ -o $@ $(mylibs) $(link_flags)
	@echo "======================="
	@cp $@ ..
	@cp $@ /kdk/$@-$(DATE)

compile_flags += $(addprefix -I, $(src_dirs))
err_log := Err-log

.cc.o:
	@echo "Compiling '$^'..."
	@$(CC) -c -pipe $(compile_flags) -o obj/$@ -MMD $< 2>&1 | tee -a $(err_log)

include $(wildcard *.d)

clean:
	@echo "======================="
	@echo "Removing object and backup files..."
	@for d in $(src_dirs); do \
	    (echo $$d; cd $$d; rm -f *.d *.o *.c~ *.h~ *.cc~); \
	done
	@rm -f obj/*.d obj/*.o
	@rm -f $(err_log) $(prog_name)
	@make -C ini clean
	@make -C ../libping clean
	@rm -f ping/libping.a ping/ping.h
	@echo "Done!"

sigurd ★★★ ()
Ответ на: комментарий от beastie

Да-да-да, а потом ему ещё тонну мусора передать надо чтобы он нормально поставился - все пути относительно PREFIX и DESTDIR, права и т.д. То-то FreeBSD'шники хаками эту дрянь обкладывают или выпиливают из портов вовсе.

slovazap ★★★★★ ()

А дефолтный мейкфайл я накидал бы примерно такой. Тут учтены основные ошибки, нет ничего лишнего и он работает как с GNU make так и с BSD вариантами (fmake, bmake).

# Всегда с ?=, чтобы можно было переопределить через окружение
CXX?=       g++

# Аналогично, всегда с ?= - здесь указываются флаги которыми
# можно настраивать сборку - например, оптимизации и дебаг. В
# общем случае они полностью задаются пользователем, вы 
# указываете умолчальные
CXXFLAGS?=  -O2 -g

# А здесь добавляются неопциональные флаги, которые нужны для
# проекта всегда (варнинги, стандарт)
CXXFLAGS+=  -Wall -Wextra -pedantic -Werror=return-type -std=c++11

# Если нужны сторонние библиотеки. Никаких захардкоженных
# явных путей (типа -I/usr/local/include) - они всегда
# системно-специфичны. Если для зависимости нет pkg-config, 
# лучше сразу возьмите CMake.
# Также не забываем += чтобы уважать заданное пользователем
# в окружении
CPPFLAGS+=  `pkg-config --cflags libcurl`
LDFLAGS+=   `pkg-config --libs libcurl`

# Установка
PREFIX?=    /usr/local
DESTDIR?=   # empty

# Собственно программа и исходники
PROG=       foo
SRCS=       main.c
OBJS=       ${SRCS:.c=.o}

# Цель по умолчанию
all: ${PROG}

${PROG}: ${OBJS}
    ${CXX} ${LDFLAGS} -o ${PROG} ${OBJS}

.cpp.o:
    ${CXX} ${CXXFLAGS} ${CPPFLAGS} -c -o $@ $<

install: ${PROG}
# не забываем DESTDIR!
    install -m 555 ${PROG} ${DESTDIR}${PREFIX}/bin

uninstall:
# пожалуйста, не надо. По той же причине по которой deinstall
# не поддерживается cmake'ом. В частности, нет никаких гарантий
# что вы запустите deinstall от той же ревизии проекта, из
# которой его поставили, и он удалится не целиком (в лучшем
# случае)

clean:
    rm -f *.o ${PROG}

# Если нужно вызвать дочерний make, всегда вызываем его
# через ${MAKE}
docs:
    cd ${DOCS} && ${MAKE}

Добавлю что для сохранения совместимости с GNU/BSD make почти ничего сверх перечисленного использовать нельзя (в частности, условия и циклы, модификаторы переменных и т.д.). Если нужно, опять таки лучше сразу взять CMake

slovazap ★★★★★ ()
Последнее исправление: slovazap (всего исправлений: 4)
Ответ на: комментарий от Deleted

То есть не будет рекурсивно искать в подкаталогах.

Deleted ()
Ответ на: комментарий от anonymous

А разве cmake может без рутинного кода такое сделать? PS: Спасибо всем кто ответили, буду разбираться.

doubleGGFiltyFrannk ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.