LINUX.ORG.RU

Оптимизировать Makefile

 


1

1
di= -I..\..\..\include

all: qquickwebenginehistory.o qquickwebengineloadrequest.o qquickwebenginenavigationrequest.o qquickwebenginenewviewrequest.o qquickwebenginesettings.o qquickwebenginesingleton.o qquickwebengineview.o qtwebengineglobal.o
	ar rvs libQt5WebEngine.a qquickwebenginehistory.o qquickwebengineloadrequest.o qquickwebenginenavigationrequest.o qquickwebenginenewviewrequest.o qquickwebenginesettings.o qquickwebenginesingleton.o qquickwebengineview.o qtwebengineglobal.o

.cpp.o:
	g++ -c -O2 $(di) $< -o $@

Подскажите, как для цели all не перечислять буквально все зависимости, а сделать это кратко подобно ".cpp.o: g++ -c -O2 $(di) $< -o $@"? Т.е. чтобы фактические имена файлов не присутствовали в мэйкфайле.

all: qquickwebenginehistory.o qquickwebengineloadrequest.o qquickwebenginenavigationrequest.o qquickwebenginenewviewrequest.o qquickwebenginesettings.o qquickwebenginesingleton.o qquickwebengineview.o qtwebengineglobal.o
	ar rvs libQt5WebEngine.a $<

anonymous ()
Ответ на: комментарий от anonymous
all: $(patsubst %.cpp,%.o,$(wildcard *.cpp))
	ar rvs libQt5WebEngine.a $^
xaizek ★★★★★ ()

Я для мелких поделок юзаю такой.

CXX      := g++
BIN      := a.out
SRCS     := $(wildcard *.cpp)
OBJS     := $(patsubst %.cpp, %.o, $(SRCS))
DEFS     := ...
CXXFLAGS := ...
LDFLAGS  := ...

.cpp.o:
        $(CXX) $(DEFS) $(CXXFLAGS) -c $< -o $@

$(BIN): $(OBJS)
        $(CXX) $(OBJS) $(LDFLAGS) -o $@

clean:
        rm -f $(BIN) *.o
oh-la-la ()
Последнее исправление: oh-la-la (всего исправлений: 1)
Ответ на: комментарий от xaizek

Спасибо!

А как учесть предварительный moc'ing двух файлов?

di= -I..\..\..\include

#moc_qquickwebengineview_p.cpp: qquickwebengineview_p.h
#	..\..\..\bin\moc.exe $< -o $@ $(di)

#moc_qquickwebengineview_p_p.cpp: qquickwebengineview_p_p.h
#	..\..\..\bin\moc.exe $< -o $@ $(di)

all: $(patsubst %.cpp,%.o,$(wildcard *.cpp))
	ar rvs libQt5WebEngine.a $^

.cpp.o:
	gcc -w -c -O2 $(di) $< -o $@
soldio ()

ну на тебе портянку

# debug or release
MODE :=debug

# c or cpp
LANGUAGE :=c

SOURCE_TOP_DIR  :=.
# source
SOURCE_SUB_DIRS :=
# shared math gfx

BUILD_TOP_DIR :=bin/$(MODE)



SOURCE_EXT :=c
ifeq ($(LANGUAGE),cpp)
SOURCE_EXT :=cpp
endif


OBJECT_EXT :=o


COMPILER   :=$(CC)
ifeq ($(LANGUAGE),cpp)
COMPILER :=$(CXX)
endif

COMPILER_FLAGS :=-pipe
ifeq ($(LANGUAGE),c)
COMPILER_FLAGS += $(CFLAGS) -std=c11
endif
ifeq ($(LANGUAGE),cpp)
COMPILER_FLAGS += $(CXXFLAGS) -std=c++11 -pthread #`sdl-config --cflags`
endif

ifeq ($(MODE),debug)
COMPILER_FLAGS += -Wall -ggdb
else
COMPILER_FLAGS += -O2
endif


LINKER	   :=$(COMPILER)

LINKER_FLAGS   :=-s -L`gcc -print-file-name=`

LIBS           :=
# -lgcc -lc -lm -lpthread #-lGL -lGLU -lGLEW `sdl-config --libs`


