GNU make:如何在先决条件中为多个目标使用自动变量?



我使用GNU make来编译我的fortran项目。在我的特殊情况下,我有两个静态库,每个库都有一个相关对象列表。我的Makefile包含:

LIB_BTMOD = btmod
LIB_btmod_OBJS = 
m_bt_check 
m_bt_execute
LIB_MDLMOD = mdlmod
LIB_mdlmod_OBJS = 
m_model_set 
m_model_run

之后,我想用

创建每个库
$(LIB_BTMOD) : $(LIB_btmod_OBJS:%=%.o)
ar rc lib$(@).a $^
$(LIB_MDLMOD) : $(LIB_mdlmod_OBJS:%=%.o)
ar rc lib$(@).a $^

那个解决方案对我来说似乎有点多余。我如何使用它只有一个多目标?我的命题是这样的:

$(LIB_BTMOD) $(LIB_MDLMOD) : $(LIB_$(@)_OBJS:%=%.o)
ar rc lib$(@).a $^

,但它没有按预期扩展先决条件。我在这一点上做错了什么?

非常感谢你的帮助。

问好

你要做的就是首先重新排列元素:

$(LIB_BTMOD) : $(LIB_btmod_OBJS:%=%.o)
$(LIB_MDLMOD) : $(LIB_mdlmod_OBJS:%=%.o)
$(LIB_BTMOD) $(LIB_MDLMOD) :
ar rc lib$(@).a $^

然后重写先决条件行:

$(LIB_BTMOD) : $(addsuffix .o,$(LIB_btmod_OBJS))
$(LIB_MDLMOD) : $(addsuffix .o,$(LIB_mdlmod_OBJS))

然后尝试组合它们(失败):

$(LIB_BTMOD) $(LIB_MDLMOD) : $(addsuffix .o,$(LIB_$(@)_OBJS))

然后记住二次展开并确保语法正确:

.SECONDEXPANSION:
$(LIB_BTMOD) $(LIB_MDLMOD) : $$(addsuffix .o,$$(LIB_$$(@)_OBJS))
ar rc lib$(@).a $^

也就是说,我认为你最好在构造对象列表时附加.o,而不是在运行中。

最新更新