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

 
 
 
Reply to this topicStart new topic
> Помогите с Makefile, *** missing separator. Stop.
swisst
сообщение May 24 2010, 13:03
Сообщение #1


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

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



Решил попробовать пересесть на Eclipse с AVR Studio. К тому же всегда интересовала работа утилиты make.
В общем задача ставилась простая: взять исходники рабочего проекта из студии -> перенести их в проект Eclipse, подправить/написать makefile для проекта Eclipse, собрать проект, получить нужные файлы на выходе и сравнить их со студийными. Если файлы идентичны - задачу осилил.

Разобрался с Eclipse, AVR плагином к нему и автоатическим генерированием makefile - hex-файлы не совпали (скорее всего какие-то ключи указаны/не_указаны). Дальше начал штудировать make, честно говоря, по-началу - wacko.gif каша в голове, потом пришло понимание...

Поправил make-файл студии, долго правил, пока удалось собрать проект, в итоге hex-файлы совпали...но...

Дано:
- папка проекта AVR_Test - в ней лежат *.c и *.h файлы, мой makefile
- силами makefile создаю в папке проекта папку output и кидаю в нее файлы *.d и *.o
- силами makefile компилирую проект и создаю в папке проекта выходные файлы elf, hex, eep, lss, map

но это все работает, только один раз - когда в папке проекта отсутствует папка output
т.е. я собираю проект в первый раз - все ОК, собираю этот же проект во второй раз, выдает:
Код
make all
output/crc.o:1: *** missing separator.  Stop.

беру и вручную удаляю папку output - проект собирается...

подскажите, где я накосячил или чего не сделал/переделал...
Прикрепленные файлы
Прикрепленный файл  makefile.txt ( 3.35 килобайт ) Кол-во скачиваний: 57
 
Go to the top of the page
 
+Quote Post
MrYuran
сообщение May 24 2010, 13:32
Сообщение #2


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата
Поправил make-файл студии, долго правил...

Скорее всего, вместо <TAB> в отступе у вас стоят пробелы.
GNU-сный make этого не любит
Либо ещё один знатный прикол - пробелы в конце строки


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 24 2010, 14:37
Сообщение #3


Гуру
******

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



Цитата(swisst @ May 24 2010, 16:03) *
output/crc.o:1: *** missing separator. Stop.
А какой у вас стоит make? Какой-то достаточно старый, еще из цыгвина, не понимал двоеточие (C:\) в именах файлов в файлах зависимостей (.d). Удаляя папку вы удаляете файлы зависимостей и make их не считывает. Возьмите свежий make из mingw/msys.


--------------------
На любой вопрос даю любой ответ
"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
swisst
сообщение May 24 2010, 18:15
Сообщение #4


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

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



Цитата(MrYuran @ May 24 2010, 16:32) *
Скорее всего, вместо <TAB> в отступе у вас стоят пробелы.
GNU-сный make этого не любит
Либо ещё один знатный прикол - пробелы в конце строки


