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

 
 
> 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 > »   
Start new topic
Ответов (1 - 46)
сарматъ
сообщение Oct 9 2013, 10:36
Сообщение #2


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

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



попробовать сделать переиндексацию
Go to the top of the page
 
+Quote Post
Cosmojam
сообщение Oct 9 2013, 10:55
Сообщение #3


Местный
***

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



Цитата(сарматъ @ Oct 9 2013, 13:36) *
попробовать сделать переиндексацию

Неа, и настройки индексера менял (включал "index unused headers"). Не прокатывает


--------------------
typedef enum { no, yes, maybe } bool; | блог тут
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 9 2013, 11:14
Сообщение #4


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Cosmojam @ Oct 9 2013, 16:10) *
Подскажите как бороться с этим?

Смотрите вот здесь.
(Это касаемо заголовка топика, про дефайны в makefile).


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 9 2013, 11:45
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (AHTOXA @ Oct 9 2013, 14:14) *
Смотрите вот здесь.
(Это касаемо заголовка топика, про дефайны в makefile).
Да, удобная была штука. А вот в Eclipse kepler у меня пропала напрочь. Выкусили?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Oct 9 2013, 14:17
Сообщение #6


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

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



Цитата(Сергей Борщ @ Oct 9 2013, 15:45) *
Да, удобная была штука. А вот в Eclipse kepler у меня пропала напрочь. Выкусили?

Использую так:
Eclipse Kepler SR1

Project->Properties->C/C++ General->Preprocessor Include Paths, Macros etc.->Providers:

CDT GCC Built-in compiler Settings [checked]
Use providers shared between projects [unchecked]
Allocate console in the Console View [checked]
в командной строке:
make specs_file=${INPUTS} discovery

в Makefile
Код
.PHONY: discovery
discovery:
ifeq ($(CXX_PROJECT),YES)
    $(CXX) $(INCS) $(ALL_CXXFLAGS) -E -P -v -dD '$(specs_file)'
else
    $(CC) $(INCS) $(ALL_CFLAGS) -E -P -v -dD '$(specs_file)'
endif
    $(REMOVE) spec.d


Замеченные неудобства: из Makefile глобальные дефайны задаваемые в командной строке компилятора (-DSOMENAME) не распознаются. Проблем, описанных здесь не заметил.


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 9 2013, 16:13
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (mdmitry @ Oct 9 2013, 17:17) *
Использую так:
Спасибо! Сам бы не догадался. Кстати, все -D из makefile передаются.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Cosmojam
сообщение Oct 9 2013, 17:56
Сообщение #8


Местный
***

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



Цитата(AHTOXA @ Oct 9 2013, 14:14) *
Смотрите вот здесь.
(Это касаемо заголовка топика, про дефайны в makefile).

О, спасибо, пол-беды решено. А вот с дейфайнами внутри хидеров какие-то глюки индексера видимо. Некоторые нормально видит, некоторые - нет.


--------------------
typedef enum { no, yes, maybe } bool; | блог тут
Go to the top of the page
 
+Quote Post
Cosmojam
сообщение Oct 10 2013, 09:17
Сообщение #9


Местный
***

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



Кажется понял причину. В каталоге проекта есть неиспользуемые при сборке хидеры, в которых нужные символы переобъявлены. В данном случае это lwipots.h из юниттестов в составе lwip. Видимо реальный lwipopts.h индексируется раньше чем тестовый и некоторые символы оказываются переобъявлены.


--------------------
typedef enum { no, yes, maybe } bool; | блог тут
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Oct 10 2013, 12:40
Сообщение #10


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

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



Цитата(Сергей Борщ @ Oct 9 2013, 20:13) *
Кстати, все -D из makefile передаются.

Да, передаются правильно.


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


Шаман
******

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



Цитата(Сергей Борщ @ Oct 9 2013, 14:45) *
Да, удобная была штука. А вот в Eclipse kepler у меня пропала напрочь. Выкусили?

Не выкусили, глубже зарыли (по умолчанию скрыто, но можно открыть Window->Preferences->C/C++->Property Pages Settings) и объявили deprecated.
В версии Luna обещали удалить вообще, но пока ещё наблюдаю.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 10 2013, 18:14
Сообщение #12


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (IgorKossak @ Oct 10 2013, 20:25) *
В версии Luna обещали удалить вообще, но пока ещё наблюдаю.
Раз новый вариант мы с помощью mdmitry освоили, можно его смело забыть.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
сарматъ
сообщение Oct 11 2013, 05:21
Сообщение #13


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

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



хых... расскажите какую проблему вы тут решаете? что то я не могу уловить разницы что с этими опциями