SOURCE_DIRS  :=$(addprefix $(SOURCE_TOP_DIR)/, $(SOURCE_SUBDIRS)) $(SOURCE_TOP_DIR)
BUILD_DIRS   :=$(patsubst $(SOURCE_TOP_DIR)%, $(BUILD_TOP_DIR)%, $(SOURCE_DIRS))
SOURCE_FILES :=$(wildcard $(addsuffix /*.$(SOURCE_EXT), $(SOURCE_DIRS)))
OBJECT_FILES :=$(patsubst $(SOURCE_TOP_DIR)%.$(SOURCE_EXT), $(BUILD_TOP_DIR)%.$(OBJECT_EXT), $(SOURCE_FILES))


# example of define, info and eval
# define SOURCE_AND_OBJECT_FILES
# 	SOURCE_FILES := $$(wildcard $$(addsuffix /*.$(SOURCE_EXT), $$(SOURCE_DIRS)))
# 	OBJECT_FILES := $$(patsubst $$(SOURCE_TOP_DIR)%.$(SOURCE_EXT), $$(BUILD_TOP_DIR)%.$(OBJECT_EXT), $$(SOURCE_FILES))
# endef
# $(info $(call SOURCE_AND_OBJECT_FILES))
# $(eval $(call SOURCE_AND_OBJECT_FILES))




$(info [START: $(shell date -R)])

all: main
	@echo "[FINISH: `date -R`]"

main: $(OBJECT_FILES)
	$(info [$(LINKER)] $^ => $@)
	$(LINKER) $(COMPILER_FLAGS) $(LINKER_FLAGS) $^ $(LIBS) -o $(BUILD_TOP_DIR)/$@

$(OBJECT_FILES): | $(BUILD_DIRS)
$(BUILD_DIRS):
	@echo "[mkdir] $@"
	@mkdir -p $@

$(BUILD_TOP_DIR)/%.$(OBJECT_EXT): $(SOURCE_TOP_DIR)/%.$(SOURCE_EXT)
	@echo "[$(COMPILER)] $< -> $@"
	$(COMPILER) $(COMPILER_FLAGS) -c $< -o $@



.PHONY: mkdirs clean showvars rebuild


mkdirs:
	@echo [mkdir] -p $(BUILD_DIRS)
	@mkdir -p $(BUILD_DIRS)

clean:
	@echo cleaning...
	@echo [rm] $(OBJECT_FILES)
	@rm $(OBJECT_FILES)
	@echo [rm] $(BUILD_TOP_DIR)/main
	@rm $(BUILD_TOP_DIR)/main

showvars:
	@echo SOURCE_DIRS : $(SOURCE_DIRS)
	@echo SOURCE_FILES: $(SOURCE_FILES)
	@echo OBJECT_FILES: $(OBJECT_FILES)

rebuild: clean all
Bad_ptr ★★★★ ()
Последнее исправление: Bad_ptr (всего исправлений: 1)
Ответ на: комментарий от soldio

Непонятно почему бы для Qt просто не использовать qmake.

oh-la-la ()
Ответ на: комментарий от soldio

Если _p означает что их надо moc-обрабатывать, то как-то так:

# ...

%_p.cpp: %_p.h
	..\..\..\bin\moc.exe $< -o $@ $(di)

all: $(patsubst %.cpp,%.o,$(wildcard *.cpp)) $(patsubst %.h,%.cpp,$(wilcard *_p.h))
	ar rvs libQt5WebEngine.a $^

# ...

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

Насколько понимаю, moc-ить надо все h-файлы, которые содержат Q_OBJECT. Но в данном случае файл qquickwebengineview.cpp содержит содержит строчки

#include "moc_qquickwebengineview_p.cpp"
#include "moc_qquickwebengineview_p_p.cpp"
поэтому без moc-инга фалов qquickwebengineview_p.h и qquickwebengineview_p_p.h a-либа не собирается.

Пока Вы не ответили я не замечал. Может мне таки надо все соответствующие файлы отmoc-ить? Их в данном каталоге 8, не 2.

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

Пока Вы не ответили я не замечал. Может мне таки надо все соответствующие файлы отmoc-ить? Их в данном каталоге 8, не 2.

Видимо да, я не знаю можно ли просто вызывать moc на всех файлах совсем, чтобы он уже разобрался где есть что ему обрабатывать, а где нету. В целом надо по какому-нибудь признаку делить файлы, чтобы писать для них разные правила (в другой каталог поместить, префикс сделать или grep делать на наличие Q_OBJECT). Может имеет смысл глянуть как qmake это делает, в сгенерированных им Makefile всё же работает.

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

Вот такой Makefile заработал:

di= -I. \
-I.. \
-I..\..\core \
-I..\..\..\include \
-I..\..\..\include\QtQml \
-I..\..\..\include\QtGui \
-I..\..\..\include\QtCore \
-I..\..\..\include\QtQuick \
-I..\..\..\include\QtQuick\5.4.1\QtQuick \
-I..\..\..\include\QtWebEngine\5.4.1\QtWebEngine

all: $(patsubst %.h,moc_%.o,$(wildcard *.h)) $(patsubst %.cpp,%.o,$(wildcard *.cpp))
	ar rvs libQt5WebEngine.a $^

moc_%.o: moc_%.cpp
	g++ -w -c -O2 $(di) $< -o $@

moc_%.cpp: %.h
	..\..\..\bin\moc $< -o $@ $(di)

%.o: %.cpp
	g++ -w -c -O2 $(di) $< -o $@
soldio ()
Ответ на: комментарий от soldio

Причём неожиданно для меня в выводе присутствует такая строчка:

rm moc_qtwebengineglobal_p.cpp moc_qquickwebenginesingleton_p.cpp moc_qtwebengineglobal.cpp moc_qquickwebenginenavigationrequest_p.cpp moc_qquickwebengineview_p.cpp moc_qquickwebenginehistory_p.cpp moc_qquickwebengineview_p_p.cpp moc_qquickwebenginesettings_p.cpp moc_qquickwebenginehistory_p_p.cpp moc_qquickwebenginenewviewrequest_p.cpp moc_qquickwebenginesettings_p_p.cpp moc_qquickwebengineloadrequest_p.cpp
т.е. make сам зачистил то, что посчитал мусором!

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