[英]How can I efficiently patch an external library and compile it in a Makefile for a C project?
我正在開發一個需要外部開源庫的 C 項目。 特別是,它需要一個我自己修補的版本,以添加一些需要的功能。
目前我正在使用 Makefile ,它需要./lib
文件夾中的補丁庫的靜態編譯版本(我們稱之為libpatched.a
),以及 ./include/libpatched 中相應的./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 來實現這一目標?
這可能是最好的方法嗎?
非常感謝您提前。
在為我的操作系統 kernel 使用我的補丁構建交叉編譯器等時,我之前已經這樣做了。 您可以在 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 : - 規則只是說,“要生成左側的文件。請先在右側構建先決條件。然后執行這些命令來實際生成左側的文件”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.