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.