Дополнительная цель makefile с добавленной опцией компилятора в qmake

У меня есть несколько проектов Qt с зависимостями друг от друга. Два проекта создают исполняемые файлы с разными целями (а именно, мое основное приложение и модульные тесты) и зависят от одних и тех же библиотек. Эти библиотеки, однако, должны быть скомпилированы с другими настройками компилятора при сборке для моих модульных тестов. Поэтому предположим, что моему приложению нужен набор флагов компилятора, и этот набор флагов должен также использоваться по умолчанию при компиляции библиотек. Моему приложению модульного тестирования нужен другой набор (или просто дополнительный набор) флагов компилятора для библиотек, которые должны быть установлены при их компиляции.

Как я могу написать qmake *.pro файлы, чтобы я мог запустить qmake один раз, а затем использовать полученный make-файл для компиляции библиотек для обоих приложений в отдельных запусках make? Я думал о том, чтобы сделать цели по умолчанию debug а также release с флагами «по умолчанию» и дополнительной целью test строить для моих модульных тестов, но я не могу понять, как это сделать. Я застрял с Qt 4.8.


Немного предыстории: я программирую на C ++ и мне нужно создать несколько фиктивных объектов для классов, определенных в библиотеках. Эти классы, однако, не содержат virtual методы, поэтому я добавил флаг препроцессора, который определяется virtual при компиляции для юнит-тестов и пусто в противном случае. Таким образом, я могу перезаписывать методы в моих фиктивных объектах, но не испытываю издержек при вызовах виртуальных функций в сборках релизов.

1

Решение

Может быть, мое решение работает для вас.
Я создаю свои профильные файлы с помощью make-file (s).
Пример создания программы в дереве моего проекта:
Сначала более простая подгонка make-файла к программе:

SHELL = /bin/bash

BUILD_PATH  := $(shell cd ../../../; pwd)
CONF_PATH   := $(BUILD_PATH)/sources/config
BIN_PATH    := $(BUILD_PATH)/bin
LIB_PATH    := $(BUILD_PATH)/lib
INS_PATH    := /usr/local

MODULES     := core gui widgets printsupport
TARGET      := CCDDataDisplay
TEMPLATE    := app

DEFINES     :=

INCLUDES    := $(BUILD_PATH)/sources/include
LIBS        := -L$(LIB_PATH) -lhrlLib

DESTDIR     := $(BIN_PATH)

MOCS        := MainWindow.h

include $(CONF_PATH)/conf_qmake.mk

conf_qmake.mk:

QMAKE       := qmake-qt5

HEADERS     := $(wildcard *.h)
C_SOURCES   := $(wildcard *.c)
CPP_SOURCES := $(wildcard *.cpp)

SOURCES := $(C_SOURCES)
SOURCES += $(CPP_SOURCES)
FORMS   := $(wildcard *.ui)

.PHONY: all
all: depdirs
@echo  -e  "\n\x1b[32;01m Building \x1b[34;01m$(TARGET)\x1b[32;01m in $(shell pwd) ... \x1b[0m"@if [ ! -d .build ]; \
then \
rm -f qmake.pro; \
cp $(CONF_PATH)/qmake.pro qmake.pro;\
mkdir -p .build; \
cd .build; \
$(QMAKE) -makefile "MODULES_IN=$(MODULES)" \
"TARGET_IN=$(TARGET)" \
"TEMPLATE_IN=$(TEMPLATE)" \
"DEFINES_IN=$(DEFINES)" \
"INCLUDES_IN=$(INCLUDES)" \
"LIBS_IN=$(LIBS)" \
"DESTDIR_IN=$(DESTDIR)" \
"SOURCES_IN=$(SOURCES)" \
"MOCS=$(MOCS)" \
"FORMS_IN=$(FORMS)" \
../qmake.pro >> /dev/null; \
fi;
@$(MAKE) -s -C .build;

.PHONY: depdirs
depdirs:
@$(foreach dir, $(DEPDIRS), $(MAKE) -s -C $(dir);)

.PHONY: install
install:
@$(MAKE) -s -C .build install;

.PHONY: realclean clean distclean
clean:
@if [ -d .build ]; then $(MAKE) -s -C .build clean; fi
@$(RM) *~;
@$(RM) $$(BUILD_PATH)/include/*~;

realclean:
@$(RM) -r .build;
@$(RM) qmake.pro;
@$(RM) *~;
@$(RM) $(BUILD_PATH)/include/*~;

distclean: realclean
@$(RM) $(BUILD_PATH)/bin/$(TARGET);
@$(RM) $(BUILD_PATH)/lib/lib$(TARGET)*;

и последний qmake.pro:

QT  += $$MODULES_IN

TARGET = $$TARGET_IN
TEMPLATE = $$TEMPLATE_IN

CONFIG += staticlib

DEFINES += $$DEFINES_IN

# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
INCLUDEPATH += $$INCLUDES_IN

LIBS += $$LIBS_IN

DESTDIR = $$DESTDIR_IN

SOURCES += $$SOURCES_IN

HEADERS += $$MOCS

FORMS += $$FORMS_IN

unix {
target.path = /usr/local
INSTALLS += target
}

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

Может быть, это помогает …

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector