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

问题描述 投票:1回答:1

我正在一个需要外部开源库的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和差异文件(.patch)应用补丁程序

  3. 根据原始库的要求,使用cmake为当前平台编译修补库(静态或动态)。

  4. 使用libpatched编译我的项目

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

    如果是,因为我根本不是创建Makefile的专家,是否有一种简单的方法,只需利用正确编写的Makefile即可达到此目标?

    哪种方法可能是最好的方法?

    非常感谢。

我正在一个需要外部开源库的C项目中工作。特别是,它需要一个我自己打补丁的版本才能添加一些所需的功能。目前,我正在使用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不同! -规则只是说:“要在左侧生成文件,请先在右侧生成先决条件。然后执行这些命令以实际在左侧生成文件”

c makefile compilation static-libraries patch
1个回答
0
投票

我之前使用操作系统内核的补丁构建交叉编译器等时就已经做到了这一点。您可以在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
© www.soinside.com 2019 - 2024. All rights reserved.