Russian Qt Forum
Ноябрь 27, 2024, 07:19 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите создать корректный pro файл для сборки проектов unix/win(debug|release)  (Прочитано 6863 раз)
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« : Октябрь 09, 2013, 12:03 »

Привет. Нужно собирать проект под виндой и убунтой, причем релиз и отладочный вариант раскидывать по разным папкам.

Код:
QT  += xml network multimedia widgets

unix {
    VERSION += $$system(svnversion)
    LIBS += -L/home/user/builds/scada_current/lib -lrailcore -lraillogic -lsound
    DESTDIR = "/home/user/builds/scada_new/bin"
}

win32 {
    VERSION += $$system(svnversion)
    LIBS += -lrailcore -lraillogic -lsound

    debug_and_release:build_pass {
        CONFIG(debug, debug|release) {
            DESTDIR += D:\scada_new_debug\
            LIBS += -L"D:\scada_new_debug"
            TARGET = scada
        } else {
            DESTDIR += D:\scada_new_release\
            LIBS += -L"D:\scada_new_release"
            TARGET = scada
        }
    }
}


Ругается: Makefile.Debug:97: *** multiple target patterns.  Stop.

Делал все согласно примеров в инете, не получается и все.
Сейчас закидают шапками про абсолютные пути в pro файле, но скажем так, мне нужно результаты сборки (объектники и прочее) хранить вне исходников, так как они под svn находятся.
Всякий шлак будет добавляться и т.п. У меня для сборок есть своя папка builds где все объектники собираются. А так же есть результирующая папка scada_new(debug|release) куда складируются собранные либы и экзешники.
Так вот надо что бы при сборке дебага, все результаты шли в debug папку, при сборке релиза в release.



При сборке плагина с конфигурацией
Код:
win32 {
    LIBS += -lrailcore -lraillogic -lsound
    CONFIG(debug)
    {
        DLLDESTDIR += D:\scada_new_debug\extensions\logic
        LIBS += -L"D:\scada_new_debug"
    }
    CONFIG(release)
    {
        DLLDESTDIR += D:\scada_new_release\extensions\logic
        LIBS += -L"D:\scada_new_release"
    }
}
не ругается и собирается как надо.
« Последнее редактирование: Октябрь 09, 2013, 12:04 от Fregloin » Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #1 : Октябрь 09, 2013, 12:18 »

Разобрался, в DESTDIR += D:\scada_new_debug\ нужно было убрать последний слеш ...

Теперь вопрос такой. Как по умному сделать:

Есть у меня группа проектов (библиотеки, плагины и сама программа которая с этим работает). Эх проектов порядка 30 штук.
Такая структура сейчас:

program_root
program.exe(bin/program в убунту)
библиотеки dll(lib/библиотеки)
plugins (плагины)
extensions //тут лежат dll раскиданые по их предназначению
  actions
  logic
  ...
  viewvs

Нужно как то организовать сборку под виндой и никсами, причем предусмотреть что проект может собираться на нескольких разных машинах.

Хочется что бы объектники и прочий результат сборки не был в исходниках, а в идеале вообще был где то в отдельной папке.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #2 : Октябрь 09, 2013, 14:27 »

Используй теневую сборку, тогда каталог исходников вообще не засоряется.
Записан

Юра.
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #3 : Октябрь 09, 2013, 15:11 »

Вот выдержка из моего проекта
Код:
UI_DIR         = build
RCC_DIR        = build

CONFIG(debug, debug|release) {
    TARGET = tabletGUI_d
    CONFIG += console
    OBJECTS_DIR = build/debug
    MOC_DIR     = build/debug
}
else {
    TARGET = tabletGUI
    CONFIG += console
    OBJECTS_DIR = build/release
    MOC_DIR     = build/release
}
build (build/release, build/debug)  - это имя директории сборки. Но можно и так ../build - и все артефакты вне дерева исходников.
Записан
lesav
Частый гость
***
Offline Offline

Сообщений: 235


qnx.org.ru


Просмотр профиля WWW
« Ответ #4 : Октябрь 09, 2013, 16:45 »

Вот мои наработки:
1. Автоматическое определение нужной директории для бинарников
получаемые директории имеют вид (в зависимости от хоста на котором собирается и версии Qt)
qt485_Linux.arm_gcc402
qt485_win32.x86_mingw440
qt485_win32.x86_mingw481
qt485_win32.x86_msvc2010
qt510_win32.x86_mingw480
qt510_win32.x86_msvc2010

Плагины ложатся в нужную директорию, и поиск их приложением только в той директории в которой необъодимо см. п.6
2. Автоматическое определение текущей ревизии SVN(нужен установленый svn) и обявление объявлений  (простите, тафтология) для компилятора
3. В постинсталл можно добавить(дописать) некоторые действия (в моем случае добавлено удаление некоторых объектных файлов и создание объявлений для сборщика rpm,deb,msi пакетов и скрипта для документации)
4. Если изменен мажор или минор версия программы, выполняются некоторые действия (у меня удаляются объектники)
5. Автоматически добавляется символ d в конце бинарного файла (если юзаются плагины, очень удобно)
6. Генерится обявление для компилятора с именем каталога плагинов. В main остается только сделать qApp->addLibraryPath(qApp->applicationDirPath() + "/../plugins/" + quote(JCJS_PLUGIN_SUBDIR));
7. WINDOWS - Автоматом в .rc передается информация о сборке и иконка
ну и всего не припомнишь, много чего туда добавлял

