paha1956
Интересующийся
Сообщений: 3
|
|
« : 29 Март, 2014, 22:02:17 » |
|
Добрый день.
Подскажите, пожалуйста, как в Momentics создаётся сложный проект, похожий по структуре на проект BSP, где в отдельных папках содержатся исходники отдельных программ и при трансляции проекта из этих исходников получается несколько исполняемых файлов в одном определённом каталоге проекта.
Подозреваю, что тут нельзя обойтись без создания нескольких специальных Makefile, но вот принципы их построения и методы распределения среди файлов и каталогов проекта мне не совсем понятны, вернее, совсем не понятны. Может быть в Momentics существует какой-нибудь автоматизированный механизм создания такого рода проектов?
Поиск по Help Momentics дал лишь общее представление о создании и применении Makefile.
Спасибо.
|
|
|
Записан
|
|
|
|
Глеб Крылов
Сотрудник СВД ВС
Пользователь
Сообщений: 21
|
|
« Ответ #1 : 01 Апрель, 2014, 09:12:44 » |
|
Здравствуйте, Пожалуйста, уточните задачу которую вы решаете. Что касается создания «сложного» проекта с Makefile, не совсем понятно, какого конечного результата нужно достичь? Какого рода проблемы у Вас возникали при сборке исходников из существующего дерева каталогов? Под какое количество процессорных архитектур необходимо проводить сборку (возможно их несколько)? Спасибо.
|
|
|
Записан
|
Сотрудник СВД Встраиваемые Системы
|
|
|
paha1956
Интересующийся
Сообщений: 3
|
|
« Ответ #2 : 01 Апрель, 2014, 10:32:58 » |
|
Благодарю Вас, Глеб, за отклик на мой вопрос. Проблема в следующем.
У меня вполне нормально получается создать и оттранслировать проект, где в корневом каталоге проекта находятся несколько исходных файлов, а один единственный исполняемый файл помещается в папку arm/o-le-v7. Я работаю только с одной платформой ARM v7.
Далее, я беру готовый проект BSP и вижу, что там внутри проекта есть много папок, содержащих исходники для драйверов различных устройств. Причём, при трансляции проекта за один раз (если выбрать Build Project для данного проекта BSP) из этих исходников получается сразу несколько исполняемых файлов, каждый из которых находится в своей папке, которая относится к конкретному драйверу (например i2c/arm/le.v7 или spi/arm/le.v7 и т.д.).
Мне нужно повторить тоже самое, т.е. что бы за одну трансляцию проекта можно было получить сразу несколько исполняемых файлов из только своих исходников, находящихся в соответствующем каталоге. Как раз это у меня не получается.
Я просто не могу понять принцип настройки подобного рода проектов в Momentics. Т.е. как в Momentics осуществляется привязка тех или иных исходных файлов к тем исполняемым файлам, которые должны быть получены в результате трансляции. Причём таких, я бы сказал, "групп" в проекте должно быть несколько.
Говоря иначе, мне не создать корректное дерево каталогов и не настроить правила трансляции этого дерева. Не понятно где в меню Momentics находятся эти настройки. Если они есть, конечно.
Спасибо.
|
|
|
Записан
|
|
|
|
Глеб Крылов
Сотрудник СВД ВС
Пользователь
Сообщений: 21
|
|
« Ответ #3 : 01 Апрель, 2014, 19:24:16 » |
|
Здравствуйте, Судя по всему, решение Вашей задачи лежит в плоскости создания собственных Make-файлов. В документации присутствует раздел посвященный специфичному для QNX синтаксису make-файлов для разветвленного дерева каталогов. Также в данном разделе есть пример создания собственных make-файлов. Готовы ответить на дополнительные вопросы, и помочь в случае возникновения сложностей при реализации проекта.
|
|
|
Записан
|
Сотрудник СВД Встраиваемые Системы
|
|
|
paha1956
Интересующийся
Сообщений: 3
|
|
« Ответ #4 : 02 Апрель, 2014, 10:26:47 » |
|
Добрый день. Ага, я подозревал это. Спасибо за ссылку. Я находил подобного рода статьи в интернете и даже в help Momentics что-то похожее было. Но информации там крайне мало. Есть статьи на Faundry27 ( http://community.qnx.com/sf/wiki/do/viewPage/projects.ide/wiki/ProjectsBuildAndIDE), но там тоже скорее информация общего плана. А по Вашей ссылке более подробно всё расписано. Буду вникать. Главное это то, что я получил ещё одно подтверждение, что надо корректировать именно Make файлы в проекте и, скорее всего, делать это надо ручками. А вот тут человек столкнулся с похожей проблемой: http://foundry27.com/sf/discussion/do/listPosts/projects.community/discussion.qnx_momentics_community_support.topc7589;jsessionid=A7638B2598FAAEF08D1236E616381B70. Совсем недавно наткнулся на эту тему форума, не успел пока глубоко вникнуть. Ещё раз спасибо. Если будут положительные результаты обязательно сообщу. PS Немного информации о моём проекте. Сейчас я занимаюсь адаптацией BSP от Freescale i.MX6 Sabre Lite для платы PHYTEC phyFLEX-i.MX6. Есть положительные результаты. Далее в планах стоит разработка программного комплекса, по структуре похожего на BSP.
|
|
|
Записан
|
|
|
|
da-nie
Интересующийся
Сообщений: 7
|
|
« Ответ #5 : 06 Август, 2018, 10:13:44 » |
|
Здравствуйте. А не подскажете, как в IDE Momentics 2.2.0 создать проект, исходники которого раскиданы по разным папкам, но исполняемый файл получается один? Если в настройках компиляции указать пути к внешним папкам с *.cc и *.h файлами, то при компиляции в этих папках вызывается линкер и пытается собрать проект только на основе тех объектников, что получились после компиляции папки. Разумеется, такая сборка невозможна. Тогда как же размещать файлы проекта по разным папкам? Спасибо.
|
|
« Последнее редактирование: 06 Август, 2018, 10:15:56 от da-nie »
|
Записан
|
|
|
|
Андрей Докучаев
Сотрудник СВД ВС
Легенда
Сообщений: 1075
|
|
« Ответ #6 : 06 Август, 2018, 10:30:43 » |
|
Тогда как же размещать файлы проекта по разным папкам?
Посмотрите штатные Makefile-ы IDE в директории $(QNX_TARGET)/usr/include/mk на предмет EXTRA_OBJS и EXTRA_SRCVPATH.
|
|
|
Записан
|
|
|
|
da-nie
Интересующийся
Сообщений: 7
|
|
« Ответ #7 : 06 Август, 2018, 10:57:29 » |
|
Спасибо. Но, честно говоря, я ваш совет не понял. EXTRA_OBJS и EXTRA_SRCVPATH встречаются в qmakros.mk и в qphabtarg.mk: Из qmakros.mk ... SRCVPATH+=$(EXTRA_SRCVPATH) ... OBJS = $(filter-out $(EXCLUDE_OBJS), $(raw_objs)) $(EXTRA_OBJS) ...
Из qphabtarg.mk: ... EXTRA_SRCVPATH += $(PROJECT_ROOT)/src ...
Собственно, вот всё, что я отыскал. А что с этим делать-то нужно (я не знаток структуры makefile )?
|
|
|
Записан
|
|
|
|
Андрей Докучаев
Сотрудник СВД ВС
Легенда
Сообщений: 1075
|
|
« Ответ #8 : 06 Август, 2018, 11:08:51 » |
|
Спасибо. Но, честно говоря, я ваш совет не понял. С помощью этих конструкций можно добавить в Makefile проекта подключение отдельных объектных файлов, лежащих вне базовой директории, либо включение отдельных внешних директорий. Для этого, естественно, требуется базовое владение Makefile-ами, поскольку вся система сборки в IDE основана на них.
|
|
|
Записан
|
|
|
|
da-nie
Интересующийся
Сообщений: 7
|
|
« Ответ #9 : 06 Август, 2018, 11:13:28 » |
|
Эх, жаль, что такое требует работы с низкого уровня. Ну ничего. Попробую разобраться. подключение отдельных объектных файлов, лежащих вне базовой директории, Вот это вот можно точно из настроек проекта в IDE сделать. Но это очень неудобно будет. ибо включение отдельных внешних директорий. А вот этого из настроек IDE сделать нельзя. Я так понял, нужно найти в common.mk что-то типа OBJ= и вписать туда подобное OBJS = $(filter-out $(EXCLUDE_OBJS), $(raw_objs)) $(EXTRA_OBJS) ?
|
|
|
Записан
|
|
|
|
Андрей Докучаев
Сотрудник СВД ВС
Легенда
Сообщений: 1075
|
|
« Ответ #10 : 06 Август, 2018, 11:17:26 » |
|
Я так понял, нужно найти в common.mk что-то типа OBJ= и вписать туда подобное OBJS = $(filter-out $(EXCLUDE_OBJS), $(raw_objs)) $(EXTRA_OBJS) ? В 2х словах нужно добавить путь к директории: EXTRA_OBJS+=$(PROJECT_ROOT)/../???
|
|
|
Записан
|
|
|
|
da-nie
Интересующийся
Сообщений: 7
|
|
« Ответ #11 : 06 Август, 2018, 11:43:54 » |
|
Попробую, спасибо.
|
|
|
Записан
|
|
|
|
Андрей Докучаев
Сотрудник СВД ВС
Легенда
Сообщений: 1075
|
|
« Ответ #12 : 06 Август, 2018, 16:40:50 » |
|
В 2х словах нужно добавить путь к директории: EXTRA_OBJS+=$(PROJECT_ROOT)/../??? Поправка: EXTRA_SRCVPATH+=$(PROJECT_ROOT)/../???
|
|
|
Записан
|
|
|
|
da-nie
Интересующийся
Сообщений: 7
|
|
« Ответ #13 : 07 Август, 2018, 09:46:16 » |
|
Спасибо. EXTRA_SRCVPATH+=$(PROJECT_ROOT)/../??? сама IDE ставит, когда я указываю в настройках компилятора. С EXTRA_OBJS+=$(PROJECT_ROOT)/x86/o/ не работает. Как я понял, ожидается не директория, а файлы. Если же я указываю объектные файлы, то выдаётся сообщение, что этого файла нет (он ведь ещё не компилировался). Я подключаю папку src/UnitTests. Вот что сейчас в common.mk (я убрал EXTRA_OBJS+=...): # This is an automatically generated record. # The area between QNX Internal Start and QNX Internal End is controlled by # the QNX IDE properties.
ifndef QCONFIG QCONFIG=qconfig.mk endif include $(QCONFIG)
#===== USEFILE - the file containing the usage message for the application. USEFILE=
#===== LIBS - a space-separated list of library items to be included in the link. LIBS+=/usr/lib/libsocks.so #===== DEFCOMPILER_TYPE - default compiler. DEFCOMPILER_TYPE=gcc #===== GCC_VERSION - use it when you want to specify compiler version other than default. GCC_VERSION=2.95.3 #===== CCFLAGS - add the flags to the C compiler command line. CCFLAGS+=-fhuge-objects #===== EXTRA_INCVPATH - a space-separated list of directories to search for include files. EXTRA_INCVPATH+=$(PROJECT_ROOT)/src/UnitTests #===== EXTRA_SRCVPATH - a space-separated list of directories to search for source files. EXTRA_SRCVPATH+=$(PROJECT_ROOT)/src/UnitTests include $(MKFILES_ROOT)/qmacros.mk #===== EXTRA_OBJS - object files and libraries contributed additionaly on link/archive step EXTRA_OBJS+=/lib/libsocket.so #QNX internal start ifeq ($(filter g, $(VARIANT_LIST)),g) DEBUG_SUFFIX=_g LIB_SUFFIX=_g else DEBUG_SUFFIX=$(filter-out $(VARIANT_BUILD_TYPE) le be,$(VARIANT_LIST)) ifeq ($(DEBUG_SUFFIX),) DEBUG_SUFFIX=_r else DEBUG_SUFFIX:=_$(DEBUG_SUFFIX) endif endif
EXPRESSION = $(firstword $(foreach a, $(1)_$(CPUDIR)$(DEBUG_SUFFIX) $(1)$(DEBUG_SUFFIX) \ $(1)_$(CPUDIR) $(1), $(if $($(a)),$(a),))) MERGE_EXPRESSION= $(foreach a, $(1)_$(CPUDIR)$(DEBUG_SUFFIX) $(1)$(DEBUG_SUFFIX) \ $(1)_$(CPUDIR) $(1), $($(a)))
GCC_VERSION:=$($(firstword $(foreach a, GCC_VERSION_$(CPUDIR) GCC_VERSION, \ $(if $($(a)), $(a), ))))
EXTRA_LIBVPATH := $(call MERGE_EXPRESSION, EXTRA_LIBVPATH) EXTRA_INCVPATH := $(call MERGE_EXPRESSION, EXTRA_INCVPATH) EXTRA_SRCVPATH := $(call MERGE_EXPRESSION, EXTRA_SRCVPATH) EXTRA_OBJS := $($(call EXPRESSION,EXTRA_OBJS))
CCFLAGS_D = $(CCFLAGS$(DEBUG_SUFFIX)) $(CCFLAGS_$(CPUDIR)$(DEBUG_SUFFIX)) \ $(CCFLAGS_@$(basename $@)$(DEBUG_SUFFIX)) \ $(CCFLAGS_$(CPUDIR)_@$(basename $@)$(DEBUG_SUFFIX)) LDFLAGS_D = $(LDFLAGS$(DEBUG_SUFFIX)) $(LDFLAGS_$(CPUDIR)$(DEBUG_SUFFIX))
CCFLAGS += $(CCFLAGS_$(CPUDIR)) $(CCFLAGS_@$(basename $@)) \ $(CCFLAGS_$(CPUDIR)_@$(basename $@)) $(CCFLAGS_D) LDFLAGS += $(LDFLAGS_$(CPUDIR)) $(LDFLAGS_D)
LIBS:=$(foreach token, $($(call EXPRESSION,LIBS)),$(if $(findstring ^, $(token)), $(subst ^,,$(token))$(LIB_SUFFIX), $(token))) libnames:= $(subst lib-Bdynamic.a, ,$(subst lib-Bstatic.a, , $(libnames))) libopts := $(subst -l-B,-B, $(libopts))
BUILDNAME:=$($(call EXPRESSION,BUILDNAME))$(if $(suffix $(BUILDNAME)),,$(IMAGE_SUFF_$(BUILD_TYPE))) BUILDNAME_SAR:= $(patsubst %$(IMAGE_SUFF_$(BUILD_TYPE)),%S.a,$(BUILDNAME))
POST_BUILD:=$($(call EXPRESSION,POST_BUILD)) #QNX internal end include $(MKFILES_ROOT)/qphabtarg.mk
OPTIMIZE_TYPE=$(OPTIMIZE_TYPE_$(filter g, $(VARIANTS))) OPTIMIZE_TYPE_g=none
|
|
|
Записан
|
|
|
|
Андрей Докучаев
Сотрудник СВД ВС
Легенда
Сообщений: 1075
|
|
« Ответ #14 : 07 Август, 2018, 10:30:45 » |
|
Пример простейшего рабочего Makefile, собирающего бинарник из исходников в директориях $(PROJECT_ROOT)/ и $(PROJECT_ROOT)/../../nix/. ifndef QCONFIG QCONFIG=qconfig.mk endif include $(QCONFIG)
USEFILE=
INSTALLDIR=/dev/null
define PINFO PINFO DESCRIPTION=test endef
EXTRA_SRCVPATH += $(PROJECT_ROOT)/../../nix
EXTRA_INCVPATH += $(PROJECT_ROOT)/../../private
include $(MKFILES_ROOT)/qtargets.mk
|
|
|
Записан
|
|
|
|
|