我正在尝试使用通用的makefile来合并一些构建信息.我的问题是我想从不同的子目录级别使用该makefile,这使得工作目录值(pwd)不可预测.例如:
# Makefile.common
TOP := $(shell pwd)
COMPONENT_DIR := $(TOP)/component
COMPONENT_INC := $(COMPONENT_DIR)/include
COMPONENT_LIB := $(COMPONENT_DIR)/libcomponent.a
Run Code Online (Sandbox Code Playgroud)
如果我Makefile.common从子目录中包含,就像这样,$(TOP)目录是不正确的,其他一切都遵循:
# other_component/Makefile
include ../Makefile.common
# $(COMPONENT_LIB) is incorrectly other_component/component
Run Code Online (Sandbox Code Playgroud)
Makefile.common使用自己的目录路径而不是更善变的最佳方法是什么pwd?
我知道可以指定#include相对于文件所在目录的文件路径(作为绝对文件路径),也可以指定相对于$PATH系统变量中任何目录的文件路径。编译程序时,有没有办法相对于用户的当前目录来指定它?假设我具有以下文件结构:
|--dir_a/
| |--a.c
| |--a.h
|--dir_b/
| |--b.c
| |--b.h
|--makefile
Run Code Online (Sandbox Code Playgroud)
现在,假设我要从中#include获取文件。使用的位置,可以这样写:dir_a/a.hdir_b/b.hdir_b/b.h
#include ../dir_a/a.h
Run Code Online (Sandbox Code Playgroud)
但是,在我看来,这种方法存在一个重大缺陷,因为它会对文件之间的位置进行硬编码,这意味着重新定位文件将需要更新包含该文件的所有位置的文件路径。
使用绝对文件路径可以避免此问题,但可以硬编码项目在文件系统中的位置,这似乎是一种不好的做法。
最后,使用<>标签指定文件路径也不可行,因为我无法假定该项目将在$PATH变量中列出。
因此,我想做的是能够指定相对于用户从中进行编译的路径(甚至从makefile的位置进行编译)。在上面的示例中,这将使我使用以下语句来#include dir_a/a.hfrom dir_b/b.h:
#include dir_a/a.h
Run Code Online (Sandbox Code Playgroud)
我认为这将是理想的解决方案。这将使这些#include语句更加一致并且更易于遵循,并且避免了我上面列出的缺点。是否有可能以任何方式做到这一点,例如 与编译器标志或什么?我正在gcc用作编译器。
假设您想要一个 makefile 来生成一个以父目录命名的文件。一种方法是对目标名称进行硬编码,但这不是很“通用”,例如
TARGET := dirname.pdf
$(TARGET): $(TARGET:.pdf=.tex)
pdflatex $(@:.pdf=.tex)
Run Code Online (Sandbox Code Playgroud)
通过 make 函数检索目录名称会更好。SA 上有关于如何检索 makefile 的完整路径的各种问题(和答案)(例如,/sf/answers/1269593951/)但不是父目录的名称的各种问题(和答案)...
在 GNU make 中最有效和可移植的方法是什么?