配布用のzip / tarbarを作成するmakefileルールがあります。レシピでは、CR / LFが正しいことを確認し、パッケージングする前に実行ビットが正しいことを確認するなど、「付加価値」タスクを実行します。
プロジェクトには多数のファイルがありますが、要件は次のとおりです。(1)GNUmakefile
needを除くすべてのファイルCR/LF
、(3)needのみがGNUmakefile
必要LF
、(3)GNUmakefile
needを除くすべてのファイルa-x
。
レシピは次のとおりです。
.PHONY: convert
convert:
chmod a-x *[^GNUmakefile*] TestData/*.dat TestVectors/*.txt
unix2dos --keepdate --quiet *[^GNUmakefile*] TestData/*.dat TestVectors/*.txt
dos2unix --keepdate --quiet GNUmakefile
*
IDE固有のファイルなど、一部のファイルは明確ではないため、ビュッフェ内のすべてのファイルを明示的に一覧表示しないようにしています。 (*[^<somefile>*]
これはきちんとしたトリックです。私はグローバルマッチングからパターンを除外)。
問題は、TestData
一致TestVectors
時に実行中なので、chmod a-x
ディレクトリから自分自身を除外することです。
何かを改善する必要がありますが、どうすればいいかわかりません。シェルの「*」globを使用したいのですが、ファイルを除いてディレクトリと一致しません。
どうすればいいですか?
ベストアンサー1
filter-out
この問題はGNU Makeと関数を使って解決しますwildcard
。これらで実行できない唯一の作業は、ディレクトリをフィルタリングすることです。これはシェルを介して行う必要があります。以下のコードはテストされておらず、(a)ファイル名にスペースやシェルメタTestData/*.dat
文字がなく、(b)TestVectors/*.txt
ディレクトリチェックが不要であるとします。
NORM_TOPLEVEL := $(shell for f in $(filter-out GNUMakefile,$(wildcard *)); \
do [ -d "$$f" ] || printf '%s\n' "$$f"; done)
NORM_TESTDIRS := $(wildcard TestData/*.dat) $(wildcard TestVectors/*.txt)
convert:
chmod a-x $(NORM_TOPLEVEL) $(NORM_TESTDIRS)
unix2dos --keepdate --quiet $(NORM_TOPLEVEL) $(NORM_TESTDIRS)
dos2unix --keepdate --quiet GNUmakefile
.PHONY: convert