1

一些背景知识:我有一个基于 ESP-IDF 的项目,它有一个复杂的内置构建系统,您可以使用自己的 makefile 插入该系统(他们使用它的文档)。
这工作正常(除了偶尔可怕的构建时间),但现在我想为组件的单元测试添加一个构建目标,这需要针对另一个项目(the unit-test-app)构建这个组件。

make所以,我需要另一个构建目标,它使用另一个生成文件和目录调用另一个。像这样的东西很好用:

make -C $(path to unit-test-app)                                  \
EXTRA_COMPONENT_DIRS=$(my component directory)                    \
TEST_COMPONENTS=$(my component name)                              \
ESPPORT=$(my serial port)                                         \
-j clean app-flash monitor

但前提是我从 bash 执行它。如果我尝试从另一个 makefile 执行它,它要么找不到一些头文件(主项目和单元测试项目的包含路径不同),要么忽略项目(-C参数)的更改并执行主项目构建。

我尝试了什么:

  • 在自定义目标中使用$(MAKE),$(shell which $(MAKE))make
  • 使用env -i $(shell which $(MAKE) ) -C ...with 将所需的环境参数转发给子 make
  • 使用bash -l make -C ...bash -c make -C ...

什么可行,但很脏:echo $(MAKE) -C ...在 make 目标中使用,然后$(make tests)从命令行运行。

据我所知,这是父makefile在我没有将子makefile与之分开的环境中设置的问题。我还能做些什么来将这两者分开?


更新:我创建了一个更清楚地显示问题的示例项目,请查看https://github.com/chanibal/esp-idf-template-with-unit-testsMakefile的顶部

4

1 回答 1

0

我按照您的描述复制了您的情况,并且无论我从外部调用内部还是从外部调用,make一切bash正常make

所以有些事情你没有告诉我们导致失败。

另一方面,我觉得你的描述中有几个不相关的细节。

因此,我建议您尝试进一步隔离问题,删除不相关的内容,并仅从问题中的描述中重现问题,然后当您这样做时,您可能会发现问题所在。如果没有,请在此处发布最小设置以及发生故障所需的所有其他详细信息。

顺便说一句,你正在做的不是好的做法,所以也许只是避免它会解决你的问题。

我的意思是,只有一种情况和一种情况,递归make是一种很好的做法:make -C ${directory}

在哪里directory你有一个完全独立的构建,不使用外部的任何东西。

对您来说似乎不是这种情况,因为您似乎传递了一些外部位置变量。这种递归make是不好的做法,应该避免。

于 2017-09-25T03:49:57.217 回答