私が持っている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
。インデントスペースをもう一度タブに変更する必要があります。無音インターフェイスが空白を破壊しています。