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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Автомэйк в GCC, как заставить компилировать все исходники
MrYuran
сообщение Jun 29 2009, 12:57
Сообщение #1


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

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



Есть такой мэйкфайл:
Код
SRC = \
main/main.c \
main/process_MB.c \
measure/measure.c \
measure/temperature.c \
utils/utils.c \
...
# Define all object files.
#
OBJ = $(SRC:.c=.o)

Вроде бы нетрудно перечислить все файлы проекта, но их становится со временем всё больше, потом начинаются тасования из проекта в проект...
И вот вроде попадалось где-то на глаза, что мэйк может сам найти все исходники и построить все зависимости.

Вопрос: как это сделать?


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Jun 29 2009, 13:00
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



make -B ?
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jun 29 2009, 13:11
Сообщение #3


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

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



Цитата(andrew_b @ Jun 29 2009, 17:00) *
make -B ?

Что это значит?
Не совсем понимаю... Точнее, совсем не понимаю.

Мне кажется, должен запускаться отдельный проход компилятора, который и ищет зависимости.
Или мне это приснилось?


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Legotron
сообщение Jun 29 2009, 13:13
Сообщение #4


инопланетянин
***

Группа: Свой
Сообщений: 236
Регистрация: 24-12-06
Из: Питер
Пользователь №: 23 832



Выделяем папки:
Код
MODULES := ../src \
              ../inc \
          ../src/scmRTOS/Common \
          ../src/scmRTOS/AVR \

Пример зависимости: *.o от *.с
Код
$(OBJDIR)/%.o : %.c
       echo ====  Compiling {:content:}lt;; \
       $(CC) -c $(CFLAGS) $(addprefix -I,$(INCDIRS)) \
       -Wa,-ahlmsd=$(LSTDIR)/$(notdir $(<:.c=.lst)) {:content:}lt; -o $@

Этого вполне хватает... вообще посмотрите как написаны чужие мэйк-файлы(например scmRTOS) и погуглите "makefile" или посмотрите по форуму.. существует весьма доходчивая литература в т.ч. на русском

Отредактировал: Только сейчас понял что вы хотели, к сожалению, не знаю можно ли это делать или нет, но думаю что смысла в этом нет, ибо исходники лучше хранить с мэйк-файлом вместе и никуда их не терять и не разбрасывать smile.gif
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jun 29 2009, 13:29
Сообщение #5


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

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



Цитата(Legotron @ Jun 29 2009, 17:13) *
.. существует весьма доходчивая литература в т.ч. на русском

В очередной раз мечтаю купить Гриффитса или что-то подобное в бумаге...


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 29 2009, 15:20
Сообщение #6


Гуру
******

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



