如何有效地修补外部库并将其编译到 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 做类似的事情:
下载特定版本的原库(以免出现兼容性问题)
使用 patch
和差异文件 (.patch
) 应用补丁
根据原始库
的要求,使用cmake
为当前平台编译补丁库(静态或动态)
编译我的项目,使用libpatched
您认为这些步骤是否有效,或者是否有更好的方法来处理对修补库的需求?
如果是,因为我根本不是创建 Makefile 的专家,是否有一种简单的方法可以通过简单地利用正确编写的 Makefile 来实现这个目标?
哪种方法最好?
非常感谢您。
我以前在用我的操作系统内核补丁构建交叉编译器等时就这样做过。您可以在 Makefile 中使用 wget
或 curl
命令。例如像
# 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"
我正在开发一个需要外部开源库的 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 做类似的事情:
下载特定版本的原库(以免出现兼容性问题)
使用
patch
和差异文件 (.patch
) 应用补丁根据原始库
的要求,使用编译我的项目,使用
libpatched
cmake
为当前平台编译补丁库(静态或动态)
您认为这些步骤是否有效,或者是否有更好的方法来处理对修补库的需求?
如果是,因为我根本不是创建 Makefile 的专家,是否有一种简单的方法可以通过简单地利用正确编写的 Makefile 来实现这个目标?
哪种方法最好?
非常感谢您。
我以前在用我的操作系统内核补丁构建交叉编译器等时就这样做过。您可以在 Makefile 中使用 wget
或 curl
命令。例如像
# 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"