Если условия в файле Makefile, внутри цели
Я пытаюсь настроить Makefile, который будет искать и копировать некоторые файлы (условие if-else), и я не могу понять, что именно с ним не так? (ты я уверен, что это потому, что комбинация пробелов / вкладок написана в неправильном месте). Мне нужна помощь, пожалуйста?
вот что у меня есть в настоящее время:
obj-m = linuxmon.o
KDIR = /lib/modules/$(shell uname -r)/build
UNAME := $(shell uname -m)
all:
$(info Checking if custom header is needed)
ifeq ($(UNAME), x86_64)
$(info Yes)
F1_EXISTS=$(shell [ -e /usr/include/asm/unistd_32.h ] && echo 1 || echo 0 )
ifeq ($(F1_EXISTS), 1)
$(info Copying custom header)
$(shell sed -e 's/__NR_/__NR32_/g' /usr/include/asm/unistd_32.h > unistd_32.h)
else
F2_EXISTS=$(shell [[ -e /usr/include/asm-i386/unistd.h ]] && echo 1 || echo 0 )
ifeq ($(F2_EXISTS), 1)
$(info Copying custom header)
$(shell sed -e 's/__NR_/__NR32_/g' /usr/include/asm-i386/unistd.h > unistd_32.h)
else
$(error asm/unistd_32.h and asm-386/unistd.h does not exist)
endif
endif
$(info No)
endif
@make -C $(KDIR) M=$(PWD) modules
clean:
make -C $(KDIR) M=$(PWD) clean
rm unistd_32.h
В любом случае, это будет печатать "да", "копирование заголовка" дважды, а затем он перестанет говорить, что sed не может читать /usr/include/asm-i386/unistd.h
(что, конечно, не может читать как я на системе x64).
Я мог бы сказать, что make
просто не понимает if / else и вместо этого запускает все строка за строкой.
2 ответов
здесь есть несколько проблем, поэтому я начну с моего обычного совета высокого уровня:начните с малого и простого, добавляйте сложность немного за раз, тестируйте на каждом шаге и никогда не добавляйте в код, который не работает. (я действительно должен был иметь это hotkeyed.)
вы смешиваете синтаксис Make и синтаксис оболочки таким образом, что это просто головокружительно. Вы не должны были позволять ему стать таким большим без тестирования. Давайте начнем снаружи и работать внутренне.
UNAME := $(shell uname -m)
all:
$(info Checking if custom header is needed)
ifeq ($(UNAME), x86_64)
... do some things to build unistd_32.h
endif
@make -C $(KDIR) M=$(PWD) modules
Итак, вы хотите unistd_32.H построен (возможно), прежде чем вызывать второй make
, вы можете сделать его обязательным условием. И поскольку вы хотите этого только в определенном случае, вы можете поставить его в условное:
ifeq ($(UNAME), x86_64)
all: unistd_32.h
endif
all:
@make -C $(KDIR) M=$(PWD) modules
unistd_32.h:
... do some things to build unistd_32.h
сейчас в здании unistd_32.h
:
F1_EXISTS=$(shell [ -e /usr/include/asm/unistd_32.h ] && echo 1 || echo 0 )
ifeq ($(F1_EXISTS), 1)
$(info Copying custom header)
$(shell sed -e 's/__NR_/__NR32_/g' /usr/include/asm/unistd_32.h > unistd_32.h)
else
F2_EXISTS=$(shell [[ -e /usr/include/asm-i386/unistd.h ]] && echo 1 || echo 0 )
ifeq ($(F2_EXISTS), 1)
$(info Copying custom header)
$(shell sed -e 's/__NR_/__NR32_/g' /usr/include/asm-i386/unistd.h > unistd_32.h)
else
$(error asm/unistd_32.h and asm-386/unistd.h does not exist)
endif
endif
вы пытаетесь построить unistd.h
С unistd_32.h
; единственный трюк в том, что unistd_32.h
может быть в любом из двух мест. Самый простой способ очистить это-использовать vpath
директива:
vpath unistd.h /usr/include/asm /usr/include/asm-i386
unistd_32.h: unistd.h
sed -e 's/__NR_/__NR32_/g' $< > $@
вы можете просто использовать команды оболочки. Если вы хотите подавить Эхо вывода, используйте знак"@". Например:
clean:
@if [ "test" = "test" ]; then\
echo "Hello world";\
fi
обратите внимание, что необходимо закрыть "; "и"\".