Red Hat の従業員が Goals アセンブリ システムを紹介しました。 GNU Make 4.2のリリース

リチャード・W・M・ジョーンズ、作家 libguestfs、レッドハットで働いている、 紹介された 新しいアセンブリユーティリティ 目標は、スクリプトの全体的な単純さと理解しやすさを維持しながら、make のユーティリティの欠点や問題を取り除くことを目的としています。 make ユーティリティは 1976 年に設計され、概念的な欠点が多数ありました。Goals では、一般的な概念を変更せずにこれらの欠点を解消する予定です。
目標のソースコード によって配布 GPLv2+ に基づいてライセンスされています。

解決された問題:

  • 依存関係解決戦術は XNUMX つだけサポートされています - 「ターゲット ファイルが見つからない場合、または依存関係の XNUMX つより古い場合にアセンブリ命令が実行される」。 Goals では、URL の存在の確認、任意のファイルとの変更時間の比較、パッケージのビルドインの評価など、他の戦術を実装する予定です。 こうじ、チェックサムの比較、テストを選択的にスキップしてテスト ケースを実行します。
  • ビルド ターゲットを処理するときに、make はファイルとルール名を分離しないため、ルールの実行時に、作成されたと主張するファイルが実際に作成されるかどうかのチェックは行われません。 たとえば、テストを含むスクリプトを実行する「test」というルールがある場合、「test」という名前のファイルが誤って作成され、その後テストは呼び出されなくなります。これは、make がターゲットがビルドされており、必要がないとみなしてしまうためです。任意のアクション (make で問題を回避するには、「.PHONY: test」ディレクティブを指定できます)。 ゴールはファイルとルール名を明示的に分離します。

    Red Hat の従業員が Goals アセンブリ システムを紹介しました。 GNU Make 4.2のリリース

  • アセンブリ命令にパラメータを XNUMX つだけ指定する場合の問題。

    Red Hat の従業員が Goals アセンブリ システムを紹介しました。 GNU Make 4.2のリリース

    Goals を使用すると、任意の数の名前付きパラメータを使用できます。 たとえば、名前からデバッグ ファイルの署名を個別に抽出できます。

    Red Hat の従業員が Goals アセンブリ システムを紹介しました。 GNU Make 4.2のリリース

  • シェルインタープリタとの対話に関する問題。 たとえば、ファイル名とディレクトリ名のスペースのエスケープを制御する必要性、各コマンドを実行するときに別のシェル インタープリタを起動する際のリソースの無駄、「$」文字の二重解釈 (シェルとメイクの両方で使用される)、インデントを考慮して。

    これらの問題は、Goals でパーサーを使用し、アセンブリ変数に「$」の代わりに「%」記号を使用することで解決されます (「$」はシェルのみに残ります)。 LALR(1)これには、パスとファイル名を引用符で囲み、コード ブロックを中括弧で強調表示する必要があります。 コマンド ブロック全体がコマンド シェルの XNUMX つのインスタンスで起動され、ブロック内では、特別なスペースを参照せずに、任意のコードの書式設定が許可されます。

    それは次のとおりです。
    ターゲット: foo.o bar.o
    ${CC} ${CFLAGS} $< -o $@

    それは次のようになりました。
    "ターゲット": "foo.o"、"bar.o" {
    %CC %CFLAGS %< -o %@
    }

ゴールのその他の機能:

  • 任意の名前とパラメータを指定するためのオプションのサポート:

    目標すべて = : "目標"

    ゴールリンク =
    "ターゲット" : "foo.o"、"bar.o" { ... }

    目標コンパイル (名前) =
    "%name.o" : "%name.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ }

  • XNUMX つの起動モード: ビルド ターゲットとファイル名を一致させる make モード (たとえば、ファイル "foo.o" はターゲット "%name.o" と一致します)、および直接コンパイル モード:

    目標すべて = : リンク

    ゴールリンク =
    "ターゲット" : "foo.o", コンパイル ("バー") { ... }

    目標コンパイル (名前) =
    "%name.o" : "%name.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ }

  • 組み立て戦術は、組み立てターゲットを再組み立てする必要性を判断するために使用できる特別なルールによって決定されます。 ファイルの存在へのリンクが作成されている場合、これは対応する記号 (ルール名の場合は「ターゲット」、ファイルのチェックの場合は *file (「ターゲット」)) によって明示的に決定されます。

    "ターゲット" : "foo.o"、"bar.o" { ... }

    *file("target") : *file("foo.o"), *file("bar.o") { ... }

  • 開発者は、アセンブリ戦術の任意の属性を定義できます。 「*file」フラグはデフォルトで定義されています (@{...} は出力の抑制を示し、「exit 99」は再構築の必要性を示します)。

    戦術 *file (ファイル名) = @{
    テスト -f % ファイル名 || 99番出口
    f の場合 (%)

    出所: オープンネット.ru

コメントを追加します