makefileのパラメータリストが長すぎます。エラー

makefileのパラメータリストが長すぎます。エラー

私が持っているmakefileから

@echo "$(IGNORE_DIRS) $(CLEAN_FILES) $(CLEAN_DIRS) $(REALCLEAN_FILES)" | tr ' ' '\n' >> $@

問題は、それが$(CLEAN_FILES)大きいので、makeを実行すると、次のような結果が出るということです。

make: execvp: /bin/sh: Argument list too long

私はXubuntu 18.10を使用しています。

編集:より多くの背景情報を提供する必要があります。私が作業しているのは、ファイルを自動的に生成するmakeルール(GNU makeを使用しています)です.hgignore。完全なmakeルールは次のとおりです。

.hgignore : .hgignore_extra
    @echo "Making $@"
    @rm -f $@
    @echo "# Automatically generated by Make. Edit .hgignore_extra instead." > $@
    @tail -n +2 $< >> $@
    @echo "" >> $@
    @echo "# The following files come from the Makefile." >> $@
    @echo "syntax: glob" >> $@
    @echo "$(IGNORE_DIRS) $(CLEAN_FILES) $(CLEAN_DIRS) $(REALCLEAN_FILES)" | tr ' ' '\n' >> $@
    @chmod a-w $@
.PHONY : .hgignore

編集2:@mosvyの提案に従って私も試してみました。

.hgignore : .hgignore_extra
    @echo "Making $@"
    @rm -f $@
    @echo "# Automatically generated by Make. Edit .hgignore_extra instead." > $@
    @tail -n +2 $< >> $@
    @echo "" >> $@
    @echo "# The following files come from the Makefile." >> $@
    @echo "syntax: glob" >> $@
    $(file >$@) $(foreach V,$(IGNORE_DIRS) $(CLEAN_FILES) $(CLEAN_DIRS) $(REALCLEAN_FILES),$(file >>$@,$V))
    @true
    @chmod a-w $@
.PHONY : .hgignore

このコマンドを実行した後は、make .hgignore「引数リストが多すぎる」エラーは発生しませんが、結果の.hgignoreファイルにはそのsyntax: glob行の前の出力のみが含まれ、それ以降は何も含まれません。

ベストアンサー1

@schilyがすでに説明したように、これはシェルの問題ではなくxargs、引用符、より多くのエコー分割;などを使用して解決することはできません。 make 操作のすべてのテキストは単一の引数として渡され、オペレーティングシステムがexecve(2)許可する最大サイズより長くすることはできません。

GNU make(Linuxではデフォルト)を使用している場合は、次のものを使用できます。fileそしてforeach機能:

TEST = $(shell yes foobar | sed 200000q)

/tmp/junk:
        $(file >$@) $(foreach V,$(TEST),$(file >>$@,$V))
        @true

.PHONY: /tmp/junk

これにより、$(TEST)改行文字で区切られたすべての単語が名前付きファイルに印刷されます$@。 make の同様の例に基づいています。手動

Makefileは素晴らしいGNU機能を必要とせず、より管理しやすいものに再設計できますが、公開したコードスニペットでは何をするのかわかりません。

修正する:

質問の正確な部分については、次のことができます。

.hgignore : .hgignore_extra
    $(info Making $@)
    $(file >[email protected])
    $(file >>[email protected],# Automatically generated by Make. Edit .hgignore_extra instead.)
    $(shell tail -n 2 $< >>[email protected])
    $(file >>[email protected],)
    $(file >>[email protected],# The following files come from the Makefile.)
    $(file >>[email protected],syntax: glob)
    $(foreach L, $(IGNORE_DIRS) $(CLEAN_FILES) $(CLEAN_DIRS) $(REALCLEAN_FILES), $(file >>[email protected],$L))
    @mv -f [email protected] $@
    @chmod a-w $@
.PHONY : .hgignore

.hgignore.new最初に作成し、すべてがうまくいけば送信される.hgignore.newように少し変更しました.hgignore。インデントスペースをもう一度タブに変更する必要があります。無音インターフェイスが空白を破壊しています。

おすすめ記事