CODE
CDT GCC Built-in compiler Settings [checked]
Use providers shared between projects [unchecked]
Allocate console in the Console View [checked]
в командной строке:
make specs_file=${INPUTS} discovery


собираю что с теми что по умолчанию...
если вставляю это в майкфайл

CODE
ifeq ($(CXX_PROJECT),YES)
$(CXX) $(INCS) $(ALL_CXXFLAGS) -E -P -v -dD '$(specs_file)'
else
$(CC) $(INCS) $(ALL_CFLAGS) -E -P -v -dD '$(specs_file)'
endif
$(REMOVE) spec.d


вообще не собирается пишет ошибку что какого то разделителя не хватает...

Сообщение отредактировал сарматъ - Oct 11 2013, 05:22
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 11 2013, 07:37
Сообщение #14


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (сарматъ @ Oct 11 2013, 08:21) *
расскажите какую проблему вы тут решаете? что то я не могу уловить разницы
Как бы проще объяснить - в makefile задаются некие глобальные опции проекта:
1) компилятор и, следовательно, пути к его библиотечным заголовочным файлам.
2) сторонние библиотеки и, следовательно, пути поиска их заголовочных файлов.
3) Тип процессора, который может определять некие define, по которым в некоторых файлах (и заголовчных, и исходного кода) могут включаться какие-либо участки либо подключаться те или иные другие заголовочные файлы.
4) просто какие-то глобальные на весть проект #define вроде NDEBUG

Вот чтобы эклипса могла все это учитывать, правильно раскрашивать исходники и правильно осуществлять навигацию по ним, обо всех этих параметрах надо ей правильно сообщить. Можно тупо их набивать на соответствующих вкладках вручную. Но во-первых это нудно, а во-вторых при любом изменении придется править как минимум в двух местах - в makefile и на одной/нескольких вкладках Эклипсы. Это муторно и не наш метод. В эклипсе реализован автоматический механизм: она вызывает компилятор, пытками wink.gif заставляет его выдать в stdout все #define и пути, после чего анализирует и усваивает вывод. Вот чтобы компилятор выдал все что нужно с учетом наших установок в makefile мы и просим Эклипсу вызывать не голый писишный компилятор ${COMMAND} -E -P -v -dD "${INPUTS}", а определенный в нашем makefile компилятор со всеми необходимыми для нашего проекта опциями. И делаем мы это заставляя make достичь цель discovery.

QUOTE (сарматъ @ Oct 11 2013, 08:21) *
вообще не собирается пишет ошибку что какого то разделителя не хватает...
Там в начале строк табуляторы должны стоять, а не пробелы. А перед этим куском должна стоять цель discovery:
В общем у меня так:
CODE
#discovery target for Eclipse parser
.PHONY: discovery
discovery:
    $(CC) $(INCLUDES) $(CFLAGS) -E -P -v -dD '$(specs_file)'


P.S. чуть-чуть отшлифовал текст.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
сарматъ
сообщение Oct 11 2013, 07:40
Сообщение #15


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

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



понял, спасибо, буду пробовать

может там еще слова волшебные какие шепнуть надо?

