我是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楼 票数:3

首先,假设您正在使用GNUMake,有一种更简单的方法来处理YCS_ROOTDEFAULT_YCS_ROOT

DEFAULT_YCS_ROOT := /opt/yujin
YCS_ROOT ?= DEFAULT_YCS_ROOT

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

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

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}/

  ask by user1514286 translate from so

未解决问题?本站智能推荐:

1回复

为变量中的模式创建模式规则?

我有这个简单的模式规则 我想使用这个规则但是添加了一个约束,即模式匹配一​​个名为FILENAMES的变量中的一个单词。 有没有办法可以做到这一点?
1回复

使用eval时,Makefile规则不是目标

我有一个makefile,它将tar文件提取到运行时确定的可变数量的文件夹中(在下面的示例中,这是硬编码的): 在运行时为每个变量案例生成规则,并使用eval和call解析为make指令。 请注意以下几行: 当第二行被注释掉时,我得到以下输出和错误: 当我使用-pRr运行make
2回复

为什么不使用eval扩展此变量?

我对以下makefile有疑问。 我使用GNU Make v4.1。 ${foo}回声hello ,但${bar}回声。 为什么会这样呢? 我希望${bar}也能打个hello ,因为我认为这等效于以下makefile:
3回复

什么时候应该在make配方中评估对*eval*的调用

我有一些软件项目作为RPM分发。 它们使用语义版本控制版本 ,我们在其上添加版本号 。 使用常规约定,这是MAJOR.MINOR.PATCH-REL_NUM 。 虽然超出了本文的范围,但是版本号存储在git中。 makefile的发布目标如下所示: 在调试时,我最终发现,尽管调用ev
2回复

如何在makefile的规则配方中创建局部变量?

如何在 Makefile 配方中创建局部变量,其中只有它是可分配的并且仅在那里使用?
1回复

使用define生成带有eval函数的Makefile规则

我想为许多PROG在Makefile中生成规则 这样的输出 gcc提示没有输入文件。 我的Makefile有什么问题? 首先谢谢。 抱歉,我的英语不好。
2回复

重新评估GNUmakemakefile变量

我继承了一个大型分支项目? 这要求将易失的.a档案集$(LIB_FILES)包含到链接目标中,该链接目标位于某些目录$(LIB_DIRS)中。 我可以这样写一个表达式: 问题在于它们可能在make调用时不存在,而是通过在另一个目标规则内调用$(MAKE)来构建的,这是链接步骤的前提。
3回复

重新评估makefile变量

有没有一种方法可以在每次使用时重新评估变量的定义? 例如: 因此,读取makefile时将评估MAP_FILES,如果$ TMP目录中没有.map文件,则该变量为空。 但是,在generate_map_files规则完成后,目录中将存在.map文件,我希望这些.map文件的列表成为wor