如何评估规则内创建的变量? (带eval)

时间:2012-09-17 13:36:49

标签: makefile

我是makefiles的新手,我遇到了这个问题:如何创建一个符号链接到找到的目录中的所有文件,所有这些都在规则中:

我想知道对“find”的调用是否会检索任何结果。如果我将结果分配给带有“eval”的变量(我知道在规则中设置变量的唯一方法),“ifdef”评估不起作用。

我也试过用“ifneq”比较“”但是不起作用。

可能我的方向错误,所以如果有人采取其他方法,我会非常感激。

这里是整个Makefile :(有趣的行标有######)

非常感谢你!

DEFAULT_YCS_ROOT := /opt/yujin

all:
ifdef YCS_ROOT
    @echo Looking for Yujin maps in ${YCS_ROOT}
else
    $(eval YCS_ROOT := ${DEFAULT_YCS_ROOT})
    @echo WARNING: YCS_ROOT is undefined. Looking for Yujin maps in default path ${YCS_ROOT}
endif

    $(eval MAPS_DIR := $(shell find ${YCS_ROOT} -name yujin_maps))
    @echo ${MAPS_DIR}  "${MAPS_DIR}"
ifdef MAPS_DIR  ######
###### misguided alternative....  ifneq (${MAPS_DIR}, " ")
    $(eval DEST_DIR := $(shell pwd)/resources/yaml/stage/maps)
    @echo Creating symbolic links on ${DEST_DIR} for every PGM map on ${MAPS_DIR}/maps
    rm ${DEST_DIR}/*.pgm
    for f in ${MAPS_DIR}/maps/*.pgm; do ln -s $$f ${DEST_DIR}/; done
else
    @echo ERROR: Yujin maps package not found in ${YCS_ROOT}. Define YCS_ROOT variable properly
endif

1 个答案:

答案 0 :(得分:3)

首先,假设您使用的是GNUMake,可以更轻松地处理YCS_ROOTDEFAULT_YCS_ROOT

DEFAULT_YCS_ROOT := /opt/yujin
YCS_ROOT ?= DEFAULT_YCS_ROOT

当且仅当DEFAULT_YCS_ROOT未定义时,这会将YCS_ROOT的值分配给YCS_ROOT

对于变量MAPS_DIRDEST_DIR,您将使用shell语法混合使用Make语法。我认为最简单的方法是在规则之外定义两个变量:

MAPS_DIR := $(shell find ${YCS_ROOT} -name yujin_maps)
DEST_DIR := $(shell pwd)/resources/yaml/stage/maps

您应该测试所有这些,以确保变量具有您期望的值。 您似乎只希望MAPS_DIR中有一个目录;我将遵循该约定,但它不安全。到目前为止makefile工作后,您可以添加规则。你可以使用shell循环:

all:
    rm ${DEST_DIR}/*.pgm
    for f in ${MAPS_DIR}/maps/*.pgm; do echo ln -s $$f ${DEST_DIR}/; done

或使用Make语法(这有一些优点):

MAPS := $(wildcard $(MAPS_DIR)/maps/*.pgm)
DEST_MAPS := $(patsubst $(MAPS_DIR)/maps/%.pgm, ${DEST_DIR}/%.pgm, $(MAPS))

all: $(DEST_MAPS)

${DEST_DIR}/%.pgm: $(MAPS_DIR)/maps/%.pgm
    rm $@
    ln -s $< ${DEST_DIR}/