У меня имеется список исходных файлов и список файлов в которые они должны быть скомпилированы.
SRCS = ./a/prog1.c ./a/b/prog2.c ./a/b/c/prog3.c
OUTS = ./outs/prog1.out ./outs/prog2.out ./outs/prog3.out
.PHONY: all
SRCS = ./a/prog1.c ./a/b/prog2.c ./a/b/c/prog3.c
OUTS = ./outs/prog1.out ./outs/prog2.out ./outs/prog3.out
all: $(OUTS)
define make_rule =
$(firstword $(1)): $(firstword $(2))
@echo compile $$< to $$@
gcc $$< -o $$@
$(if $(wordlist 2,$(words $(1)),$(1)),
$(eval $(call make_rule,
$(wordlist 2,$(words $(1)),$(1)),
$(wordlist 2,$(words $(2)),$(2)))))
endef
$(eval $(call make_rule,$(OUTS),$(SRCS)))зачем с помощью инклуда в Makefile_a указывать путь к Makefile_aa, и во втором указывать тоже путь к файлам как будто это делаеться из Makefile_a?
пишет, что не может найти "efi.h", хотя он есть в папке inc из Makefile
inc определённую в 7й строке, то ты её нигде не использовал, а сами по себе переменные с произвольными именами в Makefile ничего не значат.gcc -fshort-wchar -I -I/ -I/usr/include -O2 -Wall -fpic -DEFI_FUNCTION_WRAPPER -ffreestanding -nostdlib -c main.c -o main.o main.c:1:10: фатальная ошибка: efi.h: Нет такого файла или каталога
-I ты не указал своего каталога inc, как по-твоему компилятор должен понять, что efi.h нужно там искать?-I$(EFIINC)EFIINC, откуда ты ожидаешь что она возьмётся?inc на EFIINC, lib на EFILIB, crtobj на CRTOBJ и т. д. У меня есть два make-файла, первый вызывает второй.
Мне хотелось бы получить некоторые данные из второго make-файла.
Почему вылезает сообщение «make: «build» не требует обновления»?
build: $(SOURCES)
mv *.o ./build и rm -rf build/* делают его новее исходников, поэтому make считает, что обновлять его не надо. Помогите разобраться - хотя бы куда копать
#if defined (_MSC_VER) на #if defined (_MSC_VER) || 1. dch -v $$VERSIONexport VERSION=$(shell read -p "Version: ";echo $$REPLY) экспортирует переменную внутри shell, а $(VERSION) ссылается на переменную make а не на переменную shell.Как вариант, подойдет `make dchv 1.3.4` , но научить makefile такое делать - лютый геморрой :(
make dchv VERSION=1.3.4 и выкинуть код по вводу переменной VERSION из правила dchv, т.е. оставить только dch -v $(VERSION) создал мэйк файл с помощью утилиты autotools. все получилось кроме настройки make install.
дополнительные папки с конфигами и картинками.
install-data-local. Как бы Вы написали в makefile если бы у Вас имелось 0.c 1.c 2.c 3.h? Заголовочник 3.h для всех исходников
OBJS := 0.o 1.o 2.o # список объектников, который нам понадобится в двух местах
all: exe # традиционно сборка всего называется all. all зависит от единственного файла: exe
exe: $(OBJS) # файл exe зависит от объектникоа
$(CC) $(LDFLAGS) -o $@ $^ # чтобы собрать exe -- вызвать компилятор, передать ему LDFLAGS, выводить в $@ (т.е. в exe), на вход брать $^ (т.е. всё от чего зависит $@)
%.o: %.c 3.h # объектники зависят от исходников с таким же именем, а так же от 3.h
$(CC) -c $(CFLAGS) -o $@ $< # чтобы собрать объектник -- вызвать компилятор с ключом -c, передать ему CFLAGS, выводить в $@ (т.е. в %.o), компилировать $< (т.е. %.с с тем же именем)
clean: # традиционно очистка всего называется clean
-rm -f $(OBJS) exe # для очистки удалить объектники и exe
.PHONY: all clean # all и clean -- это не файлы if .... Есть всякие другие. Вам, похоже, подойдёт ifdef ...if ... есть в языке automake, но чтобы получить рабочий Makefile, исходный Makefile.am нужно прогнать через automake, а получившийся Makefile.in нужно прогнать через configure. Как мне избавится от дублирования кода, который одинаковый для нескольких целей, однако, отличается именами файлов(пусть имена файлов совпадают с названием целей)?
define generate-targets
$(1):
make -j5 TARGET=unwired BOARD=$$(BOARD)/$$(CPU) -f makefiles/Makefile.$$@
../bootloader/generate-metadata/generate-metadata $$@.bin 0x0 0x01A00001 1
srec_cat firmware-metadata.bin -binary $$@.bin -binary -offset 0x100 -o $$@-ota-image.bin -binary
rm $$@.hex
$(1)-fb: $(1)-CLEAN
../../tools/backdoor-bootloader.py -e -w -v $(1)-firmware.hex
$(1)-f: $(1)-CLEAN
/Applications/ti/Uniflash/flash_cc1310.sh $(1)-firmware.hex
$(1)-ota: $(1)
scp $(1)-ota-image.bin root@192.168.20.187:/root/unwired_smarthome
endef$(eval $(call generate-targets,ubrige))build/obj/%.obj: %.cpp $(USER_CFG_H_FILE) $(FREE_RTOS_H_FILE)FREE_RTOS_H_FILE := FreeRTOS_for_stm32f2/include/FreeRTOS.hFREE_RTOS_H_FILE := FreeRTOS_for_stm32f2/FreeRTOS.h