在通用makefile中本地化文件名段

在通用makefile中本地化文件名段,makefile,gnu-make,Makefile,Gnu Make,我有一个通用的Makefile,其中有一大堆目标可以在项目中重复使用。我的大部分项目都是土耳其语的,所以我用土耳其语来表示大多数目标名称。这是有意义的,因为它是实际完成的文件需要调用的,并且Makefile也负责发布结果 例如,我的存储库中可能有一个sourcebook.md。随附的Makefile具有副本,因此您可以运行Makebook-a4.pdf并获得该书的a4大小的排版版本。但是还有很多,例如,make book-a4-cilt.pdf将制作一个大小合适的封面,或者make-octavo

我有一个通用的
Makefile
,其中有一大堆目标可以在项目中重复使用。我的大部分项目都是土耳其语的,所以我用土耳其语来表示大多数目标名称。这是有意义的,因为它是实际完成的文件需要调用的,并且
Makefile
也负责发布结果

例如,我的存储库中可能有一个source
book.md
。随附的
Makefile
具有副本,因此您可以运行
Makebook-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的变量类型中没有关联数组或矩阵。我想了几种方法来破解这个,但它们都很肮脏。我可以采用什么样的概念来实现本地化文件名的多语言使用,而不会造成目标定义的混乱(比我已经拥有的还要多?

对于这样的情况,最好是构造变量名。我不太清楚你想做什么,所以我真的不能建议你

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

因此,您的工具箱makefile类似于:

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

book-octavo-3d-$(front).png: ...
等等。然后您可以创建单独的语言值,并包括该生成文件:

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

include rules.mk

# Turkish
cover := cilt
front := on

include rules.mk
请注意,任何在某种程度上不随修改的目标而变化的内容都需要进入一个单独的文件中,这样您就不会将其包含两次并覆盖这些值

这些语言也可以在它们自己的makefile中,因此
包括english.mk
包括turkish.mk
,等等


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

这对我来说还不太清楚。您需要一个“通用”
Makefile
,并希望在许多项目中使用。如果
projectA
是英语,那么目标应该是
book-a4-cover.pdf
。西班牙语
projectB
的有效目标是
book-a4-cilt.pdf
。还有许多
book-a4-{西班牙语,英语}.pdf
targets。我的理解正确吗?@uzsolt差不多正确。不知何故,他们必须映射到相同的配方,其中一些配方需要知道如何从“cilt”中获得,才能知道它的意思是“掩护”。我认为@MadScientist的答案(可能稍加修改)将适用于您的情况。