реклама на сайте
подробности

 
 
> Eclipse Makefile project дефайны в мейкфайле, ifdef и индексация кода, Код за ifdef не индексируется и этих дефайнов эклипс не видит
Cosmojam
сообщение Oct 9 2013, 10:10
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 311
Регистрация: 12-01-11
Из: Калининград (Koenigsberg)
Пользователь №: 62 182



Есть кусок кода
Код
#if SOME_VAR
void func(void);
#else

SOME_VAR определена в каком-то хэдэре, который виден эклиспу, но по каким-то причинам он не видит этот дефайн и соответственно весь код под ifdef становится ему не виден. Это страшно неудобно т.к. очень привык Ctrl+click на функции и попадать к её определению. А если она определена под таким блоком ifdef, то эклипс её не видит и приходится мучится с поиском.

Пути к инклюдам эклипс видит (дописал их в path and symbols, по ктрл+клику находит инклюды). Там же в symbols дописал эти дефайны - не помогло.

Подскажите как бороться с этим?


--------------------
typedef enum { no, yes, maybe } bool; | блог тут
Go to the top of the page
 
+Quote Post
4 страниц V  < 1 2 3 4 >  
Start new topic
Ответов (15 - 29)
mdmitry
сообщение Oct 11 2013, 10:23
Сообщение #16


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



CODE

.PHONY: discovery
discovery:
1)ifeq ($(CXX_PROJECT),YES)
2) $(CXX) $(INCS) $(ALL_CXXFLAGS) -E -P -v -dD '$(specs_file)'
3)else
4) $(CC) $(INCS) $(ALL_CFLAGS) -E -P -v -dD '$(specs_file)'
5)endif
6) $(REMOVE) spec.d


Надеялся, что по мнемоникам не будет вопросов. laughing.gif Кратко прокомментирую.
Свой Makefile пытался сделать максимально универсальным. Можно использовать и другие названия (`GNUmakefile', `makefile', и `Makefile'), понимая разницу между ними.
В начале Makefile есть определение типа проекта: С (CXX_PROJECT=NO) или С++ (CXX_PROJECT=YES). В строке 1) проверяется тип проекта. Если С++ проект, то выполняется строка 2), в противном случае строка 4) (С проект). $(CXX) соответствующий компилятор g++ (например, arm-none-eabi-g++), $(CC) - gcc (arm-none-eabi-gcc). $(INCS) полный список каталогов для поиска заголовочных файлов, исключая каталоги самого компилятора. $(ALL_CXXFLAGS) - ключи (опции) для g++, $(ALL_CFLAGS) - для gcc. Они различаются, так как не все опции совпадают и могут быть применены (например, gnu99 для gcc). Строка 6) удаление ненужного служебного файла зависимостей spec.d, созданного в результате запуска компилятора.

Командная строка:
Код
make specs_file=${INPUTS} discovery

вызов утилиты make для достижения цели discovery для файла specs_file, название которого определяется встроенной в Eclipse переменной ${INPUTS}.


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
сарматъ
сообщение Oct 11 2013, 10:36
Сообщение #17


Частый гость
**

Группа: Участник
Сообщений: 153
Регистрация: 19-11-12
Пользователь №: 74 463



а если в проекте и с и с++?
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Oct 11 2013, 11:40
Сообщение #18


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Цитата(сарматъ @ Oct 11 2013, 14:36) *
а если в проекте и с и с++?

И ещё *.S для полноты.
Правила компиляции файлов Вы сами задаете в Makefile. Например, для *.S
Код
# Assemble: create object files from assembler source files.
$(OBJDIR)/%.o : %.S $(BUILDONCHANGE)
    @echo $(MSG_ASSEMBLING) $<
ifeq ($(CXX_PROJECT),YES)
    $(ASXX) -c $(ALL_ASFLAGS) -o $@ $<
else
    $(AS) -c $(ALL_ASFLAGS) -o $@ $<
endif

где
ASXX = $(CROSS_TOOLS)gcc -x assembler-with-cpp
AS = $(CROSS_TOOLS)gcc
$(CROSS_TOOLS) - префикс или полный путь (arm-none-eabi- или /opt/GNU_ARM/4.7_2013q3/bin/arm-none-eabi-)

