web-dev-qa-db-ja.com

ターゲット内のMakefile内の条件

いくつかのファイル(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行ずつ実行していると言えます。

38
alexandernst

ここにはいくつかの問題があるので、通常の高レベルのアドバイスから始めます。 小さくシンプルに始めて、少しずつ複雑さを加え、すべてのステップでテストし、機能しないコードに追加しないでください。 (私は本当にそれをホットキーにするべきです。)

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' $< > $@
53
Beta

単純にシェルコマンドを使用できます。出力のエコーを抑制する場合は、「@」記号を使用します。例えば:

clean:
    @if [ "test" = "test" ]; then\
        echo "Hello world";\
    fi

閉じている「;」および「\」が必要です。

62
Omer Dagan