0

定義した2つの関数に問題があり、それらは次のとおりです。

#return the full path of the passed in dir/file with the drive letter removed
define clean_path
$(patsubst $(DRIVE_ROOT)/%,/%,$(abspath $(1)))
endef

#appends the root directory name to the paths except for paths that are absolute.
define qualify_path
$(addprefix $(1),$(filter-out /%,$(2))) $(filter /%,$(2))
endef

qualify_path関数は、パスのリストと、/で始まらないディレクトリを調べて、それに$(1)を追加します。これらの機能は両方とも独立して機能しますが、私の問題は、それらを一緒に使用する場合です。

makefileには、次の行があります。

TEMP_DIRS := $(call qualify_path, $(lastword $(dirstack)), $(SRC_INCDIRS))
$(info TEMP_DIRS = $(TEMP_DIRS))
CLEAN_DIRS := $(call clean_path, $(TEMP_DIRS))
$(info CLEAN_DIRS = $(CLEAN_DIRS))

これらの行が実行されると、$(TEMP_DIRS)に適切な値が割り当てられますが、$(CLEAN_DIRS)は$(TEMP_DIRS)と同じ値になります。この時点でデバッグするためだけに$(TEMP_DIRS)がありますが、実際には次のように組み合わせたいと思います。

CLEAN_DIRS := $(call clean_path, $(call qualify_path, $(lastword $(dirstack)), $(SRC_INCDIRS)))

clean_pathを呼び出す代わりにこれを使用すると、次のようになります。

TEMP_DIRS := $(call qualify_path, $(lastword $(dirstack)), $(SRC_INCDIRS))
$(info TEMP_DIRS = $(TEMP_DIRS))
CLEAN_DIRS := $(patsubst $(DRIVE_ROOT)/%,/%,$(abspath $(TEMP_DIRS)))
$(info CLEAN_DIRS = $(CLEAN_DIRS))

$(CLEAN_DIRS)には、すべての正しい値が含まれています。これは、拡張オーダー、evalの使用などと関係があると確信していますが、実際には理解できません。誰かが私が試みていることを行う適切な方法を説明してくれるなら、それは素晴らしいことです。いつものようにあなたの時間をありがとう。

4

1 に答える 1

0

もちろん、これはばかげた間違いであり、他の誰かがそれを見つける機会はなかったでしょう. unix システムのパスを消去する必要がないため、空白の UNIX システムまたは Windows システムのシステム コマンドをインクルードしていた別の makefile で clean_path 関数を以前に定義していました。関数を 2 つの異なる場所で定義すると、make が台無しになるので、何もしませんでした。問題が解決するまですべてをコメントアウトしてから、少しずつ追加し直すという問題が見つかりました。Windowsコマンドインクルードのコメントを外すと、再び壊れたので、そこを調べたところ、clean_path関数がありました。助けてくれてありがとう。

于 2012-05-29T11:33:32.183 に答える