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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Управление структурой проекта (.pro)  (Прочитано 5130 раз)
Apktyc
Самовар
**
Offline Offline

Сообщений: 130


Просмотр профиля
« : Май 28, 2016, 22:02 »

Здравствуйте.

В этой теме хотелось бы обсудить, как Вы справляетесь с упорядочиванием своего проекта, придерживаетесь какой-либо структуры или нет. Может быть в каталоге проекта у Вас твориться творческий беспорядок, где все (от исходников и объектных файлов, до ресурсов и исполняемых) свалено в корневом каталоге, или наоборот везде царит строгий порядок, как в этой статье Структура Qt-проекта на C++?

Я никогда не пользовался теневой сборкой, вместо этого у меня в каталоге проекта есть каталог !prototype, куда и складываются бинарники.
Код:
win32:{
DESTDIR = "!prototype/Win32/$$TARGET"
}
PRECOMPILED_DIR = $$DESTDIR
Установка PRECOMPILED_DIR избавляет от появления раздражающих папок debug и release в корневом каталоге проекта.

Всю промежуточную генерацию загоняю в отдельный каталог.
Код:
OBJECTS_DIR = ".build/.obj"
MOC_DIR = ".build/.moc"
RCC_DIR = ".build/.rcc"

Исходники мирно свалены в каталоге "source".

Интересно было бы узнать, как это устроено у Вас.
Ну и вопрос по теме, есть ли возможность также структурировать сборку под Android, а то по-умолчанию все крутится в каталоге android-build.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #1 : Май 29, 2016, 00:54 »

Имхо это главная беда практически всех существующих систем сборок - ад конфигураций Улыбающийся
Идеально бы было не иметь возможности вообще никак не влиять на "теневой" процесс, а применять паттерн Convention over Configuration.
То есть разработчика не должно заботить, как и в каком виде будут свалены промежуточные результаты.
Есть папка src, а далее есть папки bin и lib для каждого из поддерживаемых таргетов.
Вы, как разработчик, говорите только, ЧТО вы хотите собрать, а не КАК и КУДА.
Все правила и структура папок - четко предопределены системой сборки, шаг влево-вправо невозможен.
Зависимости - опять же есть глобальный каталог всего, что имеется в распоряжении, в четко предопределенном формате.
Вы указываете что то типа DEPENDS: qwt-6.2.1 (если версия принципиальна), или просто qwt, если не особо. Либо вообще ничего не указываете, и тогда система пытается найти все нужные либы автоматом.
Но это в идеале. А в реале я стараюсь по минимуму загружать pro-файлы (имя таргета, список исходников, ресурсы, инклуды с либами). Теневая сборка? Ну будет теневая. Пусть qmake с креатором думают, куда и шо им положить. Не принципиально.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
ssoft
Программист
*****
Offline Offline

Сообщений: 574


Просмотр профиля
« Ответ #2 : Май 30, 2016, 23:56 »

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

Проектные файлы комплекса:

- файл общей конфигурации config.prf, содержащий только информацию о том, куда и как собирать, и ничего, что относилось бы к компонентам.
- файл depends_path.prf, содержащий либо ручной перечень директорий для поиска компонентов, либо процедуру их автоматического поиска в поддиректориях.
- файл depends_resolver.prf со стандартным содержимым, обеспечивающий автоматическое разрешение зависимостей между компонентами.
- (опционально) другие файлы по желанию

Проектные файлы компонента:

- файл проекта <component>.pro, содержащий перечень исходных фалов и особенности сборки, не влияющие на зависимые компоненты.
- файл config_finder.prf с функцией автоматического поиска общей конфигурации системы (место поиска и наименование файла конфигурации определено здесь и может быть изменено/дополнено при необходимости).
- файл depends.prf (обязателен только для библиотек - компонентов, от которых могут зависеть другие компоненты), содержащий перечень зависимостей и особенности сборки, влияющие на зависимые компоненты.
- (опционально) файл files.prf со стандартным содержимым, позволяющий автоматически добавлять исходные файлы из конкретных директорий (includeFilesFrom) или из директорий и их поддиректорий (includeFiles).
- (опционально) другие файлы по желанию (напимер, файл предкомпилируемого заголовка)

Последовательность операций для qmake следующая:

* анализ проектного файла компонента <component>.pro
** определение типа компонента (lib, app, ...)
** определение особенностей сборки компонента (CONFIG, PRECOMPILED, win32, linux ...), не влияющих на зависимые компоненты
** включение локального файла config_finder.prf для автоматического поиска и включения общей конфигурации комплекса
*** включение файла общей конфигурации комплекса config.prf
*** определение способа, места сборки и расположения генерируемых файлов (CONFIG, DESTDIR, ...)
*** включение файла depends_resolver.prf автоматического разрешения зависимостей между компонентами
**** включение файла depends_path.prf с явным перечнем путей поиска зависимостей или (опционально) процедурой их автоматического определения
**** включение файлов depends.prf с зависимостями конкретных компонентов
***** определение зависимостей библиотек и заголовочных файлов (LIBS, INCLUDEPATH, DEPENDPATH)
***** определение особенностей сборки компонента (CONFIG, win32, linux ...), влияющих на зависимые компоненты
***** определение зависимостей от компонентов Qt (QT).
***** определение зависимостей компонентов комплекса (DEPENDS)
** (опционально) включение локального файла files.prf для возможности автоматического включения исходников
** явное/ручное (через INCLUDES, SOURCES, ...) или автоматическое (через includeFiles, includeFilesFrom ) включение исходников и других файлов
« Последнее редактирование: Май 31, 2016, 00:52 от ssoft » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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