运行make处理alsa.mk时遍历全目录树文件是否属正常现象?
问题
本人在Windows环境下精通C/C++/C#,但对Linux及makefile完全陌生。目前正参与XCSoar开发项目,该项目的主Makefile会包含各模块对应的次级*.mk文件。我尝试以调试模式(-d)运行make指令处理随机选取的build/alsa.mk文件,结果发现make读取了整个目录树中的所有文件,请问该现象是否正常?
附alsa.mk文件内容
ifeq ($(TARGET),ANDROID) # Using ALSA directly makes no sense on Android ENABLE_ALSA = n else ifeq ($(ENABLE_SDL),y) # If SDL is being used, we do not use ALSA directly # unless it is explicitly activated ENABLE_ALSA ?= n else ifeq ($(TARGET_IS_LINUX),y) # Enable ALSA for Linux by default ENABLE_ALSA ?= y else # ALSA must be activated explicitly on all other platforms ENABLE_ALSA ?= n endif ifeq ($(ENABLE_ALSA),y) $(eval $(call pkg-config-library,ALSA,alsa)) ALSA_CPPFLAGS += -DENABLE_ALSA endif
运行指令
frank@M6700:~/7.42_tst/XCSoar$ make -d alsa.mk | less
输出片段
GNU Make 4.3 Built for x86_64-pc-linux-gnu Copyright (C) 1988-2020 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Reading makefiles... Reading makefile 'Makefile'... Reading makefile 'build/local-config.mk' (search path) (don't care) (no ~ expansion)... ...(省略中间读取大量文件的日志) Reading makefile 'output/UNIX/dbg/src/Computer/GlideRatioComputer.d' (search path) (no ~ expansion)... ... Considering target file 'alsa.mk'. File 'alsa.mk' does not exist. Looking for an implicit rule for 'alsa.mk'. No implicit rule found for 'alsa.mk'. Finished prerequisites of target file 'alsa.mk'. Must remake target 'alsa.mk'.
回答
这个现象是正常的,具体原因如下:
Make的默认工作逻辑:当你执行
make alsa.mk时,是要求Make构建名为alsa.mk的目标文件,但Make启动后会自动优先加载当前目录下的Makefile(或makefile、GNUmakefile)——它需要从主Makefile中获取变量、规则等上下文信息,才能判断如何处理目标。主Makefile的连锁加载:XCSoar的主Makefile里包含大量
include指令,用来引入各模块的次级.mk文件;同时构建过程中生成的.d依赖文件(比如输出里的GlideRatioComputer.d)也会被Make自动读取,这些文件记录了源码的头文件依赖,所以Make会遍历加载相关文件,最终表现为读取整个目录树中的大量文件。目标文件的误解:你选中的
build/alsa.mk是被主Makefile包含的配置片段,并非可构建的目标文件。从输出能看到,Make找不到名为alsa.mk的目标,尝试用隐式规则创建也失败了。
正确的操作方式
如果想查看build/alsa.mk的逻辑生效情况,或者测试相关配置,应该:
- 不要把
.mk文件作为Make的目标,而是通过主Makefile传递变量来查看,比如过滤ALSA相关的配置:make -d | grep -E "ENABLE_ALSA|ALSA_CPPFLAGS" - 或者指定特定构建目标,同时查看ALSA相关编译逻辑,比如构建Linux调试版本:
make TARGET=LINUX DEBUG=y -d | grep -A10 -B10 "alsa"
内容的提问来源于stack exchange,提问作者user3765883
相关产品推荐
相关产品推荐

