Makefile make install não executa comandos de múltiplas linhas

Makefile make install não executa comandos de múltiplas linhas

Eu tenho um Makefile que contém uma installseção que me permite fazer isso make installdepois de construir o código-fonte. A installseção contém duas linhas de comandos shell:

install: /usr/local/lib
    cp $(LIB_OBJ) $<
    export LD_LIBRARY_PATH=$< 

Portanto, a primeira linha copia libxxx.so para /usr/local/libe a segunda linha define a variável ambiental LD_LIBRARY_PATHpara /usr/local/libpara que o executável final possa encontrar o arquivo libxxx.so.

Mas quando executo make installa partir da linha de comando e digito:

echo $LD_LIBRARY_PATH

Ele mostra conteúdo vazio e não /usr/local/libconforme pretendido. Então, por que a segunda linha de comando no Makefile não é executada?

Responder1

makequase certamente está executando ambas as linhas de comandos. No entanto, a linha export LD_LIBRARY_PATH=$<(ou o que quer que makea expanda) é executada por um shell que é um processo filho do makeprocesso. Ao digitar echo $LD_LIBRARY_PATH, você obtém tudo o que a variável de ambiente LD_LIBRARY_PATH contém. Seu shell não executou a "exportação", um subprocesso de makeexecução. Você terá que exportar em seu .bashrcarquivo .zshrcou qualquer outro arquivo ou digitá-lo manualmente.

Responder2

Tentar:

export LD_LIBRARY_PATH := /usr/local/lib:$(LD_LIBRARY_PATH)

install:
#Do Install actions

VerSeção 5.3 do manual Makepara uma explicação da suposição correta de Bruce sobre subcamadas, o que nos leva aesta resposta no StackOverflow, que afirma que todos os comandos devem ser executados como um único liner.

Atualizar

Como o liner não funcionou, use o seguinte como exemplo (estou incluindo os arquivos abaixo para que o makefile final funcione):
Lista de arquivos:
hellomacke.c

#include 

int main() {
  // call a function in another file
  myPrintHelloMake();

  return(0);
}

oláfunc.c

#include 
#include 

void myPrintHelloMake(void) {

  printf("Hello makefiles!\n");

  return;
}

olámake.h

/*
example include file
*/

void myPrintHelloMake(void);

Fim da lista de arquivos


Makefile

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)/*~

O makefile acima usa macros e expansão de strings para definir corretamente os diretórios de inclusão e bibliotecas sem a necessidade do exportcomando. No seu caso, passar /usr/local/libse LDIRcompilar deve começar.


Referências

Colby College, Maine, Departamento de Ciência da Computação - Tutorial Makefile
O processador macro M4 - substituição de pasta

informação relacionada