如何在Makefile中获取gmake的--jobs参数值并判断是否为-j1?
在GNU Make中获取作业数(--jobs=N)的方法
要让Makefile知晓gmake是否以--jobs=N(或-jN)启动并获取N的值,有两种可靠方式,适配不同版本的GNU Make:
1. 使用内置变量$(.JOBS)(推荐,GNU Make 3.81+)
GNU Make提供了内置变量$(.JOBS),它直接返回当前配置的作业数——不管这个值是通过命令行-jN指定,还是通过MAKEFLAGS设置的。
比如你的主Makefile里已经加了MAKEFLAGS += -j1,那$(.JOBS)的值就是1。你可以直接把这个变量传给子项目的构建命令:
# 假设子项目用ninja构建 subproject: cd subdir && ninja -j$(.JOBS)
如果用户没指定-j参数,$(.JOBS)会自动设为系统可用的CPU核心数,刚好符合你“未指定则用可用CPU数量”的需求。
2. 从MAKEFLAGS中提取(兼容更老版本)
如果你的环境里有较老的GNU Make版本(不支持$(.JOBS)),可以通过字符串处理从MAKEFLAGS变量中提取-j后面的数值:
# 从MAKEFLAGS中提取-j参数的数值 EXTRACTED_JOBS := $(shell echo '$(MAKEFLAGS)' | sed -n 's/.*-j\([0-9]*\).*/\1/p') # 若未提取到值,自动获取CPU核心数作为默认 ifeq ($(EXTRACTED_JOBS),) EXTRACTED_JOBS := $(shell nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 1) endif # 传给子项目 subproject: cd subdir && your-build-system --jobs=$(EXTRACTED_JOBS)
适配你的场景
你的主Makefile已经设置了.NOTPARALLEL和MAKEFLAGS += -j1,不管用哪种方法,最终拿到的作业数都是1。把这个值传给子项目的构建命令后,就能保证子项目也以单作业模式构建,输出完全序列化,方便查看。
内容的提问来源于stack exchange,提问作者olh
相关产品推荐
相关产品推荐

