2017-01-21 5 views
0

私は汎用の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.pngmake book-octavo-3b-on.pngが何をしているのか行う必要があります。

GNU-Makeの可変型の中には、ではなく、の連想配列または行列があります。私はこれをハックするいくつかの方法を考えましたが、彼らはすべて本当に汚いと感じます。ターゲット定義を混乱させることなく、ローカライズされたファイル名で多言語の使用を可能にするには、どのような概念が必要でしょうか?

+0

私にとってはそれほど明確ではありません。あなたは '一般的な' 'Makefile'を使いたくて、多くのプロジェクトで使いたいと思っています。 'projectA'が英語の場合、ターゲットは' book-a4-cover.pdf'でなければなりません。スペイン語 'projectB'の有効なターゲットは' book-a4-cilt.pdf'です。そして多くの 'book-a4- {spanish、english} .pdf'のターゲット。私は正しいことを理解していますか? – uzsolt

+0

@uzsoltそれは正しいことです。そして、どういうわけか、彼らは同じレシピにマッピングしなければならず、レシピのいくつかは、 "覆い"を意味することを知るために "詰め物"から得る方法を知る必要があります。 – Caleb

+0

私は@ MadScientistの答えは(おそらくいくつかの小さな変更で)あなたのケースでは右になると思います。 – uzsolt

答えて

1

このようなことに対してできることは、変数名の作成です。あなたがしたいことが私にはっきりと分からないので、本当にあなたにアドバイスすることはできません。

メイクファイルをツールキットにしたいとします。 1つのオプションは、異なる言語値に対して変数名を使用するジェネリック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 

注意ではありません任意のコンテンツいます変更されたターゲットに基づく変数は、何らかの方法で別のファイルに移動する必要があるため、2回インクルードして値を上書きする必要があります。

これらの言語は、独自のメイクファイルである可能性もあります(include english.mkinclude turkish.mkなど)。

また、言語ごとに異なるメイクファイルを作成し、再帰的に呼び出すことも、さまざまな方法を使用することもできます。

関連する問題