Основное:  Нужно указать в .pro (или .pri) include( _target.pri )

Файлы снабжены комментариями. На вопросы отвечаю редко, т.к. много работы

Исходников по некоторым причинам в архив не положил, только файлы pro и pri
Записан

Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #5 : Октябрь 12, 2013, 20:32 »

Спасибо, на след неделе посмотрю, сейчас далеко от рабочей машины.
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #6 : Октябрь 23, 2013, 09:45 »

Честно говоря тяжеловато было понять ваш проект...
Но кое что уже прояснилось.

Объеденил все дочерние проекты в один через SUBDIRS
Код:
TEMPLATE = subdirs

SUBDIRS += railcore \
    raillogic \
    objectinspector \
    archivewidgets \
    sound \
   ... тут еще куча проектов
    scada

railcore.subdir = libs/railcore
raillogic.subdir = libs/raillogic
objectinspector.subdir = libs/objectinspector
archivewidgets.subdir = libs/archivewidgets
sound.subdir = libs/sound
... еще много ссылок

raillogic.depends = railcore
objectinspector.depends = railcore
sound.depends = railcore raillogic
...

Вот проеткный файл одной из библиотек archivewidgets:
Код:
QT       += widgets

TARGET = archivewidgets
TEMPLATE = lib

DEFINES += ARCHIVEWIDGETS_LIBRARY

INCLUDEPATH += \
    models \
    navigator \
    timeslider \
    datetime

SOURCES += \
***

HEADERS +=\
        archivewidgets_global.h \
***

CONFIG(debug, debug|release) {
    TARGET = $$join(TARGET,,,_d)
    win32 {
        DLLDESTDIR += D:\scada_new_debug
    }
    unix {
        message("DLLDESTDIR = /home/anton/packages/scada_debug/lib") #сообщение выводится
        DLLDESTDIR = /home/anton/packages/scada_debug/lib #папка создается, но в нее по этой команде ничего не копируется в линуксе( в винде все ок)
        DESTDIR = /home/anton/packages/scada_debug/lib #а по этой копируется, с ней будут копироваться и *.а файлы в винде
    }
} else {
    win32 {
        DLLDESTDIR += D:\scada_new_release
    }
    unix {
        message("DLLDESTDIR = /home/anton/packages/scada_release/lib")
        DLLDESTDIR = home/anton/packages/scada_release/lib
        DESTDIR = /home/anton/packages/scada_debug/lib
    }
}


FORMS += \
***

RESOURCES += \
    archivewidgets.qrc

Т.е. DLLDESTDIR создает в линуксе конечную папку куда нужно копировать результат сборки, но саму библиотеку почему то не копирует.
а DESTDIR копирует, но я так понимаю разница между этими двумя переменными есть... подскажите как решить этот вопрос?
« Последнее редактирование: Октябрь 23, 2013, 09:47 от Fregloin » Записан
lesav
Частый гость
***
Offline Offline

Сообщений: 235


qnx.org.ru


Просмотр профиля WWW
« Ответ #7 : Октябрь 23, 2013, 20:40 »

А почему такой страх к *.a файлам ?
Если они Вас чем-то не устраивают, настройте постбилд QMAKE_POST_LINK
После успешной сборки будет выполнена команда указанная в QMAKE_POST_LINK

Код:
win32:{
    QMAKE_POST_LINK = $(DEL_FILE)  $$DESTDIR/*.a ; \
                      $(COPY_FILE) $$DESTDIR/$$TARGET.dll C:/Windows/system32 ; \
                      $(DEL_FILE)  $$DESTDIR/$$TARGET.dll
    isEmpty(QMAKE_SH) {
        #шелл в Windows не найден
        # Замена сепаратора директорий для WINDOWS
        QMAKE_POST_LINK = $$replace(QMAKE_POST_LINK, /, $$DIR_SEPARATOR)
        # Замена сепаратора команд для WINDOWS
        QMAKE_POST_LINK = $$replace(QMAKE_POST_LINK, ;, &&)
    }
}

В постбилд можно напихать что угодно, например запуск сборки пакета msi или даже копирование полученных файлов на целевой хост и запуск программы на удаленной машине
Записан

Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #8 : Октябрь 23, 2013, 23:02 »

не то что бы страх, но у меня эти файлы потом пакуются в deb пакет простым скриптиком. А *.а файлы там ни к чему.
Записан
lesav
Частый гость
***
Offline Offline

Сообщений: 235


qnx.org.ru


Просмотр профиля WWW
« Ответ #9 : Октябрь 25, 2013, 05:54 »

Тогда нефик нагружать постбилд всякой ерундой.  Скриптик, который генерит deb может и почистить директорию перед тем как собрать пакет
Записан

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.101 секунд. Запросов: 23.