Как я могу эффективно исправить внешнюю библиотеку и скомпилировать ее в Makefile для проекта C? - PullRequest
1 голос
/ 23 октября 2019

Я работаю над проектом C, которому нужна внешняя библиотека с открытым исходным кодом. В частности, ему нужна версия, которую я сам исправил, чтобы добавить некоторые необходимые функции.

В данный момент я использую Makefile, который ожидает статически скомпилированную версию исправленной библиотеки в папке ./lib (давайте назовем это libpatched.a) и соответствующие заголовочные файлы в ./include/libpatched. Ниже приведены основные части вышеупомянутого Makefile:

EXECNAME=MyExecutable

CC=gcc

SRC_DIR=src
OBJ_DIR=obj

SRC=$(wildcard $(SRC_DIR)/*.c)

OBJ=$(SRC:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)

CFLAGS += -Wall -O2 -Iinclude -Iinclude/libpatched
LDFLAGS += -Llib
LDLIBS += -lpatched

.PHONY: all clean

all: $(EXECNAME)

$(EXECNAME): $(OBJ_CC)
    $(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
    $(CC) $(CFLAGS) -c $< -o $@

clean:
    $(RM) $(OBJ_DIR)/*.o

Этот Makefile работает правильно;Тем не менее, я искал более гибкое решение, которое не требует статически скомпилированной библиотеки перед вызовом make. Чего я хотел бы добиться, так это иметь Makefile, который выполняет что-то вроде:

  1. Загрузите определенную версию исходной библиотеки (чтобы никогда не было проблем с совместимостью)

  2. Примените патч, используя patch и файл diff (.patch)

  3. Скомпилируйте исправленную библиотеку (статически или динамически) для текущей платформы,используя cmake, как того требует исходная библиотека

  4. Скомпилируйте мой проект, используя libpatched

Являются ли эти шаги действительными по вашему мнениюили есть гораздо лучший способ справиться с этой потребностью в пропатченной библиотеке?

Если да, то, поскольку я вообще не являюсь экспертом в создании Makefiles, есть ли простой способ достичь этой цели, простоиспользуя правильно написанный Makefile?

Какой может быть лучший способ сделать это?

Заранее большое спасибо.

1 Ответ

0 голосов
/ 23 октября 2019

Я делал это раньше, когда собирал кросс-компилятор и т. Д. С моими патчами для ядра операционной системы. Вы можете использовать команды wget или curl в Makefile. Например, что-то вроде

# foo.tar.gz needs to be downloaded
foo.tar.gz:
    wget https://download.source.from/here/foo.tar.gz -O foo.tar.gz

# the makefile requires the downloaded file.
foo_src/CMakeLists.txt: foo.tar.gz
    mkdir -p foo_src
    cd foo_src && tar xfz ../foo.tar.gz

# patch the library if flag not present
foo_patched.flag:
    cd foo_src && patch -p1 ../foo.patch
    touch foo_patched.flag

# this depends on patching
libpatched.a: foo_src/CMakeLists.txt foo_patched.flag 
    cd foo_src && cmake
    cp foo_src/libfoo.a libpatched.a

Формат Makefile очень прост - в отличие от CMake! - в правилах просто сказано: «чтобы сгенерировать файл слева, сначала скомпилируйте необходимые компоненты с правой стороны. Затем выполните эти команды, чтобы фактически сгенерировать файл с левой стороны» *

...