then else if-statement makefile target

if-statement - then - if else makefile



Si las condiciones en un Makefile, dentro de un objetivo (2)

Aquí hay varios problemas, así que comenzaré con mi consejo habitual de alto nivel: comience de forma pequeña y sencilla, agregue complejidad poco a poco, realice pruebas en cada paso y nunca agregue códigos que no funcionen. (Realmente debería tener esa tecla de acceso rápido.)

Estás mezclando la sintaxis y la sintaxis de shell de una manera que sea simplemente vertiginosa. Nunca deberías haber dejado que se hiciera tan grande sin probar. Empecemos por el exterior y trabajemos hacia adentro.

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

Así que quieres unistd_32.h construido (tal vez) antes de invocar la segunda make , puedes hacer que sea un requisito previo. Y como solo desea eso en un caso determinado, puede ponerlo en un condicional:

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

Ahora para construir 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

Está intentando compilar unistd.h desde unistd_32.h ; el único truco es que unistd_32.h puede estar en cualquiera de dos lugares. La forma más sencilla de limpiar esto es usar una directiva vpath :

vpath unistd.h /usr/include/asm /usr/include/asm-i386 unistd_32.h: unistd.h sed -e ''s/__NR_/__NR32_/g'' $< > $@

Estoy intentando configurar un Makefile que buscará y copiará algunos archivos (condición if-else) y no puedo averiguar qué es exactamente lo que está mal. (tú estoy bastante seguro de que se debe a una combinación de espacios / pestañas escritas en el lugar equivocado). ¿Puedo obtener ayuda con eso, por favor?

Esto es lo que tengo actualmente:

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

De todos modos, eso imprimirá "Sí", "Copiando el encabezado" dos veces y luego dejará de decir que sed no puede leer /usr/include/asm-i386/unistd.h (que por supuesto no puede leer como yo estoy en un sistema x64). Podría decir que make simplemente no entiende el if / else y en su lugar está ejecutando todo línea por línea.


Simplemente puede utilizar comandos de shell. Si desea suprimir el eco de la salida, use el signo "@". Por ejemplo:

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

Tenga en cuenta que el cierre ";" y "/" son necesarios.