у меня как был этот блок серым так и остался(

CODE
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */
RCC->CR |= (uint32_t)0x00000001;
RCC->CFGR = 0x00000000;
RCC->CR &= (uint32_t)0xFEF6FFFF;
#endif


Сообщение отредактировал сарматъ - Oct 11 2013, 08:58
Go to the top of the page
 
+Quote Post
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
abutorin
сообщение Jan 3 2014, 19:41
Сообщение #31


Участник
*

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



Цитата(mdmitry @ Jan 3 2014, 01:04) *
Цель discovery является целью только для Eclipse. Eclipse получает информацию о путях для заголовочных файлов и всех объявленных define. Результат работы влияет на навигацию по проекту и подсветку синтаксиса. Вполне логично, что цель строится при изменении исходных кодов проекта. У себя не замечал частых вызовов.

Это я понял. Когда эклипс вызывает эту команду? При изменении файлов исходного кода этого не происходит. Сейчас заметил что при сборке проекта тоже не происходит. Хочется заставить эклипс это делать автоматом.
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Jan 3 2014, 20:55
Сообщение #32


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

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



Цитата(abutorin @ Jan 3 2014, 23:41) *
Когда эклипс вызывает эту команду? При изменении файлов исходного кода этого не происходит. Сейчас заметил что при сборке проекта тоже не происходит. Хочется заставить эклипс это делать автоматом.

Первый запуск будет после заполнения настроек в Eclipse для цели discovery. Clear Entries, Apply вызывает перестроение зависимостей.
Для постоянного вызова можно включить discovery в цель all, но зачем это?


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
abutorin
сообщение Jan 3 2014, 20:58
Сообщение #33


Участник
*

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



Цитата(mdmitry @ Jan 4 2014, 00:55) *
Первый запуск будет после заполнения настроек в Eclipse для цели discovery. Clear Entries, Apply вызывает перестроение зависимостей.
Для постоянного вызова можно включить discovery в цель all, но зачем это?

После внесения изменений каких либо дефайнов в исходниках эклипс этого не замечает. И продолжает ругаться что где-то, что-то не определено, хотя сборка происходит корректно.
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Jan 3 2014, 21:10
Сообщение #34


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

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



Цитата(abutorin @ Jan 4 2014, 00:58) *
После внесения изменений каких либо дефайнов в исходниках эклипс этого не замечает. И продолжает ругаться что где-то, что-то не определено, хотя сборка происходит корректно.

сейчас проверил на тестовом проекте. Изменил специально один define для условной компиляции. После пересборки подсвечиваются необходимые ветки условной компиляции.
Как Вы настраиваете Eclipse и какой Makefile?


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
abutorin
сообщение Jan 3 2014, 21:24
Сообщение #35


Участник
*

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



Цитата(mdmitry @ Jan 4 2014, 01:10) *
сейчас проверил на тестовом проекте. Изменил специально один define для условной компиляции. После пересборки подсвечиваются необходимые ветки условной компиляции.
Как Вы настраиваете Eclipse и какой Makefile?


Настраивал как вы рекомендовали в этой ветке.
В разделе C/C++ Generel->Preprocessor Include/Providers
галка CDTGCC Built-in Compiler Settings
команда make specs_file=${INPUTS} discovery
галка Allocate console in the concole view

Остальные галки сняты
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Jan 4 2014, 10:30
Сообщение #36


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

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



Во вкладке Providers у меня отмечены некоторые настройки:

CDT User Setting Entries
CDT Managed Build Setting Entries [Shared]
CDT GCC Build Output Parser

Настройки там не менялись.

В Makefile изменения идеалогически правильно делать как указал IgorKossak.


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 5 2014, 00:29
Сообщение #37


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Я понял, что на вкладке Providers достаточно оставить только CDT GCC Build-in compiler settings без галки "Use global provider shared between projects" (с ней эклипс пытается выполнить команду черт знает в какой директории и не находит там нужного makefile). CDT GCC Build Output Parser добавляет установки (директории заголовочных файлов, по умолчанию предопределенные символы и т.д.) от системного компилятора, которые абсолютно не нужны при кросс-компиляции.

Если память не изменяет, цель discovery вызывается не только после build, но еще и при принудительной переиндексации проекта (Project->C/C++ Index -> Rebuild).


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
abutorin
сообщение Jan 5 2014, 07:02
Сообщение #38


Участник
*

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



Цитата(Сергей Борщ @ Jan 5 2014, 04:29) *
Если память не изменяет, цель discovery вызывается не только после build, но еще и при принудительной переиндексации проекта (Project->C/C++ Index -> Rebuild).


Никак не пойму. Она у меня только вызывается при изменении настроек. При ребилде не вызывается. При переиндексации тоже.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jan 5 2014, 13:59
Сообщение #39


Шаман
******

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



Window->Preferences->C/C++->Indexer
+ Automatically update the index
+ Update index immediately after every file-save

Цитата(Сергей Борщ @ Jan 5 2014, 02:29) *

Всё абсолютно верно.
Go to the top of the page
 
+Quote Post
abutorin
сообщение Jan 5 2014, 19:29
Сообщение #40


Участник
*

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



Цитата(IgorKossak @ Jan 5 2014, 17:59) *
Window->Preferences->C/C++->Indexer
+ Automatically update the index
+ Update index immediately after every file-save


Похоже часть проблемы была в компе. Попробовал на другой машине все указанные настройки. Ручная переиндексация работает, обновление при пересборке работает. Но автоматическое обновление при сохранении файла не работает.
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Jan 5 2014, 19:41
Сообщение #41


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

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



Цитата(Сергей Борщ @ Jan 5 2014, 04:29) *
CDT GCC Build Output Parser добавляет установки (директории заголовочных файлов, по умолчанию предопределенные символы и т.д.) от системного компилятора, которые абсолютно не нужны при кросс-компиляции.

У меня выбран, но при просмотре найденных путей и define нет ничего от системного компилятора (mingw32-gcc), под linux не проверял. Позже посмотрю. А если не влият, то и не надо лишних действий, и можно отключить.

Цитата
Window->Preferences->C/C++->Indexer
+ Automatically update the index
+ Update index immediately after every file-save

Так это вроде как по умолчанию выбрано.


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Nov 14 2014, 15:56
Сообщение #42


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Я тут наконец-то дозрел до перехода на Luna. Вспомнил про эту тему, проштудировал.
Давайте я для потомков подытожу:

Настройка обнаружения дефайнов в Eclipse Kepler и более поздних

Project->Properties->C/C++ General->Preprocessor Include Paths, Macros etc.->Providers:
  • Снимаем все прички в списке "Providers";
  • Ставим причку на "CDT GCC Built-in compiler settings";
  • В настройках этого провайдера:
    • снимаем птичку "Use global provider shared between projects";
    • в строке "Command to get compiler specs" прописываем:
      Код
      make extension="${EXT}" specs_file="${INPUTS}" discovery
  • В makefile создаём цель для дисковеринга:
    Код
    #  specs_file has extension "C" for C++ and "c" for C.
    discovery:
    ifeq ($(extension),c)
        @echo -- discovery for $(CC)
        $(CC) $(INCS) $(CFLAGS) -E -P -v -dD '$(specs_file)'
    else
        @echo -- discovery for $(CCX)
        $(CXX) $(INCS) $(CXXFLAGS) -E -P -v -dD '$(specs_file)'
    endif
        $(RM) spec.d

  • Если вдруг индексация не выполняется при изменении файлов проекта, зайти в
    Window->Preferences->C/C++->Indexer
    и проверить установку следующих птичек :
    • Automatically update the index
    • Update index immediately after every file-save


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Nov 14 2014, 20:36
Сообщение #43


Шаман
******

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



По поводу индексации Антоха сказал всё правильно, но этого бывает не достаточно. Например, после изменения пути к тулчейну, изменения дефайнов в мейкфайле, и т. д.
Для обновления состояния проекта надо ещё провести "редискаверинг" - в настройках провайдера CDT GCC Built-in compiler settings нажать кнопку Clear Entries, потом Apply и наконец OK.
Go to the top of the page
 
+Quote Post
Aaron
сообщение Nov 28 2014, 05:59
Сообщение #44


Местный
***

Группа: Свой
Сообщений: 243
Регистрация: 5-10-06
Из: Зеленоград
Пользователь №: 21 007



Оу, спасибо! Наконец-то индексация в Luna заработала адекватно )))
Go to the top of the page
 
