【问题标题】:GNU make: How can I use automatic variables for multiple targets in my prerequisites?GNU make:如何在我的先决条件中为多个目标使用自动变量?
【发布时间】:2021-03-03 14:18:11
【问题描述】:

我正在使用 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 $^

但这并没有按预期扩展先决条件。此时我做错了什么?

非常感谢您的帮助。

最好的问候

【问题讨论】:

    标签: makefile target prerequisites


    【解决方案1】:

    做你想做的事情的方法是首先重新排列元素:

    $(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))
    

    然后记住secondary expansion并正确使用语法:

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

    也就是说,我认为您最好在构造对象列表时附加 .o,而不是即时添加。

    【讨论】:

    • 二次扩展是个好主意。你是对的:在用作先决条件之前,我应该更好地添加后缀和前缀。现在它对我有用。谢谢!
    猜你喜欢
    • 2012-03-07
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多