如何在GNU make和BSD make中均能正确引入bsd.prog.mk?
问题解决方案
报错根因
你遇到的Makefile:: *** missing separator. Stop.报错由两个原因共同导致:
.include <bsd.prog.mk>是BSD系make(bmake/pmake)的专属语法,Linux默认预装的GNU make无法识别该语法- Linux默认环境没有预装BSD系统提供的
bsd.prog.mk等构建配置文件集
跨系统兼容方案
方案1:最小改造成本(推荐)
统一使用BSD make(bmake)作为构建工具,无需修改原有Makefile逻辑:
- Linux环境先安装对应依赖包:
- Debian/Ubuntu 系列:
sudo apt install bmake freebsd-buildutils - Fedora/RHEL 系列:
sudo dnf install bmake bsd-progs - Arch 系列:
sudo pacman -S bmake
- Debian/Ubuntu 系列:
- 后续无论在BSD还是Linux环境,都使用
bmake命令执行构建,原有bsd.prog.mk相关逻辑可直接正常运行。
方案2:兼容Linux默认GNU make
如果不想要求用户额外安装bmake,可在Makefile中增加条件分支,BSD环境走原生bsd.prog.mk逻辑,Linux环境自行实现等效规则,示例如下:
# 区分BSD/GNU make环境,实现等效构建逻辑 ifeq ($(shell uname -s),Linux) # Linux GNU make 规则,和bsd.prog.mk常用行为对齐 PROG ?= your_program SRCS ?= main.c CFLAGS ?= -Wall -O2 PREFIX ?= /usr/local all: $(PROG) $(PROG): $(SRCS) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ install: mkdir -p $(DESTDIR)$(PREFIX)/bin install -m 755 $(PROG) $(DESTDIR)$(PREFIX)/bin/ clean: rm -f $(PROG) *.o .else # BSD 环境原生逻辑 .include <bsd.prog.mk> .endif
注:GNU make没有原生和
bsd.prog.mk完全等效的内置引入文件,对于复杂构建场景,建议优先使用方案1,避免自行维护大量规则的成本。
内容的提问来源于stack exchange,提问作者rahul Kushwaha
相关产品推荐
相关产品推荐

