在通用makefile

时间:2017-01-21 14:16:00

标签: makefile gnu-make

我有一个通用Makefile,其中包含一大堆在项目中重复使用的目标。在大多数情况下,我的项目都是土耳其语,因此我对大多数目标名称使用了土耳其语。这是有道理的,因为它是需要调用实际完成文件的内容,Makefile也负责发布结果。

例如,我的存储库中可能有一个源book.md。包含的Makefile具有收件人,因此您可以运行make book-a4.pdf并获得该书的A4大小的排版版本。但还有更多,例如make book-a4-cilt.pdf将构建一个适当大小的封面,或make-octavo-3b-on.png将以Octovo大小呈现该书的3D模型。

这很好用,但现在我想允许Makefile用作工具包,这要求它可以在其他语言中使用。规则的基本名称取决于项目,因此这些不是问题。纸张尺寸不是问题,因为它们无论如何都不是本地化的。但所有其他目标名称都成了问题。

例如,如果项目语言设置为英语make book-a4-cover.pdf,则需要执行make-a4-cilt.pdf正在执行的操作,而make book-octavo-3d-front.png需要执行make book-octavo-3b-on.png正在执行的操作。

在GNU-Make的变量类型中,有不是关联数组或矩阵。我想过几种方法可以解决这个问题,但他们都非常肮脏。我可以采用什么样的概念来实现多语言使用本地化的文件名而不会弄乱目标定义(比我已经有的)?

1 个答案:

答案 0 :(得分:1)

你能做的最好的事情就是构造变量名。我不清楚你想做什么,所以我不能真的建议你。

您说您希望makefile成为工具包。一种选择是编写一个通用的makefile,它使用不同语言值的变量名,然后以不同的方式设置这些变量。

所以你的工具包makefile会是这样的:

$ cat rules.mk
book-a4-$(cover).pdf: ...

book-octavo-3d-$(front).png: ...

等。然后,您可以创建单个语言值,并包含该makefile:

$ cat Makefile
# English
cover := cover
front := front

include rules.mk

# Turkish
cover := cilt
front := on

include rules.mk

请注意,任何基于修改后的目标不可变的内容都需要进入单独的文件,因此您不要将其包含两次并覆盖这些值。

语言也可以在他们自己的makefile中,所以include english.mkinclude turkish.mk或其他。

或者,您可以为每种语言编写不同的makefile,并以递归方式或许多不同的方式调用它们。