问题标签 [multiple-makefiles]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
146 浏览

environment-variables - 无法在另一个生成文件中执行一个生成文件

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

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

但前提是我从 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的顶部

0 投票
1 回答
32 浏览

makefile - Makefile:包含第二个文件时重铸宏

我有一个包含两个这样的 make 文件:

问题是两者的输出都是/src但应该是/

这是怎么发生的,我该如何解决这个问题?

0 投票
2 回答
464 浏览

recursion - 如何制作将相同命令应用于子目录的单个makefile?

为清楚起见,我在带有GnuWin32 make的 Windows 上运行它。

我有一组目录,其中包含多个不同级别的降价文件 - 理论上它们可能位于分支节点中,但我认为目前它们仅位于叶节点中。我有一组pandoc/LaTeX命令可以运行以将降价文件转换为 PDF——显然,如果降价文件已更新,我只想重新创建 PDF,所以 amakefile似乎合适。

我想要的是makefile根目录中的单个,它遍历任何和所有子目录(到任何深度)并应用我将为运行pandoc指定的 make 规则。

根据我所能找到的,recursive makefiles要求您makefile在每个子目录中都有一个(这似乎是我想避免的管理开销)和/或要求您在开始时列出所有子目录的makefile(再次,宁愿避免这种情况)。

理论文件夹结构:

我如何编写一个makefile来处理这种情况?

0 投票
1 回答
177 浏览

makefile - 在多个 Makefile 中包含 Makefile 和 Echo 变量

在我最近不得不查看的 Makefile 中,它包括这个include $(MAKERULES)

现在对我来说,我会想到它拥有的makefile顶部的某个地方,MAKERULES = xyz但它没有。所以我打印出 MAKERULES

然后我做测试。它运行并打印出另一个 Makefile Location,Makefile2。

X/Y/Z/Makefile2 路径。我进入这个 Makefile 并尝试写出一些 echo 语句,以便我可以看到正在打印的内容,但没有打印出来。

是否可以从我的本地 Makefile (Makefile) 引用的另一个 Makefile (Makefile2) 中打印出变量?

0 投票
0 回答
299 浏览

makefile - 'make' 命令运行 ./configure

所以,我从源代码编译apt,我需要在运行./configure之前运行make。但是为什么,当运行make命令时,它会运行./configure。为什么./configure当我跑步时它正在运行make?因为make重新配置呢?

笔记

Makefile我在 apt 源代码文件夹中看到一个多个文件。

0 投票
1 回答
819 浏览

bash - MacOS catalina Makefile 无法正确处理在 CLI 中工作的 shell 命令

TL;博士:

这在 MacOS (catalina) 的 Makefile 中不起作用:

但是在命令行上执行时,用$(all_makefiles_except_current)正确的路径替换,它可以工作。


深入解释

嘿,

我在 Makefile 中有以下代码:

这样做是包含repos变量中指定的所有 Makefile,获取所有包含文件的列表,设置在 中all_makefiles_except_current,然后尝试从以 .结尾的 Makefile 中获取所有目标-setup

这是包含的 Makefile 中的示例:

这是一个自我记录的 makefile

如果我运行 shell 命令:

注意:在 windows 和 linux 上,grep 正则表达式必须没有单引号,例如:grep -h -E .+-setup:.*##

在命令行IT WORKS上,我得到了我想要的目标,这将在 Windows (msys2)、Linux (ubuntu) 和 MacOS (catalina) 上运行。

但在 Makefile 中,MacOS 中的grab_setup_rule始终为空。似乎它没有得到正确处理。

grab_setup_rule在 MacOS 上做错了什么?

0 投票
1 回答
75 浏览

makefile - 如何创建用于从子目录中的其他 Makefile 编译多个驱动程序的 Makeflow

我对 GNU makefiles 比较陌生,目前我的工作是,我需要在 makefile 中为项目创建一个目标来编译一堆驱动程序。每个驱动程序已经在自己的构建目录中创建了自己的makefile,并且每个驱动程序需要调用的目标是相同的。IE。对于驱动程序 A 和驱动程序 B,必须调用“make shared”。

我目前的想法是在主 makefile 中定义每个驱动程序的路径,如下所示:

从这里开始,我真正想做的是为每个 DRIVER_A、DRIVER_B 和 DRIVER_C 调用相同的过程,即:

因此,为了实现这一点,我尝试将 DRIVER_A、DRIVER_B 和 DRIVER_C 放入一个对象中,例如

然后在 DRIVER_SOURCES 上调用目标

