我正在一个需要外部开源库的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,其功能类似于:
下载原始库的特定版本(以免出现任何兼容性问题)]] >>
使用patch
和差异文件(.patch
)应用补丁程序
根据原始库的要求,使用cmake
为当前平台编译修补库(静态或动态)。
使用libpatched
编译我的项目
您认为这些步骤是否有效,或者有更好的方法来处理对修补库的这种需求?
如果是,因为我根本不是创建Makefile的专家,是否有一种简单的方法,只需利用正确编写的Makefile即可达到此目标?
哪种方法可能是最好的方法?
非常感谢。
我正在一个需要外部开源库的C项目中工作。特别是,它需要一个我自己打补丁的版本才能添加一些所需的功能。目前,我正在使用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不同! -规则只是说:“要在左侧生成文件,请先在右侧生成先决条件。然后执行这些命令以实际在左侧生成文件”