Si les conditions dans un Makefile, à l'intérieur d'une cible

J'essaie de configurer un Makefile qui va rechercher et copier certains fichiers (condition if-else) et je ne peux pas comprendre ce qui ne va pas exactement? (tu je suis sûr que c'est parce qu'une combinaison d'espaces / onglets écrits au mauvais endroit). Puis-je obtenir de l'aide, s'il vous plaît?

Voici ce que j'ai actuellement:

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

Quoi Qu'il en soit, cela imprimera" Oui"," copier l'en-tête " deux fois, puis il cessera de dire que sed ne peut pas lire /usr/include/asm-i386/unistd.h (ce qui bien sûr ne peut pas lire car je suis sur un x64 système). Je pourrais dire que make ne comprend tout simplement pas if / else et exécute tout ligne par ligne.

21
demandé sur alexandernst 2013-04-12 21:51:19

2 réponses

Il y a plusieurs problèmes ici, donc je vais commencer par mes conseils de haut niveau habituels: commencez petit et simple, ajoutez de la complexité un peu à la fois, testez à chaque étape, et n'ajoutez jamais de code qui ne fonctionne pas.{[12] }( je devrais vraiment avoir ce hotkeyed.)

Vous mélangez la syntaxe Make et la syntaxe shell d'une manière qui est juste vertigineuse. Vous n'auriez jamais dû le laisser devenir aussi grand sans tester. Commençons par l'extérieur et travaillons vers l'intérieur.

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

Donc vous voulez unistd_32.h construit (peut-être) avant d'invoquer le second make, Vous pouvez en faire une condition préalable. Et puisque vous voulez que dans certains cas, vous pouvez le mettre dans une condition:

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

Maintenant pour construire 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

Vous essayez de construire unistd.h à partir de unistd_32.h; la seule astuce est que unistd_32.h pourrait être à l'un des deux endroits. Le moyen le plus simple de nettoyer cela est d'utiliser une directive vpath:

vpath unistd.h /usr/include/asm /usr/include/asm-i386

unistd_32.h: unistd.h
    sed -e 's/__NR_/__NR32_/g' $< > $@
42
répondu Beta 2013-04-12 19:07:01

, Vous pouvez simplement utiliser des commandes shell. Si vous voulez supprimer l'écho de la sortie, utilisez le signe"@". Par exemple:

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

Notez que la fermeture "; " et " \ " sont nécessaires.

35
répondu Omer Dagan 2015-10-07 07:40:30