У меня имеется список исходных файлов и список файлов в которые они должны быть скомпилированы.
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 $$VERSION
export 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.h
FREE_RTOS_H_FILE := FreeRTOS_for_stm32f2/FreeRTOS.h