我正在尝试使用通用的makefile来合并一些构建信息.我的问题是我想从不同的子目录级别使用该makefile,这使得工作目录值(pwd
)不可预测.例如:
# Makefile.common TOP := $(shell pwd) COMPONENT_DIR := $(TOP)/component COMPONENT_INC := $(COMPONENT_DIR)/include COMPONENT_LIB := $(COMPONENT_DIR)/libcomponent.a
如果我Makefile.common
从子目录中包含,就像这样,$(TOP)
目录是不正确的,其他一切都遵循:
# other_component/Makefile include ../Makefile.common # $(COMPONENT_LIB) is incorrectly other_component/component
Makefile.common
使用自己的目录路径而不是更善变的最佳方法是什么pwd
?
您应该能够使用MAKEFILE_LIST变量,如下所示:
# This must be the first line in Makefile.common TOP := $(dir $(firstword $(MAKEFILE_LIST)))
从文档:
当make读取各种makefile时,包括从MAKEFILES变量,命令行,默认文件或include伪指令获得的任何makefile,它们的名称将自动附加到MAKEFILE_LIST变量中.它们在make开始解析之前添加.这意味着如果makefile执行的第一件事是检查此变量中的最后一个单词,它将是当前makefile的名称.但是,一旦当前的makefile使用了include,最后一个单词将是刚刚包含的makefile.
这不是好的样式,因为它添加了另一个依赖项(即realpath二进制文件).根据您的使用情况,这可能是可以接受的.
ROOT_DIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
如果您没有安装realpath:
$ sudo apt-get install realpath # on debian and derivatives
编辑:一定要使用:=
而不是=
因为后者导致make
使用后期绑定,并且MAKEFILE_LIST
可能由于后来的包含而发生了变化.