Makefile hace que la instalación no ejecute comandos de varias líneas

Makefile hace que la instalación no ejecute comandos de varias líneas

Tengo un Makefile que contiene una installsección que me permite make installdespués de construir el código fuente. La installsecció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/liby la segunda línea establece la variable ambiental LD_LIBRARY_PATHpara /usr/local/libque el ejecutable final pueda encontrar el archivo libxxx.so.

Pero cuando ejecuto make installdesde la línea de comando y luego escribo:

echo $LD_LIBRARY_PATH

Muestra contenido vacío en lugar de /usr/local/liblo previsto. Entonces, ¿por qué no se ejecuta la segunda línea de comando en el Makefile?

Respuesta1

makeEs casi seguro que esté ejecutando ambas líneas de comandos. Sin embargo, la línea export LD_LIBRARY_PATH=$<(o cualquier cosa que makela expanda) es ejecutada por un shell que es un proceso hijo del makeproceso. 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 makela ejecutó. Tendrás que exportar en tu archivo .bashrco .zshrcen 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 exportcomando. En su caso, pasar /usr/local/libsa LDIRy 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

información relacionada