|
Автомэйк в GCC, как заставить компилировать все исходники |
|
|
|
Jun 29 2009, 12:57
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 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 =)
|
|
|
|
|
Jun 29 2009, 13:11
|

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

|
Цитата(andrew_b @ Jun 29 2009, 17:00)  make -B ? Что это значит? Не совсем понимаю... Точнее, совсем не понимаю. Мне кажется, должен запускаться отдельный проход компилятора, который и ищет зависимости. Или мне это приснилось?
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Jun 29 2009, 13:13
|

инопланетянин
  
Группа: Свой
Сообщений: 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" или посмотрите по форуму.. существует весьма доходчивая литература в т.ч. на русском Отредактировал: Только сейчас понял что вы хотели, к сожалению, не знаю можно ли это делать или нет, но думаю что смысла в этом нет, ибо исходники лучше хранить с мэйк-файлом вместе и никуда их не терять и не разбрасывать
|
|
|
|
|
Jun 29 2009, 15:20
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Jun 30 2009, 06:47
|

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

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Jun 30 2009, 07:13
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 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 =)
|
|
|
|
|
Jun 30 2009, 07:33
|
Профессионал
    
Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757

|
Цитата(MrYuran @ Jun 30 2009, 10:47)  Пришлось таки лезть в документацию... нет такой буквы в этом слове. Цитата -B, --always-make Unconditionally make all targets. GNU Make 3.81
|
|
|
|
|
Jun 30 2009, 07:53
|

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

|
Цитата(MrYuran @ Jun 30 2009, 10:13)  Тоже так думал, протабулировал, результат не изменился. Скопировал текст из форума в файл. Заменил в каждой команде начальные пробелы на табуляторы. Скопировал исходник (.cpp) в ту же папку. Запустил. Работает. Заменил в правиле $(OBJDIR)/%.o: %.cpp перед @echo табулятор на пробел. Получил то же сообщение, что и вы. Чем еще могу помочь? Прикрепляю файл. Цитата(MrYuran @ Jun 30 2009, 10:13)  А вот этот кусок
чем вызывается? А доку почитать?  Эти команды выполняются в момент чтения мейк-файла.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jun 30 2009, 08:40
|

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

|
Цитата(Сергей Борщ @ Jun 30 2009, 11:53)  А доку почитать?  Ну это как обычно, если уже совсем ничего не выходит... Похоже, как раз такой случай... Цитата 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 =)
|
|
|
|
|
Jun 30 2009, 09:30
|

Гуру
     
Группа: Модераторы
Сообщений: 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))
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|