从其他Makefile编译Postgres源码提示'utils/errcodes.h'不存在如何解决
问题修复方案
问题根源
pwd变量被提前展开:Make会在执行shell命令前对命令内容做预解析,你写的`pwd`会在执行cd postgres-REL_13_3之前就被求值,取到的是上层Makefile所在目录的路径,导致configure的prefix参数错误,编译时头文件查找路径异常。- 构建环境变量干扰:Make默认会将
MAKEFLAGS、MAKELEVEL等变量传递给子make进程,Postgres 13.3的构建系统对这类外来变量敏感度较高,若上层Make开启了并行编译(-j参数),还会导致自动生成的头文件errcodes.h尚未完成生成,就启动了依赖它的源码编译任务,最终触发头文件找不到的报错。
修正后的Makefile规则
build: curl -LJ https://github.com/postgres/postgres/archive/refs/tags/REL_13_3.zip -o postgres.zip unzip postgres.zip rm postgres.zip cd postgres-REL_13_3 \ && ./configure --prefix "$$(pwd)" --without-readline --without-zlib \ && MAKEFLAGS= $(MAKE) -j1 \ && MAKEFLAGS= $(MAKE) install
改动说明
- 用
$$(pwd)替代原有的`pwd`:Make中双$会被转义为单个$传递给shell,确保pwd命令在进入postgres源码目录后才由shell执行,得到正确的路径值。 - 调用子make前临时清空
MAKEFLAGS变量:避免上层Make的参数传入Postgres的构建流程,干扰原生构建逻辑。 - 增加
-j1参数强制单线程编译:解决Postgres 13.3版本并行构建时偶发的依赖顺序错误问题,确保自动生成的头文件完成生成后再执行后续编译任务。 - 注意:所有规则下的命令行必须使用Tab字符缩进,不能用空格,否则Make会识别报错。
内容的提问来源于stack exchange,提问作者Mercury
相关产品推荐
相关产品推荐

