私は、Makefile、リスト処理、およびパターンのルールに関して、奇妙なことをしたようです。ソースが '%'を含むディレクトリにインストールされていると、正しくビルドできません。私はそれを誰かが実行できる簡単なテストケースに煮詰めました。サインインのパスとパーセント記号
私は、次のMakefile持っている:私はTEST1というディレクトリにこれを入れて、私はそれを実行したとき、私は私が... INSTALL_TREEに記載されているすべてのディレクトリが作成されたい正確に何を得る
INSTALL_DIR=$(shell pwd)/idir
INSTALL_TREE =
INSTALL_TREE += $(INSTALL_DIR)/dir1
INSTALL_TREE += $(INSTALL_DIR)/dir2
INSTALL_TREE += $(INSTALL_DIR)/dir3
create_tree: $(INSTALL_TREE)
$(INSTALL_TREE):
mkdir -p [email protected]
を:
% make -n
mkdir -p /home/christopher.arguin/test/test1/idir/dir1
mkdir -p /home/christopher.arguin/test/test1/idir/dir2
mkdir -p /home/christopher.arguin/test/test1/idir/dir3
今テスト%2というディレクトリにまったく同じMakefileを使用しており、これは私が得るものです:
% make -n
mkdir -p /home/christopher.arguin/test/test2%/idir/dir1
最初のディレクトリの後で停止します。最初のディレクトリは%記号を持っていない場合、興味深いことに、それらすべてが生成されます...、例えば、
INSTALL_TREE =
INSTALL_TREE += ./idir/dir4
INSTALL_TREE += $(INSTALL_DIR)/dir1
INSTALL_TREE += $(INSTALL_DIR)/dir2
INSTALL_TREE += $(INSTALL_DIR)/dir3
は私を与える:
mkdir -p dir4
mkdir -p /home/christopher.arguin/test/test2%/idir/dir1
mkdir -p /home/christopher.arguin/test/test2%/idir/dir2
mkdir -p /home/christopher.arguin/test/test2%/idir/dir3
他の興味深いのは、ファイル名があるということです正しい...プレフィックスルールや何らかの置換を期待していると誤って解釈されていた場合、%ディレクトリが作成されるようにすれば絶対的に正しいことになります。
私は%文字をエスケープしようとしましたが、役に立たなかった。
PERCENT := %
ITREE = $(subst $(PERCENT),$(PERCENT)$(PERCENT),$(INSTALL_TREE))
create_tree2: $(ITREE)
$(ITREE):
mkdir -p [email protected]
がちょうど
mkdir -p /home/christopher.arguin/test/test2%%/idir/dir1
置換が働いもたらしたが、それは実際にパーセント記号をエスケープしませんでした:このコードを追加します。後でファイル名に$(PERCENT)が含まれているだけなので、 "%"を "$(PERCENT)"に置き換えることもできませんでした。
私は、二つの関連の質問を見つけた Does GNU Make support '%' in a filename? とHow to correctly escape "%" sign when using pattern rules and patsubst in GNU make? が、それらのどちらも私が持っている基本的な問題...私のソースが入っているディレクトリには、私のコントロール外であることを負いました。
背景: この理由は、私がJenkins Multibranch Pipelineに移行しようとしていることです。 Jenkinsは、コミットを検出すると、ブランチの名前に基づいてワークスペースを作成します。ブランチ命名規則にスラッシュがある場合、Jenkinsは正しいことを行い、それらを "%2F"に変換します。私のメイクファイルはそれらのファイルと衝突しています。
シンボリックリンクを作成できますか? – Beta
悲しいことに、この場合、ワークスペースの名前はJenkinsによって処理されるためです。 –
この問題を避けるためにJenkinsの人たちが積極的に取り組んでいるようです:https://issues.jenkins-ci.org/browse/JENKINS-34564 –