![Makefile hace que la instalación no ejecute comandos de varias líneas](https://rvso.com/image/36035/Makefile%20hace%20que%20la%20instalaci%C3%B3n%20no%20ejecute%20comandos%20de%20varias%20l%C3%ADneas.png)
Tengo un Makefile que contiene una install
sección que me permite make install
después de construir el código fuente. La install
sección contiene dos líneas de comandos de shell:
install: /usr/local/lib
cp $(LIB_OBJ) $<
export LD_LIBRARY_PATH=$<
Entonces, la primera línea copia libxxx.so /usr/local/lib
y la segunda línea establece la variable ambiental LD_LIBRARY_PATH
para /usr/local/lib
que el ejecutable final pueda encontrar el archivo libxxx.so.
Pero cuando ejecuto make install
desde la línea de comando y luego escribo:
echo $LD_LIBRARY_PATH
Muestra contenido vacío en lugar de /usr/local/lib
lo previsto. Entonces, ¿por qué no se ejecuta la segunda línea de comando en el Makefile?
Respuesta1
make
Es casi seguro que esté ejecutando ambas líneas de comandos. Sin embargo, la línea export LD_LIBRARY_PATH=$<
(o cualquier cosa que make
la expanda) es ejecutada por un shell que es un proceso hijo del make
proceso. Cuando escribe echo $LD_LIBRARY_PATH
, obtiene lo que sea que contenga la variable de entorno LD_LIBRARY_PATH. Su Shell no ejecutó la "exportación", un subproceso make
la ejecutó. Tendrás que exportar en tu archivo .bashrc
o .zshrc
en cualquier otro, o escribirlo manualmente.
Respuesta2
Intentar:
export LD_LIBRARY_PATH := /usr/local/lib:$(LD_LIBRARY_PATH)
install:
#Do Install actions
VerSección 5.3 del manual de fabricación.para obtener una explicación de la suposición correcta de Bruce sobre los subniveles, lo que nos lleva aesta respuesta en StackOverflow, que establece que todos los comandos deben ejecutarse en una sola línea.
Actualizar
Dado que la única línea no funcionó, use lo siguiente como ejemplo (estoy incluyendo los archivos a continuación para que el archivo MAKE final funcione):
Lista de archivos:
holamacke.c
#include
int main() {
// call a function in another file
myPrintHelloMake();
return(0);
}
holafunc.c
#include
#include
void myPrintHelloMake(void) {
printf("Hello makefiles!\n");
return;
}
holamake.h
/*
example include file
*/
void myPrintHelloMake(void);
Finalizar lista de archivos
Archivo Make
IDIR =../include
CC=gcc
CFLAGS=-I$(IDIR)
ODIR=obj
LDIR =../lib
LIBS=-lm
_DEPS = hellomake.h
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))
_OBJ = hellomake.o hellofunc.o
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))
$(ODIR)/%.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)
hellomake: $(OBJ)
gcc -o $@ $^ $(CFLAGS) $(LIBS)
.PHONY: clean
clean:
rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~
El archivo MAKE anterior utiliza macros y expansión de cadenas para configurar correctamente los directorios de inclusión y bibliotecas sin la necesidad del export
comando. En su caso, pasar /usr/local/libs
a LDIR
y luego compilar debería ayudarlo a comenzar.
Referencias
Colby College, Maine, Departamento de Ciencias de la Computación - Tutorial Makefile
El macroprocesador M4: sustitución de pasta