Makefile make install não executando vários comandos de linha

1

Eu tenho um Makefile que contém uma seção install para permitir que eu make install depois de criar o código-fonte. A seção install contém duas linhas de comandos do shell:

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

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

Mas quando eu executar make install da linha de comando e, em seguida, digite:

echo $LD_LIBRARY_PATH

Mostra conteúdo vazio em vez de /usr/local/lib como pretendido. Então, por que a segunda linha de comando no Makefile não é executada?

    
por tonga 07.01.2015 / 21:00

2 respostas

2

make quase certamente está executando ambas as linhas de comandos. No entanto, a linha export LD_LIBRARY_PATH=$< (ou qualquer que seja o make expande) é executada por um shell que é um processo filho do processo make . Quando você digita echo $LD_LIBRARY_PATH , obtém o que a variável de ambiente LD_LIBRARY_PATH continha. Seu shell não executou a "exportação", um subprocesso de make executou-o. Você terá que fazer a exportação no seu arquivo .bashrc ou .zshrc ou qualquer outro arquivo, ou digitá-lo manualmente.

    
por 07.01.2015 / 21:08
0

Tente:

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

install:
#Do Install actions

Veja a Seção 5.3 do Manual do Make para obter uma explicação da suposição correta de Bruce sobre subshells, que nos leva a esta resposta no StackOverflow , que afirma que todos os comandos devem ser executados como um forro único.

Atualizar

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

#include 

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

  return(0);
}

hellofunc.c

#include 
#include 

void myPrintHelloMake(void) {

  printf("Hello makefiles!\n");

  return;
}

hellomake.h

/*
example include file
*/

void myPrintHelloMake(void);

End Filelist

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 Cadeia para configurar adequadamente os diretórios include e libraries, sem a necessidade do comando export . No seu caso, passar /usr/local/libs para LDIR e, em seguida, compilar deve começar.

Referências

Colby College, Maine, Departamento de Ciência da Computação - Tutorial Makefile
O Processador de Macro M4 - Colar Substituição

    
por 07.01.2015 / 22:14