|
|
  |
Помогите с Makefile, *** missing separator. Stop. |
|
|
|
May 24 2010, 13:03
|
Частый гость
 
Группа: Свой
Сообщений: 163
Регистрация: 16-02-07
Из: Харьков
Пользователь №: 25 425

|
Решил попробовать пересесть на Eclipse с AVR Studio. К тому же всегда интересовала работа утилиты make. В общем задача ставилась простая: взять исходники рабочего проекта из студии -> перенести их в проект Eclipse, подправить/написать makefile для проекта Eclipse, собрать проект, получить нужные файлы на выходе и сравнить их со студийными. Если файлы идентичны - задачу осилил. Разобрался с Eclipse, AVR плагином к нему и автоатическим генерированием makefile - hex-файлы не совпали (скорее всего какие-то ключи указаны/не_указаны). Дальше начал штудировать make, честно говоря, по-началу -  каша в голове, потом пришло понимание... Поправил 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 - проект собирается... подскажите, где я накосячил или чего не сделал/переделал...
|
|
|
|
|
May 24 2010, 13:32
|

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

|
Цитата Поправил make-файл студии, долго правил... Скорее всего, вместо <TAB> в отступе у вас стоят пробелы. GNU-сный make этого не любит Либо ещё один знатный прикол - пробелы в конце строки
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
May 24 2010, 18:15
|
Частый гость
 
Группа: Свой
Сообщений: 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)
|
|
|
|
|
May 25 2010, 06:59
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата в Eclipse добавил [Tab]: Отключив таким образом все зависимости Цитата clean: -rm -rf $(OBJECTS) $(PROJECT).elf output/* $(PROJECT).hex $(PROJECT).eep $(PROJECT).lss $(PROJECT).map Нету в Windows команды rm Или ставьте cygwin или меняйте rm на del
|
|
|
|
|
May 25 2010, 07:19
|
Частый гость
 
Группа: Свой
Сообщений: 163
Регистрация: 16-02-07
Из: Харьков
Пользователь №: 25 425

|
Цитата(XVR @ May 25 2010, 09:59)  Отключив таким образом все зависимости Нету в Windows команды rm Или ставьте cygwin или меняйте rm на del дело в том, что проект собирается "как надо" - я сравниваю hex-файлы, созданные в студии (без своего вмешательства) и в Еклипсе (с правленым makefile). Тоже самое касается clean - все файлы, которые я указываю очистить - очищаются...смущает только сообщение об ошибке... makefile я редактирую Студийный (предполагая, что он заведомо правильный и рабочий), потом сталкиваюсь с ситуацией, когда одна и та же строка ведет себя по разному (касательно Other dependencies)...
|
|
|
|
|
May 25 2010, 07:33
|
Гуру
     
Группа: Свой
Сообщений: 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/*)?
|
|
|
|
|
May 25 2010, 07:46
|

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

|
Цитата(XVR @ May 25 2010, 13:33)  Может все же в там не $(wildcard output/*), а что нибудь типа $(wildcard dep/*)? Судя по мейк-файлу, надо Код $(wildcard output/*.d)
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
May 25 2010, 08:38
|
Частый гость
 
Группа: Свой
Сообщений: 163
Регистрация: 16-02-07
Из: Харьков
Пользователь №: 25 425

|
Цитата(XVR @ May 25 2010, 10:33)  присмотрелся внимательнее - он ругается не на rm, а на ваш include. Теперь он трактует его как команду для выполнения. Вы правы...откатился до предыдущей ошибки... Код make all output/crc.o:1: *** missing separator. Stop.
|
|
|
|
|
May 27 2010, 16:24
|
Частый гость
 
Группа: Свой
Сообщений: 163
Регистрация: 16-02-07
Из: Харьков
Пользователь №: 25 425

|
разрулил. makefile обновил. руками (или в Еклипс) создается каталог проекта, в каталог проекта помещаются файлы *.c и *.h, makefile. компилируются все файлы *.с, находящиеся в папке проекта (асм и срр - не добавлял пока). после сборки: - в каталоге проекта создается - elf, hex, eep, lst и map файлы. - создается каталог object, в который пишутся объектные файлы. - создается каталог dep, в который пишутся файлы зависимостей *.d.
|
|
|
|
|
May 28 2010, 03:41
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 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 =)
|
|
|
|
|
May 28 2010, 07:04
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Jun 8 2010, 14:06
|
Участник

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

|
Я попробовав make, понял что она мне не нравится, наткнулся на этом же форуме на совет использовать scons (python-based аналог make). Доволен как слон.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|