いくつかのファイル(if-else条件)を検索してコピーするMakefileをセットアップしようとしていますが、正確に何が問題なのかわかりませんか? (これは、スペース/タブの組み合わせが間違った場所に記述されているためだと確信しています)。助けてもらえますか?
現在私が持っているものは次のとおりです。
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
とにかく、「Yes」、「Copying header」を2回出力すると、sedが/usr/include/asm-i386/unistd.h
(もちろんx64システム上で読み取れないため)を読み取れないと言って終了します。 。 make
はif/elseを理解しておらず、代わりにすべてを1行ずつ実行していると言えます。
ここにはいくつかの問題があるので、通常の高レベルのアドバイスから始めます。 小さくシンプルに始めて、少しずつ複雑さを加え、すべてのステップでテストし、機能しないコードに追加しないでください。 (私は本当にそれをホットキーにするべきです。)
Make構文とShell構文をめまいがするような方法で混ぜています。テストせずにこれを大きくしてはいけません。外から始めて、内向きに働きましょう。
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
したがって、2番目のmake
を呼び出す前にunistd_32.hを(おそらく)ビルドする必要があります。これを前提条件にすることができます。そして、あなたは特定の場合にのみそれをしたいので、条件に入れることができます:
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
が2つの場所のいずれかにあるということです。これをクリーンアップする最も簡単な方法は、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
閉じている「;」および「\」が必要です。