【问题标题】:What is the best way to write a makefile from a makefile从makefile编写makefile的最佳方法是什么
【发布时间】:2013-06-03 14:25:48
【问题描述】:

我正在尝试从 makefile 编写规则文件(makefile),我使用了 echo 命令来执行此操作, 但是当我谈到 $ 的部分时,我无法弄清楚如何正确地做到这一点。

我试过了:

$(shell echo -e "#!/usr/bin/make -f \nPYTHON3=\"$(shell py3versions -vr)\"" >>text.txt

但我收到错误消息说:

 py3versions: error parsing Python-Version attribute

我要写入规则文件的代码:

 #!/usr/bin/make -f 

 PYTHON3=$(shell py3versions -vr)

 %:
     dh $@   python3 --buildsystem=python_distutils

 override_dh_auto_build: $(PYTHON3:%=build-python%)

 ......

任何人都可以就我应该使用哪个命令来创建此类文件提出一些建议? 如果使用 echo 命令,输入 $ 的方法是什么?

更新我的情况:

我正在尝试构建一个 python debian 包。上面显示的规则文件是构建它的方法。 (当然在调用其他函数后,如

python  setup.py sdist 

py2dsc,

然后这个规则(它被称为规则而不是makefile)文件将被调用来构建debian包。

规则文件可以通过 py2dsc 命令自动生成,但我需要对其进行修改以使其适用于不同版本的 python(例如,python2.* 和 python3.*)。所以我想只为 python2.* 和 python3.* 从 makefile 编写规则文件(它将调用 python setup.py sdist 和 py2dsc 以及这个规则文件)。

现在我面临一个问题:如何将 shell 命令以它的方式写入规则文件。非常感谢!

【问题讨论】:

  • 这里添加的信息没有多大帮助。您在上面显示的 makefile 不可能工作,所以这不能是“构建它的方式”。例如,先决条件$(PYTHON3:%=build-python%) 不起作用。它将扩展为值build-python$(shell py3versions -vr),正如我们所见,它将失败,因为-r 选项需要一个参数。你实际上想在这里跑什么?对py3versions成功调用会是什么样子?
  • 为了让我们俩都更容易:忘记py3versions命令(它是通过debuild命令而不是make调用的,当我使用debuild时,规则文件运行良好)。假设我们有一个 shell 命令 DATE=$(shell date) (而不是那个 PYTHON3=$(shell py3versions -vr)。我在定义部分尝试了 DATE=$(shell date),我从命令中的规则文件。但我真正想要的是只有 DATE=$(shell date) (不是执行的输出)可以完成吗?谢谢。
  • 如果您要问的是如何显示静态字符串$(shell date) 而不是让运行函数$(shell date),这就是我在下面的回答中解释的:转义$,然后 make 不会扩展它:echo 'PYTHON3 = $$(shell date)'
  • 非常感谢。它有效!

标签: python linux makefile


【解决方案1】:

使用两个美元符号 ($$) 将美元符号从 make 中转义:

all:
         @echo 'VAR = $$VAR'

顺便说一句,我不认为你不应该使用$(shell ...)。您没有给出您的 makefile 的完整示例,但如果您的 echo 命令是配方的一部分,请直接编写它,不要使用 $(shell ...)

还请注意:echo -e 不可移植,并且不适用于所有 POSIX 系统。我建议你改用printf,它可以做同样的事情并且是可移植的。

【讨论】:

  • 非常感谢。是的,这样我可以获得大部分内容。但是当涉及到 PYTHON3=$(shell py3versions -vr) 时,我仍然收到错误消息说 py3versions: error parsing Python-Version attributes。有任何想法吗?谢谢。
  • 每当遇到此类问题时,首先要尝试从 shell 提示符下运行它。如果你不能在那里运行它,那么当你从 make 运行它时它显然不会工作。当我这样做时:$ py3versions -vr 我得到了同样的错误。查看帮助 (py3versions --help) 我可以看到 -r 选项期望得到一个参数:[-r|--requested <version string>|<control file>] 所以我会尝试给它一个。
  • 非常感谢您的提示。是的 py3versions 需要另一个文件名或 X-python-version 属性的值。就我而言,我想按原样将 PYTHON3=$(shell py3versions -vr) 行写入另一个文件(规则),而不是执行它。该行将从规则文件中执行(我设置了 X-python-version 属性)。如果我在这里误解了什么,请指出。非常感谢!
  • $(shell ...) 命令运行你给它的命令,它不你给它的命令。这就是您看到此错误的原因:当您使用变量$(PYTHON3) 时,make 运行命令py3versions -vr,但它会因该错误而失败。基本上,您在问题中显示的生成的 makefile 似乎不正确,我不知道您真正想要做什么。也许如果您用文字描述了您想要做什么以及为什么需要生成一个makefile?请使用以下信息编辑问题:长序列的 cmets 难以管理。
猜你喜欢
  • 1970-01-01
  • 2015-04-24
  • 1970-01-01
  • 2017-04-15
  • 1970-01-01
  • 2010-09-16
  • 2013-06-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多