当前位置:  开发笔记 > 前端 > 正文

常见的GNU makefile目录路径

如何解决《常见的GNUmakefile目录路径》经验,为你挑选了2个好方法。

我正在尝试使用通用的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



1> JesperE..:

您应该能够使用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.


事后很多,但如果它可以帮助任何人:下面是我给你的绝对路径的摘要,但不依赖于真实路径(在此基础上的答案,[本博客文章(HTTP://blog.jgc.组织/ 2007/01 /什么-的makefile-AM-I-in.html)):`TOP:= $(DIR $(CURDIR)/ $($字(词$(MAKEFILE_LIST)),$(MAKEFILE_LIST))) `
泽维尔,你应该把它作为答案,而不是评论.事实上很好(甚至鼓励),这是一个生活的网站.
这是我给出绝对路径的好处:`TOP:= $(abspath $(dir $(lastword $(MAKEFILE_LIST))))`.根据我的快速网络搜索,`$(abspath ...)`是在GNU make 3.81(2006年4月1日)中与`$(lastword ...)`同时引入的.Xavier Holt的解决方案适用于旧版本的GNU make.

2> 小智..:

这不是好的样式,因为它添加了另一个依赖项(即realpath二进制文件).根据您的使用情况,这可能是可以接受的.

ROOT_DIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))

如果您没有安装realpath:

$ sudo apt-get install realpath # on debian and derivatives

编辑:一定要使用:=而不是=因为后者导致make使用后期绑定,并且MAKEFILE_LIST可能由于后来的包含而发生了变化.

推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有