我是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
答案 0 :(得分:3)
首先,假设您使用的是GNUMake,可以更轻松地处理YCS_ROOT
和DEFAULT_YCS_ROOT
:
DEFAULT_YCS_ROOT := /opt/yujin
YCS_ROOT ?= DEFAULT_YCS_ROOT
当且仅当DEFAULT_YCS_ROOT
未定义时,这会将YCS_ROOT
的值分配给YCS_ROOT
。
对于变量MAPS_DIR
和DEST_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}/