таки да. в АВР Студии вот эта строчка работает
Код
## Other dependencies
-include $(shell mkdir output 2>/dev/null) $(wildcard output/*)


в Eclipse добавил [Tab]:

Код
## Other dependencies
[Tab]-include $(shell mkdir output 2>/dev/null) $(wildcard output/*)


вышеупомянутая ошибка ушла...

Цитата(Сергей Борщ @ May 24 2010, 17:37) *
А какой у вас стоит make? Какой-то достаточно старый, еще из цыгвина, не понимал двоеточие (C:\) в именах файлов в файлах зависимостей (.d). Удаляя папку вы удаляете файлы зависимостей и make их не считывает. Возьмите свежий make из mingw/msys.



Код
C:\WinAVR-20100110\utils>make -v
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for i386-pc-mingw32


Код
C:\MinGW\bin>mingw32-make -v
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for i386-pc-mingw32



теперь уперся в clean...очищаю так:
Код
## Clean target
.PHONY:    clean
clean:
    -rm -rf $(OBJECTS) $(PROJECT).elf output/* $(PROJECT).hex $(PROJECT).eep $(PROJECT).lss $(PROJECT).map

формат строки взят из makefile АВР Студии, переделал под проект Eclipse...все файлы и папка output очищается...только вот получаю следующее:
Код
**** Clean-only build of configuration Default for project AVR_Test ****

make clean
rm -rf output/crc.o output/indic.o output/keyboard.o output/main.o output/mb_slave.o output/measure.o output/menu.o output/parametr.o output/timer.o output/usart.o TI-TK.elf output/* TI-TK.hex TI-TK.eep TI-TK.lss TI-TK.map
include  output/crc.o output/crc.o.d output/indic.o output/indic.o.d output/keyboard.o output/keyboard.o.d output/main.o output/main.o.d output/mb_slave.o output/mb_slave.o.d output/measure.o output/measure.o.d output/menu.o output/menu.o.d output/parametr.o output/parametr.o.d output/timer.o output/timer.o.d output/usart.o output/usart.o.d
process_begin: CreateProcess(NULL, include output/crc.o output/crc.o.d output/indic.o output/indic.o.d output/keyboard.o output/keyboard.o.d output/main.o output/main.o.d output/mb_slave.o output/mb_slave.o.d output/measure.o output/measure.o.d output/menu.o output/menu.o.d output/parametr.o output/parametr.o.d output/timer.o output/timer.o.d output/usart.o output/usart.o.d, ...) failed.
make (e=2): Не удается найти указанный файл.

make: [clean] Error 2 (ignored)
Go to the top of the page
 
+Quote Post
XVR
сообщение May 25 2010, 06:59
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата
в Eclipse добавил [Tab]:
Отключив таким образом все зависимости wacko.gif
Цитата
clean:
-rm -rf $(OBJECTS) $(PROJECT).elf output/* $(PROJECT).hex $(PROJECT).eep $(PROJECT).lss $(PROJECT).map
Нету в Windows команды rm Или ставьте cygwin или меняйте rm на del
Go to the top of the page
 
+Quote Post
swisst
сообщение May 25 2010, 07:19
Сообщение #6


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

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



Цитата(XVR @ May 25 2010, 09:59) *
Отключив таким образом все зависимости wacko.gif
Нету в Windows команды rm Или ставьте cygwin или меняйте rm на del


дело в том, что проект собирается "как надо" - я сравниваю hex-файлы, созданные в студии (без своего вмешательства) и в Еклипсе (с правленым makefile). Тоже самое касается clean - все файлы, которые я указываю очистить - очищаются...смущает только сообщение об ошибке...

makefile я редактирую Студийный (предполагая, что он заведомо правильный и рабочий), потом сталкиваюсь с ситуацией, когда одна и та же строка ведет себя по разному (касательно Other dependencies)...
Go to the top of the page
 
+Quote Post
XVR
сообщение May 25 2010, 07:33
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(swisst @ May 25 2010, 11:19) *
дело в том, что проект собирается "как надо" - я сравниваю hex-файлы, созданные в студии (без своего вмешательства) и в Еклипсе (с правленым makefile). Тоже самое касается clean - все файлы, которые я указываю очистить - очищаются...смущает только сообщение об ошибке...
присмотрелся внимательнее - он ругается не на rm, а на ваш include. Теперь он трактует его как команду для выполнения.

Вообще вот это -
Код
-include $(shell mkdir output 2>/dev/null) $(wildcard output/*)
немного бред - эта строка пытается текстуально включить ВСЕ файлы из директории output в текущий makefile. Может все же в там не $(wildcard output/*), а что нибудь типа $(wildcard dep/*)?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение May 25 2010, 07:46
Сообщение #8


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

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



Цитата(XVR @ May 25 2010, 13:33) *
Может все же в там не $(wildcard output/*), а что нибудь типа $(wildcard dep/*)?

Судя по мейк-файлу, надо
Код
$(wildcard output/*.d)


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
swisst
сообщение May 25 2010, 08:38
Сообщение #9


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

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



Цитата(XVR @ May 25 2010, 10:33) *
присмотрелся внимательнее - он ругается не на rm, а на ваш include. Теперь он трактует его как команду для выполнения.


Вы правы...откатился до предыдущей ошибки...

Код
make all
output/crc.o:1: *** missing separator.  Stop.
Go to the top of the page
 
+Quote Post
swisst
сообщение May 27 2010, 16:24
Сообщение #10


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

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



разрулил. makefile обновил.

руками (или в Еклипс) создается каталог проекта, в каталог проекта помещаются файлы *.c и *.h, makefile. компилируются все файлы *.с, находящиеся в папке проекта (асм и срр - не добавлял пока).

после сборки:
- в каталоге проекта создается - elf, hex, eep, lst и map файлы.
- создается каталог object, в который пишутся объектные файлы.
- создается каталог dep, в который пишутся файлы зависимостей *.d.
Прикрепленные файлы
Прикрепленный файл  makefile.txt ( 2.74 килобайт ) Кол-во скачиваний: 50
 
Go to the top of the page
 
+Quote Post
MrYuran
сообщение May 28 2010, 03:41
Сообщение #11


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Вот ещё некоторая автоматизация, если исходники разбиты на модули и раскиданы по подпапкам внутри основного проекта (обычно так и делается)
Код
MODULES =  main
MODULES +=  measure
MODULES +=  utils
MODULES +=  ds2433
#....

SRCDIRS = $(PROJECT_ROOT)/ $(addprefix $(PROJECT_ROOT)/,$(MODULES))
INCLUDES  = -I$(PROJECT_ROOT)/ $(addprefix -I$(PROJECT_ROOT)/,$(MODULES))

CSRC    = $(wildcard $(addsuffix /*.c,$(SRCDIRS)))
CPPSRC  = $(wildcard $(addsuffix /*.cpp,$(SRCDIRS)))
ASRC    = $(wildcard $(addsuffix /*.s,$(SRCDIRS)))


Теперь CSRC - список си-исходников с путями, CPPSRC - cpp, ASRC - ассемблерные файлы.
INCLUDES - список ключей поиска.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 28 2010, 07:04
Сообщение #12


Гуру
******

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



Цитата(MrYuran @ May 28 2010, 06:41) *
Код
INCLUDES  = -I$(PROJECT_ROOT)/ $(addprefix -I$(PROJECT_ROOT)/,$(MODULES))
Код
INCLUDES  = -I$(PROJECT_ROOT)/
INCLUDES += $(if $(MODULES),$(addprefix -I$(PROJECT_ROOT)/,$(MODULES)),)
Теперь MODULES может быть пустым.


--------------------
На любой вопрос даю любой ответ
"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
Ko4egap
сообщение Jun 8 2010, 14:06
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 63
Регистрация: 17-09-09
Пользователь №: 52 434



Я попробовав make, понял что она мне не нравится, наткнулся на этом же форуме на совет использовать scons (python-based аналог make).
Доволен как слон.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 21:37
Рейтинг@Mail.ru


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