如何有效地修补外部库并将其编译到 C 项目的 Makefile 中?

How can I efficiently patch an external library and compile it in a Makefile for a C project?

我正在开发一个需要外部开源库的 C 项目。 特别是,它需要一个我自己修补的版本,以添加一些需要的功能。

目前我正在使用 Makefile,它需要 ./lib 文件夹中的补丁库的静态编译版本(我们称之为 libpatched.a),以及 libpatched.a 中相应的头文件=13=]。 以下是上述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 和差异文件 (.patch) 应用补丁

  3. 根据原始库

  4. 的要求,使用cmake为当前平台编译补丁库(静态或动态)
  5. 编译我的项目,使用libpatched

您认为这些步骤是否有效,或者是否有更好的方法来处理对修补库的需求?

如果是,因为我根本不是创建 Makefile 的专家,是否有一种简单的方法可以通过简单地利用正确编写的 Makefile 来实现这个目标?

哪种方法最好?

非常感谢您。

我以前在用我的操作系统内核补丁构建交叉编译器等时就这样做过。您可以在 Makefile 中使用 wgetcurl 命令。例如像

# 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! - 规则只是说:"to generate the file on the left, please build the prerequisites on the right side first. Then execute these commands to actually generate the file on the left hand side"