+Quote Post
swisst
сообщение Jan 8 2015, 21:32
Сообщение #45


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

Группа: Свой
Сообщений: 163
Регистрация: 16-02-07
Из: Харьков
Пользователь №: 25 425



Цитата(AHTOXA @ Nov 14 2014, 17:56) *
Я тут наконец-то дозрел до перехода на Luna. Вспомнил про эту тему, проштудировал.
Давайте я для потомков подытожу:


можно увидеть Ваш вывод в консоль при вызове Index->Rebuild ?

не могу добиться стабильности на Luna - во первых команда Index->Rebuild ничего на консоль не выводит, манипуляция Properties->Providers->Clear Entries->Apply(OK) работает через раз (на консоль выводит, entries обновляет, завершается, правда, цель discovery с ошибкой) - перезапуск среды помогает.

Код
23:12:08 **** Running scanner discovery: CDT GCC Built-in Compiler Settings ****
make extension=C specs_file=D:/Prog/EclipseWS/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.C discovery
COMSPEC detected C:\Windows\system32\cmd.exe
SHELL is C:/Windows/system32/cmd.exe, REMOVE_CMD is cs-rm
-- discovery for "C:\Program Files (x86)\GNU Tools ARM Embedded\4.9 2014q4\bin"\arm-none-eabi-gcc
"C:\Program Files (x86)\GNU Tools ARM Embedded\4.9 2014q4\bin"\arm-none-eabi-gcc "C:/Program Files (x86)/GNU Tools ARM Embedded/4.9 2014q4/arm-none-eabi/include" . ./cmsis  -ggdb -Os -mcpu=cortex-m0 -mthumb-interwork   -DVECT_TAB_FLASH -DFLASH_RUN -DLPC1114 -DLPC1114_TK -I. -I./cmsis -I. -ffunction-sections -fdata-sections -Wall -Wextra -Wcast-align -Wpointer-arith -Wredundant-decls -Wshadow -Wcast-qual -Wcast-align -Wa,-adhlns= -E -P -v -dD 'D:/Prog/EclipseWS/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.C'
arm-none-eabi-gcc: error: 'D:/Prog/EclipseWS/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.C': Invalid argument
Using built-in specs.
COLLECT_GCC=C:\Program Files (x86)\GNU Tools ARM Embedded\4.9 2014q4\bin\arm-none-eabi-gcc
Target: arm-none-eabi
Configured with: /home/build/work/GCC-4-9-build/src/gcc/configure --build=i686-linux-gnu --host=i686-w64-mingw32 --target=arm-none-eabi --prefix=/home/build/work/GCC-4-9-build/install-mingw --libexecdir=/home/build/work/GCC-4-9-build/install-mingw/lib --infodir=/home/build/work/GCC-4-9-build/install-mingw/share/doc/gcc-arm-none-eabi/info --mandir=/home/build/work/GCC-4-9-build/install-mingw/share/doc/gcc-arm-none-eabi/man --htmldir=/home/build/work/GCC-4-9-build/install-mingw/share/doc/gcc-arm-none-eabi/html --pdfdir=/home/build/work/GCC-4-9-build/install-mingw/share/doc/gcc-arm-none-eabi/pdf --enable-languages=c,c++ --disable-decimal-float --disable-libffi --disable-libgomp --disable-libmudflap --disable-libquadmath --disable-libssp --disable-libstdcxx-pch --disable-nls --disable-shared --disable-threads --disable-tls --with-gnu-as --with-gnu-ld --with-headers=yes --with-newlib --with-python-dir=share/gcc-arm-none-eabi --with-sysroot=/home/build/work/GCC-4-9-build/install-mingw/arm-none-eabi --with-libiconv-prefix=/home/build/work/GCC-4-9-build/build-mingw/host-libs/usr --with-gmp=/home/build/work/GCC-4-9-build/build-mingw/host-libs/usr --with-mpfr=/home/build/work/GCC-4-9-build/build-mingw/host-libs/usr --with-mpc=/home/build/work/GCC-4-9-build/build-mingw/host-libs/usr --with-isl=/home/build/work/GCC-4-9-build/build-mingw/host-libs/usr --with-cloog=/home/build/work/GCC-4-9-build/build-mingw/host-libs/usr --with-libelf=/home/build/work/GCC-4-9-build/build-mingw/host-libs/usr --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --with-pkgversion='GNU Tools for ARM Embedded Processors' --with-multilib-list=armv6-m,armv7-m,armv7e-m,armv7-r
Thread model: single
gcc version 4.9.3 20141119 (release) [ARM/embedded-4_9-branch revision 218278] (GNU Tools for ARM Embedded Processors)
make: *** [discovery] Error 1

