14

次の簡略化されたメイクファイルがあり、さまざまなターゲットに基づいてさまざまなパスを設定しようとしています。残念ながら、期待した結果が得られません。これはmakeバージョン3.81です。

.SECONDEXPANSION:
all:  Debug32

# Object directory set by target
Debug32:  OBJDIR = objdir32
#OBJDIR = wrongdirectory

# ObjDir is empty here. :(
OBJS = $(addprefix $(OBJDIR)/,DirUtil.o)

$(OBJDIR)/%.o : %.cpp
            echo Compile: $@

Debug32: $(OBJS)

$(OBJS): | $(OBJDIR)

$(OBJDIR):
            echo mkdir $(OBJDIR) - $@

OBJDIR を設定しない場合の結果は次のとおりです。

echo Compile: /DirUtil.o

「OBJDIR = wrongdirectory」行のコメントを外すと、次の結果が得られます。これは、変数の両方の値が表示されるため、混乱します。

echo mkdir objdir32 - wrongdirectory -
echo Compile: wrongdirectory/DirUtil.o

変数が展開されるべきだと思うときに変数が展開されていないと仮定していますが、この動作を変更する方法がわかりません。

4

2 に答える 2

4

良い扱い方

%/obj.o: | %
    touch $@

OBJDIRS = objdir32 wrongdirectory anotherdirectory
$(OBJDIRS):
    mkdir $@

は:

%/.:
    mkdir -p $@

.SECONDEXPANSION:

その後、ディレクトリを必要とする可能性のあるターゲットに対して、単に書き込むことができます

target: prerequisites | $$(@D)/.
    normal recipe for target
于 2013-10-11T18:25:10.827 に答える