Цитата(Legotron @ Jun 29 2009, 16:13) *
Выделяем папки:
Ищем в них все исходники, формируем из их имен имена объектников и указываем vpath искать исходники для этих объектников в папках, ну а дальше зависимость .o от .c, .cpp, .S:
Код
SRCDIRS = . $(addprefix $(PROJ_SRCTOP)/,$(MODULES))
CSRC    = $(wildcard $(addsuffix /*.c,$(SRCDIRS)))
CPPSRC    = $(wildcard $(addsuffix /*.cpp,$(SRCDIRS)))
ASRC    = $(wildcard $(addsuffix /*.s,$(SRCDIRS)))
## Objects that must be built in order to link
OBJ = $(addprefix $(OBJDIR)/,$(notdir $(CSRC:.c=.o) $(CPPSRC:.cpp=.o) $(ASRC:.s=.o) ))

# search path for common sources and headers
vpath
vpath %.c $(SRCDIRS)
vpath %.cpp $(SRCDIRS)
vpath %.h $(SRCDIRS)
vpath %.s $(SRCDIRS)

## Compile
$(OBJDIR)/%.o: %.c
    @echo Compiling: $<
    $(CC) $(INCLUDES) $(CFLAGS) -Wa,-ahlmsd=$(LSTDIR)/$(notdir $(<:.c=.lst)) -c  $< -o $@
$(OBJDIR)/%.o: %.cpp
    @echo Compiling: $<
    $(CC) $(INCLUDES) $(CFLAGS) -Wa,-ahlmsd=$(LSTDIR)/$(notdir $(<:.cpp=.lst)) -c  $< -o $@
$(OBJDIR)/%.o: %.S
    @echo Assembling: $<
    $(CC) $(INCLUDES) $(ASMFLAGS) -Wa,-ahlmsd=$(LSTDIR)/$(notdir $(<:.S=.lst)) -c  $< -o $@


--------------------
На любой вопрос даю любой ответ
"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
MrYuran
сообщение Jun 30 2009, 05:19
Сообщение #7


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

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



А что такое PROJ_SRCTOP ?
Корень проекта?


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jun 30 2009, 06:47
Сообщение #8


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

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



Цитата(andrew_b @ Jun 29 2009, 17:00) *
make -B ?

Пришлось таки лезть в документацию... нет такой буквы в этом слове.
Вот что у меня получилось (смесь старого с новым)
CODE

CC = msp430-gcc
OBJCOPY = msp430-objcopy
OBJDUMP = msp430-objdump
RM = rm -f

NAME = 1102U_430_00_00
MCU = msp430x169
#DEBUG =
OPT = -O3

#INCLUDES =

PROJ_SRCTOP = 1102U_430_00_00
OBJDIR = obj/

MODULES = \
main \
measure \
utils \
timerb \
flash \
gen \
AD7708


CFLAGS = -mmcu=$(MCU) $(OPT) $(DEBUG) -DGCC_MSP430 -std=gnu99 \
-ffunction-sections $(INCL)


#-fno-gcse -fno-gcse-lm -fno-gcse-sm
#-std=c99
#-fdata-sections

LDFLAGS = -mmcu=$(MCU) -Wl,-Map=$*.map,--cref \
-Wl,--section-start -Wl,.seg_a=0x1080

#
# Source files for the project.
#
#SRC = \
#main/main.c \
#main/process_MB.c \
#measure/measure.c \
#measure/temperature.c \
#utils/utils.c \
#timerb/timerb.c \
#flash/flash.c \
#gen/gen.c \
#AD7708/AD7708.c\
#Forth/kernel.c

#
# Define all object files.
#
#OBJ = $(SRC:.c=.o)


#SRCDIRS = ./ $(addprefix $(PROJ_SRCTOP)/,$(MODULES))
SRCDIRS = ./ $(MODULES)
CSRC = $(wildcard $(addsuffix /*.c,$(SRCDIRS)))
CPPSRC = $(wildcard $(addsuffix /*.cpp,$(SRCDIRS)))
ASRC = $(wildcard $(addsuffix /*.s,$(SRCDIRS)))
## Objects that must be built in order to link
OBJ = $(OBJDIR)/,$(notdir $(CSRC:.c=.o) $(CPPSRC:.cpp=.o) $(ASRC:.s=.o) ))

# search path for common sources and headers
vpath
vpath %.c $(SRCDIRS)
vpath %.cpp $(SRCDIRS)
vpath %.h $(SRCDIRS)
vpath %.s $(SRCDIRS)

## Compile
$(OBJDIR)/%.o: %.c
@echo Compiling: $<
$(CC) $(INCLUDES) $(CFLAGS) -Wa,-ahlmsd=$(LSTDIR)/$(notdir $(<:.c=.lst)) -c $< -o $@
$(OBJDIR)/%.o: %.cpp
@echo Compiling: $<
$(CC) $(INCLUDES) $(CFLAGS) -Wa,-ahlmsd=$(LSTDIR)/$(notdir $(<:.cpp=.lst)) -c $< -o $@
$(OBJDIR)/%.o: %.S
@echo Assembling: $<
$(CC) $(INCLUDES) $(ASMFLAGS) -Wa,-ahlmsd=$(LSTDIR)/$(notdir $(<:.S=.lst)) -c $< -o $@
OBJ = $(.c=.o)

all: $(NAME).elf $(NAME).lst

$(NAME).elf : $(OBJ) makefile
$(CC) $(OBJ) $(LDFLAGS) -o $@

$(NAME).lst : $(NAME).elf
$(OBJDUMP) -dStl $^ >$@

$(OBJ) : %.o : %.c makefile
$(CC) -c $(CFLAGS) $< -o $@

clean :
touch makefile

Что-то не то:
make.exe: Nothing to be done for `@echo'.
Process terminated with status 0 (0 minutes, 0 seconds)
0 errors, 0 warnings
Я конечно читаю, анализирую, но хочется побыстрее, а получается как всегда..


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


Гуру
******

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



Цитата(MrYuran @ Jun 30 2009, 09:47) *
Что-то не то:
make.exe: Nothing to be done for `@echo'.
При копировании из форума у вас потерялись табуляторы перед вызовами команд (в т.ч. и перед @echo).
Цитата
Код
CFLAGS    = -mmcu=$(MCU) $(OPT) $(DEBUG) -DGCC_MSP430 -std=gnu99 \
    -ffunction-sections $(INCL)
лучше каждый ключ вынести в отдельную строку. Так легче исключать комментированием один из ключей и легче добавлять новые копированием и правкой целых строк:
Код
CFLAGS =
CFLAGS += $(COMMON)
CFLAGS += -Wall
#CFLAGS += -gdwarf-2
CFLAGS += -Os
CFLAGS += -fsigned-char -funsigned-bitfields -fshort-enums
CFLAGS += -MD -MP -MT $(OBJDIR)/$(*F).o -MF $(DEPDIR)/$(@F).d
CFLAGS += -ffunction-sections
CFLAGS += -fdata-sections


--------------------
На любой вопрос даю любой ответ
"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
MrYuran
сообщение Jun 30 2009, 07:13
Сообщение #10


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

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



Цитата(Сергей Борщ @ Jun 30 2009, 11:05) *
При копировании из форума у вас потерялись табуляторы перед вызовами команд (в т.ч. и перед @echo).

Тоже так думал, протабулировал, результат не изменился.
А вот этот кусок
Цитата
# search path for common sources and headers
vpath
vpath %.c $(SRCDIRS)
vpath %.cpp $(SRCDIRS)
vpath %.h $(SRCDIRS)
vpath %.s $(SRCDIRS)

чем вызывается?


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Jun 30 2009, 07:33
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(MrYuran @ Jun 30 2009, 10:47) *
Пришлось таки лезть в документацию... нет такой буквы в этом слове.

Цитата
-B, --always-make
Unconditionally make all targets.

GNU Make 3.81
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 30 2009, 07:53
Сообщение #12


Гуру
******

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



Цитата(MrYuran @ Jun 30 2009, 10:13) *
Тоже так думал, протабулировал, результат не изменился.
Скопировал текст из форума в файл. Заменил в каждой команде начальные пробелы на табуляторы. Скопировал исходник (.cpp) в ту же папку. Запустил. Работает. Заменил в правиле $(OBJDIR)/%.o: %.cpp перед @echo табулятор на пробел. Получил то же сообщение, что и вы. Чем еще могу помочь? Прикрепляю файл.
Цитата(MrYuran @ Jun 30 2009, 10:13) *
А вот этот кусок

чем вызывается?
А доку почитать? wink.gif Эти команды выполняются в момент чтения мейк-файла.
Прикрепленные файлы
Прикрепленный файл  makefile.zip ( 988 байт ) Кол-во скачиваний: 28
 


--------------------
На любой вопрос даю любой ответ
"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
MrYuran
сообщение Jun 30 2009, 08:40
Сообщение #13


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

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



Цитата(Сергей Борщ @ Jun 30 2009, 11:53) *
А доку почитать? wink.gif

Ну это как обычно, если уже совсем ничего не выходит... Похоже, как раз такой случай...
Цитата
touch makefile
msp430-gcc -mmcu=msp430x169 -Wl,-Map=.map,--cref -Wl,--section-start -Wl,.seg_a=0x1080 -o 1102U_430_00_00.elf
c:\mspgcc\bin\..\lib\gcc-lib\msp430\3.2.3\libgcc.a(__jump_to_main.o): In function `__jump_to_main':
(.init9+0x2): undefined reference to `main'
make.exe: *** [1102U_430_00_00.elf] Error 1
Process terminated with status 2 (0 minutes, 0 seconds)
1 errors, 0 warnings

Не находит исходников, хоть ты тресни...
Я даже main.c в корень проекта скопировал, та же байда.
команда на билд - $make -f $makefile [all]
Эх, не живётся спокойно, вечно надо что-то оптимизировать...
Всё от лени... Таки пришло время make изучать...


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


Гуру
******

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



Цитата(MrYuran @ Jun 30 2009, 11:40) *
Не находит исходников, хоть ты тресни...
Во-первых вы потеряли OBJ = $(addprefix
Во-вторых вы эту переменную зачем-то потом переписываете: OBJ = $(.c=.o)
В третьих, вы заводите лишнее правило: $(OBJ) : %.o : %.c makefile

P.S. очень помогает распечатка переменных в некоторых точках через @echo $(OBJ) или $(info $(OBJ))
Прикрепленные файлы
Прикрепленный файл  makefile.zip ( 965 байт ) Кол-во скачиваний: 25
 


--------------------
На любой вопрос даю любой ответ
"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
MrYuran
сообщение Jun 30 2009, 10:02
Сообщение #15


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

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



Спасибо огромное, заработало!!!
правда, я ещё немного подточил в части
PROJ_SRCTOP = .
OBJDIR = $(PROJ_SRCTOP)/obj/
но не суть.
В целом начал потихоньку въезжать в суть мэйкфайл-мэйкерства.
Года два назад скачал небольшую памятку по этому вопросу, и даже распечатал.
Но сейчас она безнадёжно завалена в грудах барахла... Как на столе/в ящиках, так и на винте


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post

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

 


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


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