Makefile make install führt keine mehrzeiligen Befehle aus

Makefile make install führt keine mehrzeiligen Befehle aus

Ich habe ein Makefile, das einen installAbschnitt enthält, der es mir ermöglicht, make installnach dem Erstellen des Quellcodes Folgendes zu tun. Der installAbschnitt enthält zwei Zeilen mit Shell-Befehlen:

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

Daher kopiert die erste Zeile die libxxx.so nach /usr/local/libund die zweite Zeile setzt die Umgebungsvariable auf LD_LIBRARY_PATH, sodass /usr/local/libdie endgültige ausführbare Datei die libxxx.so-Datei finden kann.

Aber wenn ich es make installvon der Kommandozeile aus ausführe und dann eingebe:

echo $LD_LIBRARY_PATH

Es wird leerer Inhalt angezeigt, statt /usr/local/libwie beabsichtigt. Warum wird also die zweite Befehlszeile im Makefile nicht ausgeführt?

Antwort1

makeführt mit ziemlicher Sicherheit beide Befehlszeilen aus. Die Zeile export LD_LIBRARY_PATH=$<(oder was auch immer makesie erweitert) wird jedoch von einer Shell ausgeführt, die ein untergeordneter Prozess des makeProzesses ist. Wenn Sie eingeben echo $LD_LIBRARY_PATH, erhalten Sie, was auch immer die Umgebungsvariable LD_LIBRARY_PATH enthielt. Ihre Shell hat den „Export“ nicht ausgeführt, sondern ein Unterprozess von make. Sie müssen den Export in Ihrer .bashrcoder .zshrceiner beliebigen Datei durchführen oder ihn manuell eingeben.

Antwort2

Versuchen:

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

install:
#Do Install actions

SehenAbschnitt 5.3 des Make-Handbuchsfür eine Erklärung von Bruce' korrekter Annahme über Unterschalen, die uns zudiese Antwort bei StackOverflow, das besagt, dass alle Befehle als einzeilige Zeile ausgeführt werden sollen.

Aktualisieren

Da der Einzeiler nicht funktioniert hat, verwenden Sie Folgendes als Beispiel (ich füge die Dateien unten ein, damit das endgültige Makefile funktioniert):
Dateiliste:
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;
}

hallomake.h

/*
example include file
*/

void myPrintHelloMake(void);

Ende der Dateiliste


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

Das obige Makefile verwendet Makros und String-Erweiterung, um die Include- und Bibliotheksverzeichnisse ohne den Befehl richtig einzurichten export. In Ihrem Fall sollten Sie mit der Übergabe /usr/local/libsan LDIRund der anschließenden Kompilierung beginnen können.


Verweise

Colby College, Maine, Fakultät für Informatik - Makefile-Tutorial
Der M4-Makroprozessor - Paste-Substitution

verwandte Informationen