Makefile make install не выполняет многострочные команды

Makefile make install не выполняет многострочные команды

У меня есть Makefile, который содержит installраздел, позволяющий мне make installпосле сборки исходного кода. installРаздел содержит две строки команд оболочки:

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

Итак, первая строка копирует libxxx.so в , /usr/local/libа вторая строка устанавливает переменную окружения LD_LIBRARY_PATHв , /usr/local/libчтобы конечный исполняемый файл мог найти файл libxxx.so.

Но когда я запускаю make installиз командной строки и затем набираю:

echo $LD_LIBRARY_PATH

Он показывает пустой контент, а не /usr/local/libто, что задумано. Так почему же вторая строка команды в Makefile не выполняется?

решение1

makeпочти наверняка выполняет обе строки команд. Однако строка export LD_LIBRARY_PATH=$<(или то, что makeее расширяет) выполняется оболочкой, которая является дочерним процессом процесса make. Когда вы вводите echo $LD_LIBRARY_PATH, вы получаете то, что было в переменной окружения LD_LIBRARY_PATH. Ваша оболочка не выполнила "экспорт", ее выполнил подпроцесс make. Вам придется выполнить экспорт в вашем .bashrcили .zshrcили любом другом файле, или ввести его вручную.

решение2

Пытаться:

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

install:
#Do Install actions

ВидетьРаздел 5.3 руководства по изготовлениюдля объяснения правильного предположения Брюса о подоболочках, которое приводит нас кэтот ответ на StackOverflow, в котором говорится, что все команды должны выполняться в одну строку.

Обновлять

Поскольку однострочный вариант не сработал, используйте в качестве примера следующее (я включаю файлы ниже, чтобы окончательный make-файл работал):
Список файлов:
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);

Конец списка файлов


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

Вышеприведенный makefile использует макросы и расширение строк для правильной установки каталогов include и libraries без необходимости в exportкоманде. В вашем случае передача /usr/local/libsи LDIRпоследующая компиляция должны помочь вам начать.


Рекомендации

Колледж Колби, штат Мэн, факультет компьютерных наук — Учебное пособие по Makefile
Макропроцессор M4 — вставка-замена

Связанный контент