23:12:08 Build Finished (took 187ms)

Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 8 2015, 21:46
Сообщение #46


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



У вас в makefile похоже ошибка:
Код
"C:\Program Files (x86)\GNU Tools ARM Embedded\4.9 2014q4\bin"\arm-none-eabi-gcc "C:/Program Files (x86)/GNU Tools ARM Embedded/4.9 2014q4/arm-none-eabi/include" . ./cmsis  -ggdb -Os -mcpu=cortex-m0 -mthumb-interwork   -DVECT_TAB_FLASH -DFLASH_RUN -DLPC1114 -DLPC1114_TK -I. -I./cmsis -I. -ffunction-sections -fdata-sections -Wall -Wextra -Wcast-align -Wpointer-arith -Wredundant-decls -Wshadow -Wcast-qual -Wcast-align -Wa,-adhlns= -E -P -v -dD 'D:/Prog/EclipseWS/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.C'

После arm-none-eabi-gcc с путём идут пути инклюдов без префикса "-I" ("C:/Program Files (x86)/GNU Tools ARM Embedded/4.9 2014q4/arm-none-eabi/include" . ./cmsis). Поэтому вызов make при дискаверинге завершается с ошибкой, и ничего не срабатывает. Чините makefile.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Spider
сообщение May 15 2015, 09:13
Сообщение #47


В поисках истины
***

Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923



Прошу прощения что встреваю sm.gif
А тоже самое возможно с sdcc?
Ключи подобные у компилятора есть. makefile я доработал примерно следующей строкой
Код
discovery:
    @echo Discovery $(extension)
    sdcc -I"C:\Program Files\SDCC\include" -E -dD "$(specs_file)"
    @echo ' '

но даже если у меня получается заставить Eclipse выполнить male .... discovery, то в консоль он ругается что нет такой цели для сборки discovery. Настройках проекта отключена генерация makefile и судя по всему он пользуется моим при сборке all или clear. Но вот discovery не хочет делать. Руками вызвать make получается. Как это?

Я не совсем допонимаю механизм работы этого всего. Что должно быть в результате? Как с этим связан spec.C файл?
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th June 2025 - 16:04
Рейтинг@Mail.ru


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