但这不起作用,因为没有规则为 DRIVER_A、DRIVER_B 和 DRIVER_C 制定目标,这在事后看来对我来说是有意义的,但是我不知道另一种方法来完成我想要完成的事情。

我也愿意为每个驱动程序调用 make 的更好方法,而不是 cd'ing 到它的目录并调用 make,我确信有一种更清洁的方法,但我只是马上开始使用功能。

任何帮助都会很棒,如果需要更多信息,请告诉我,如果我遗漏了什么,我深表歉意,我对在堆栈溢出上发帖还很陌生。

编辑:我在第 4 个代码块中打错字,将“DRIVER_A”替换为 $@

0 投票
2 回答
50 浏览

gnu-make - 如何使用 GNU make 编译多个简单的项目

我正在尝试从编程书中实现各种项目。我的意图是让每个项目在其自己的文件夹中进行练习,然后有一个 makefile 将所有项目编译为make all. 文件夹结构是这样的:

我想学习如何建立这样的结构。特别是顶部makefile访问那里src调用的所有文件夹的部分make,然后将可执行文件复制并重命名到bin文件夹中。

0 投票
1 回答
232 浏览

c++ - 使用 riscv 链接器链接某些库时出现问题

我正在尝试使用此处创建的编译器(riscv64-linux)编译一组文件。但是,我有一些问题,我认为是我对图书馆的误解造成的。

我将库 libgcc 包含在 Makefile 中,并在 LINKER_FLAGS 部分带有标志 -lgcc。但是,我得到以下输出:

当我执行 $ riscv64-linux-ld --verbose | grep SEARCH_DIR | tr -s ' ;' \\012 以查看 riscv64-linux-ld 在哪里寻找库时,我得到了多个路径。其中之一是 /home/luna/noelv-buildroot/output/host/riscv64-buildroot-linux-musl/lib"

但是,当我看到该路径的内容时,我可以找到 libgcc 库:

这让我想知道:

  1. 这真的意味着图书馆就在这条路上吗?

  2. 如何向该编译器的 SEARCH_DIR 添加路径?

  3. 我认为它可能会发生,因为它需要一个静态库。为此,我尝试通过添加 Makefile 来链接静态 libgcc 库 (libgcc.a) LINKER_INCLUDES = -L/home/laumecha/noelv-buildroot/output/host/lib/gcc/riscv64-buildroot-linux-musl/8.3.0/,在此路径中,我们可以找到 libgcc.a。为什么链接器仍然找不到 -lgcc?

  4. 当我添加 LINKER_FLAGS += -lm -static -lgcc -nostartfiles -L/home/luna/noelv-buildroot/output/build/host-gcc-final-8.3.0/build/riscv64-buildroot-linux-musl/libgcc/ 到链接器标志时,我得到了多个未定义的引用:

这是否意味着我已成功链接图书馆而我错过了其他图书馆?

注意:我没有从 Makefile 中放置代码,因为我知道我的问题来自我的基本概念,并且 Makefile 是在一些官方网站上制作的。

0 投票
0 回答
65 浏览

makefile - 将新的 fortran90 模块包含到现有的大型 fortran90 模型中

我是fortran90的初学者。我想做的是从由 fortran90 编写的现有巨大模型中调用一个新模块(也是 fortran90)。我所知道的是,运行 fortran 脚本高度依赖于 gfortran 使用 make 或 cmake 进行的编译。&将编译make& 。我检查了一下,这个巨大的模型使用带有大型 Makefile 的命令。我想使用的新模块包含几个文件。所以不可能简单地将这个模块写入模型的一个现有 .f90 文件中......而且有一件事是,我只想在现有 fortran90 模型的 ONE 子程序中使用这个新模块。cmakeMakefileCMakefilemake.f90

对于新模块,它是从 GitHub 下载的,编译由cmake. 首先我需要运行一个 bash 文件!sh build_steps.sh!用于在 python 终端中运行 bash 命令)。!sh build_steps.sh简单如下:

然后CMakelists.txt如下:

Makefile太长了,所以我把它保存在谷歌文档https://docs.google.com/document/d/10naj1WgE9P4qbILT3n85TosZCd1KISwSzGw2u5FIOwo/edit?usp=sharing。(这个模型是开源的......)

Make我对 bash 有所了解,但对and一无所知Cmake。所以我只想知道,有没有一种简单的方法来组合这两个makefile?如何在现有的 makefile 中声明子例程依赖项?或者只是简单地在现有的 fortran 90 子例程中导入新模块,就像import numpy在 python 中一样。还是我需要一一改变依赖?

非常感谢!