В зависимости от Ваших целей и задач можете сделать и для с-файлов что-нибудь подобное, НО осторожно с опциями компиляции (допустимые).

Есть в сети хороший перевод документации по утилите make.


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
сарматъ
сообщение Oct 11 2013, 11:47
Сообщение #19


Частый гость
**

Группа: Участник
Сообщений: 153
Регистрация: 19-11-12
Пользователь №: 74 463



ну с компиляцией то ладно - у меня чужой мейк файл и там сделано что он все нормально компилирует и собирает, я про то чему должно быть равно CXX_PROJECT=? чтобы в проекте где есть и си и с++ дефайны бы попадали в эклипс?
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Oct 11 2013, 11:54
Сообщение #20


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Цитата(сарматъ @ Oct 11 2013, 15:47) *
ну с компиляцией то ладно - у меня чужой мейк файл и там сделано что он все нормально компилирует и собирает, я про то чему должно быть равно CXX_PROJECT=? чтобы в проекте где есть и си и с++ дефайны бы попадали в эклипс?

CXX_PROJECT=YES. Иначе не соберётся проект. Проекты с scmRTOS имеют все файлы (*.cpp, *.c, в зависимости от порта могут быть и *.S). Можете глянуть Makefile в портах для GCC. Они достаточно минималистичны и понятны.

ADD: в этом случае (CXX_PROJECT=YES) у Вас и
Код
#ifdef __cplusplus
extern "C" {
#endif

#ifdef __cplusplus
}
#endif

правильно подсвечивается.


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
сарматъ
сообщение Oct 11 2013, 12:08
Сообщение #21


Частый гость
**

Группа: Участник
Сообщений: 153
Регистрация: 19-11-12
Пользователь №: 74 463



да как раз эта ос у меня используется, сейчас ваш вариант попробую, спасибо

хых...

ну вот получилось появилась консоль дополнительная в ней видно что дефайны появились
CODE
#define STM32F40XX 1
#define USE_STDPERIPH_DRIVER 1
#define VER_MAJOR 0
#define VER_MINOR 1
#define HSE_VALUE 8000000

но вот эта дрянь все равно в эклипсе серая...
CODE
#if !defined (STM32F4XX) && !defined (STM32F40XX) && !defined (STM32F427X)
/* #define STM32F40XX */ /*!< STM32F40xx/41xx Devices */
/* #define STM32F427X */ /*!< STM32F427x/437x Devices*/
#endif

может еще что подкрутить надо?

ой.. тут как раз все сработало это я стормозил...
не срабатывает в core_cm4.h

блок
CODE
#if defined (__VFP_FP__) && !defined(__SOFTFP__)
#if (__FPU_PRESENT == 1)
#define __FPU_USED 1
#else
#warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
#define __FPU_USED 0
#endif


остается серым, хотя #define __VFP_FP__ 1 и не определена __SOFTFP__

Сообщение отредактировал сарматъ - Oct 12 2013, 09:51
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Dec 17 2013, 13:49
Сообщение #22


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Слегка помучившись, после некоторых экспериментов и углублённого изучения документации Eclipse, пришёл к следующему:
1. запускать дискаверинг после анализа CXX_PROJECT не верно, т. к. сама суть дискаверинга состоит в определении путей, дефайнов и прочего в зависимости от языка, которых в смешанном проекте может быть (в нашем случае) 1 или 2, а не в зависимости от некоего дефайна, определённого на весь проект.
2. изменил настройки проекта и makefile следующим образом:
Код
make extension="${EXT}" specs_file="${INPUTS}" discovery

Код
discovery:
ifeq ($(extension),C)
    @echo -- discovery for $(CXX)
    $(CXX) $(INCS) $(CXXFLAGS) -E -P -v -dD '$(specs_file)'
else
    @echo -- discovery for $(CC)
    $(CC) $(INCS) $(CFLAGS) -E -P -v -dD '$(specs_file)'
endif
    $(RM) spec.d
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Dec 17 2013, 14:22
Сообщение #23


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Цитата(IgorKossak @ Dec 17 2013, 18:49) *
Код
make extension="${EXT}" specs_file="${INPUTS}" discovery

