最新消息:20210917 已从crifan.com换到crifan.org

【已解决】Makefile中define自定义函数中打印输出没效果

makefile crifan 2798浏览 0评论

折腾:

【已解决】Makefile自定义函数调用出错:unterminated call to function `notdir’: missing `)’.  Stop

期间,define的自定义函数中,想要调试,所以要去打印变量信息。

但是用echo没有输出信息

去加上info试试:

<code>MAKEFILE_LIST_LASTWORD = $(lastword $(MAKEFILE_LIST))
# echo MAKEFILE_LIST_LASTWORD=$(MAKEFILE_LIST_LASTWORD)
$(info "MAKEFILE_LIST_LASTWORD="${MAKEFILE_LIST_LASTWORD})
</code>

结果:还是无输出,问题依旧。

makefile custom function echo not working

makefile define function echo not working

makefile – GNU make 4.1: Missing separator when $(if …) is true in a defined function – Stack Overflow

Variables inside makefile function are not expanded correctly? – Stack Overflow

makefile print inside define function

makefile 自定义函数内 打印变量值

makefile 打印变量的值 – CSDN博客

试了半天:

<code>define getCurrentDirAndDirName
echo MAKEFILE_LIST=$(MAKEFILE_LIST)
# MAKEFILE_LIST_LASTWORD = $(lastword $(MAKEFILE_LIST))
# echo MAKEFILE_LIST_LASTWORD=${MAKEFILE_LIST_LASTWORD}
# $(info "MAKEFILE_LIST_LASTWORD="${MAKEFILE_LIST_LASTWORD})
# print MAKEFILE_LIST_LASTWORD

# MAKEFILE_PATH := $(abspath $(MAKEFILE_LIST_LASTWORD))
# echo MAKEFILE_PATH=$(MAKEFILE_PATH)

MAKEFILE_DIR := $(dir $(MAKEFILE_PATH))
MAKEFILE_DIR_PATSUBST := $(patsubst %/,%,$(MAKEFILE_DIR))
MAKEFILE_DIR_NOSLASH = $(MAKEFILE_DIR_PATSUBST)
CURRENT_DIR_WITH_SLASH = $(MAKEFILE_DIR)
CURRENT_DIR = $(MAKEFILE_DIR_NOSLASH)
CURRENT_DIR_NAME := $(notdir $(MAKEFILE_DIR_PATSUBST))
$1 := $(CURRENT_DIR_NAME)
$2 := $(CURRENT_DIR)
endef

# $(call getCurrentDirAndDirName, CURRENT_DIR_NAME, CURRENT_DIR)
$(eval $(call getCurrentDirAndDirName, CURRENT_DIR_NAME, CURRENT_DIR))
# echo "CURRENT_DIR_NAME="$(CURRENT_DIR_NAME)
# $(info "CURRENT_DIR="$(CURRENT_DIR))
</code>

还是不行。

代码:

<code># get current folder name
# support call makefile from anywhere, not only from current path of makefile located
# MAKEFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST)))
# CURRENT_DIR_WITH_SLASH := $(notdir $(patsubst %/,%,$(MAKEFILE_DIR))
define getCurrentDirAndDirName
  MAKEFILE_LIST_LASTWORD = $(lastword $(MAKEFILE_LIST))
  echo MAKEFILE_LIST=$(MAKEFILE_LIST)
  echo MAKEFILE_LIST_LASTWORD1=${MAKEFILE_LIST_LASTWORD}
  $(info "MAKEFILE_LIST_LASTWORD2="${MAKEFILE_LIST_LASTWORD})
  print MAKEFILE_LIST_LASTWORD3
  MAKEFILE_PATH := $(abspath $(MAKEFILE_LIST_LASTWORD))
  echo MAKEFILE_PATH=$(MAKEFILE_PATH)
  MAKEFILE_DIR := $(dir $(MAKEFILE_PATH))
  MAKEFILE_DIR_PATSUBST := $(patsubst %/,%,$(MAKEFILE_DIR))
  MAKEFILE_DIR_NOSLASH = $(MAKEFILE_DIR_PATSUBST)
  CURRENT_DIR_WITH_SLASH = $(MAKEFILE_DIR)
  CURRENT_DIR = $(MAKEFILE_DIR_NOSLASH)
  CURRENT_DIR_NAME := $(notdir $(MAKEFILE_DIR_PATSUBST))
  $1 := $(CURRENT_DIR_NAME)
  $2 := $(CURRENT_DIR)
endef

# $(call getCurrentDirAndDirName, CURRENT_DIR_NAME, CURRENT_DIR)
$(eval $(call getCurrentDirAndDirName, CURRENT_DIR_NAME, CURRENT_DIR))
# echo "CURRENT_DIR_NAME="$(CURRENT_DIR_NAME)
# $(info "CURRENT_DIR="$(CURRENT_DIR))
</code>

输出

<code>➜  youdao_note_summary git:(master) ✗ make help
"MAKEFILE_LIST_LASTWORD2="
../Makefile_common:58: *** commands commence before first target.  Stop.
</code>

可见:

在define中只有用info才能输出变量值

echo和print都不行。

并且,info在# 后面,注释中,都生效

且试了试在分号后面:

<code>;$(info "MAKEFILE_LIST_LASTWORD2="${MAKEFILE_LIST_LASTWORD})
</code>

也可以输出。

然后通过:

<code>define getCurrentDirAndDirName
MAKEFILE_LIST_LASTWORD = $(lastword $(MAKEFILE_LIST))
$(info {MAKEFILE_LIST}=${MAKEFILE_LIST})
$(info (MAKEFILE_LIST)=$(MAKEFILE_LIST))
$(info MAKEFILE_LIST_LASTWORD=${MAKEFILE_LIST_LASTWORD})
MAKEFILE_PATH := $(abspath $(MAKEFILE_LIST_LASTWORD))
MAKEFILE_DIR := $(dir $(MAKEFILE_PATH))
MAKEFILE_DIR_PATSUBST := $(patsubst %/,%,$(MAKEFILE_DIR))
MAKEFILE_DIR_NOSLASH = $(MAKEFILE_DIR_PATSUBST)
CURRENT_DIR_WITH_SLASH = $(MAKEFILE_DIR)
CURRENT_DIR = $(MAKEFILE_DIR_NOSLASH)
CURRENT_DIR_NAME := $(notdir $(MAKEFILE_DIR_PATSUBST))
$1 := $(CURRENT_DIR_NAME)
$2 := $(CURRENT_DIR)
endef
</code>

输出:

<code>➜  youdao_note_summary git:(master) ✗ make help
{MAKEFILE_LIST}= Makefile ../Makefile_common
(MAKEFILE_LIST)= Makefile ../Makefile_common
MAKEFILE_LIST_LASTWORD=
make: Nothing to be done for `help'.
</code>

-》看起来是info中{xxx}和(xxx)都可以输出变量的值啊

【总结】

此处Makefile中define的自定义函数中,用:

<code>$(info xxx={someVariable})
$(info xxx=(someVariable))
#$(info xxx={someVariable})
</code>

都可以打印出对应的变量的值。

echo和print都没用。

转载请注明:在路上 » 【已解决】Makefile中define自定义函数中打印输出没效果

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
100 queries in 0.227 seconds, using 23.42MB memory