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

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

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


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


person sigy    schedule 02.02.2017    source источник


Ответы (1)


Может быть, мое решение работает для вас. Я создаю свои про-файлы переадресации с помощью make-файлов. Пример создания программы в моем дереве проектов: Сначала более простой 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-файла в верхней части дерева проекта.

Может это поможет...

person Vetinari    schedule 12.02.2017