Код
discovery:
ifeq ($(extension),C)
    @echo -- discovery for $(CXX)
    $(CXX) $(INCS) $(CXXFLAGS) -E -P -v -dD '$(specs_file)'
else
    @echo -- discovery for $(CC)
    $(CC) $(INCS) $(CFLAGS) -E -P -v -dD '$(specs_file)'
endif
    $(RM) spec.d

IgorKossak, проверка именно вначале на С? Ведь далее идет запуск для CXX.
Учитывая, что расширения файлов для C++ не стандартизованы (cc, cpp) может делать сначала проверку на файл С, а все что не подходит считать файлом C++.


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Dec 17 2013, 14:34
Сообщение #24


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



specs_file имеет расширение C для C++ и c для C.
Именно это имеется в виду.
Расширение присваивается самой Eclipse, точнее её плагином CDT. Вот так они решили wink.gif
Кроме того, различать язык можно не только по расширению (переменная среды ${EXT}), а и по команде (переменная ${COMMAND}).
Во втором случае их можно различать по gcc или g++.
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Dec 17 2013, 14:39
Сообщение #25


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Цитата(IgorKossak @ Dec 17 2013, 18:34) *
specs_file имеет расширение C для C++ и c для C.

Если со временем не изменят расширение, то все хорошо. Для С невероятно, что поменяют.
Спасибо.
У себя буду переделывать, наверно, в таком виде:
Код
discovery:
ifeq ($(extension),с)
    @echo -- discovery for $(CС)
    $(CC) $(INCS) $(ALL_CFLAGS) -E -P -v -dD '$(specs_file)'
else
    @echo -- discovery for $(CXX)
    $(CXX) $(INCS) $(ALL_CXXFLAGS) -E -P -v -dD '$(specs_file)'
endif
    $(REMOVE) spec.d


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Dec 17 2013, 14:54
Сообщение #26


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(mdmitry @ Dec 17 2013, 16:39) *
Если со временем не изменят расширение, то все хорошо.

Да вроде бы давно уже так.
Кстати, в мейкфайл надо бы комментарий на эту тему добавить, чтобы со временем не запутаться.

Цитата(mdmitry @ Dec 17 2013, 16:39) *
Если со временем не изменят расширение, то все хорошо. Для С невероятно, что поменяют.

Смотря какая вожжа под хвост попадёт. Могут поменять расширения на C и CPP wink.gif
И в этом случае у Вас всё порушится. Так что без пространного комментария в мейкфайле не обойтись.
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Dec 17 2013, 14:56
Сообщение #27


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



IgorKossak, Вы проверяли такую ситуацию:
проект имеет c и cpp файлы, причем включаемые файлы пользователя для C находятся в одной директории, а для CPP в другой. И для полноты картины и #define в файлах разные. В этом случае все корректно у Вас работало?


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Dec 17 2013, 15:04
Сообщение #28


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Не проверял, но не вижу препятствий.
Ведь если делается различие по флагам (ALL_CFLAGS и ALL_CXXFLAGS), то почему бы не сделать аналогичное различие и по INCS и по DEFS.
Go to the top of the page
 
+Quote Post
abutorin
сообщение Dec 31 2013, 10:08
Сообщение #29


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 3-09-12
Пользователь №: 73 374



Добрый день.
Задам наверное глупый вопрос. Но я не совсем понял когда Eclipse вызывает make с целью discover? При ребилде он у меня это делает а можно ли как-то заставить делать это в фоновом режиме?
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Jan 2 2014, 21:04
Сообщение #30


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Цитата(abutorin @ Dec 31 2013, 14:08) *
Добрый день.
Задам наверное глупый вопрос. Но я не совсем понял когда Eclipse вызывает make с целью discover? При ребилде он у меня это делает а можно ли как-то заставить делать это в фоновом режиме?

Цель discovery является целью только для Eclipse. Eclipse получает информацию о путях для заголовочных файлов и всех объявленных define. Результат работы влияет на навигацию по проекту и подсветку синтаксиса. Вполне логично, что цель строится при изменении исходных кодов проекта. У себя не замечал частых вызовов.


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post

4 страниц V  < 1 2 3 4 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 3rd August 2025 - 11:07
Рейтинг@Mail.ru


Страница сгенерированна за 0.01506 секунд с 7
ELECTRONIX ©2004-2016