代码之家  ›  专栏  ›  技术社区  ›  Gordon Wrigley

在规则的“命令中使用的定义”部分使用条件时出现makefile问题

  •  4
  • Gordon Wrigley  · 技术社区  · 16 年前

    我有一个makefile的部分,它有这种结构:

    
    bob:
    ifdef DEBUG
        @echo running
    endif
        @echo chug chug chug
    ifdef DEBUG
        @echo done
    endif    
    
    bobit:
        @echo "before"
        @make bob
        @echo "after"
    

    我在这里大大简化了,所有的echo实际上都是命令块,还有更多的条件化的东西,但是这抓住了我问题的本质。

    出于技术上的原因,我现在不想进入,我需要摆脱潜艇,但因为回声代表了大量的代码,我不想只复制和通过鲍勃的身体而不是潜艇。

    理想情况下我想做的就是这样

    
    define BOB_BODY 
    ifdef DEBUG
        @echo running
    endif
        @echo chug chug chug
    ifdef DEBUG
        @echo done
    endif
    endef
    
    bob:
        $(BOB_BODY)
    
    bobit:
        @echo "before"
        $(BOB_BODY)
        @echo "after"
    

    不幸的是,条件似乎在影响我,它们产生“ifdef:command not found”错误,我尝试用eval和call的各种组合来解决这个问题,但似乎找不到使它工作的方法。

    我该怎么做?这是否是解决问题的正确方法?

    2 回复  |  直到 10 年前
        1
  •  2
  •   gotqn user3521065    10 年前

    我修复这个问题的方法是使用bash条件,因为我们使用的是命令而不是规则,所以这实际上有一定的意义。

    所以我的理想解从上面变成了

    
    define BOB_BODY
        @if [[ -n "$(DEBUG)" ]]; then \
            echo running; \
        fi;
        @echo chug chug chug
        @if [[ -n "$(DEBUG)" ]]; then \
            echo done; \
        fi
    endef
    
    

    bob: $(BOB_BODY)

    bobit: @echo "before" $(BOB_BODY) @echo "after"

        2
  •  0
  •   pmod    13 年前

    您可以简单地更改ifdef/define的顺序:

    ifdef DEBUG
      define BOB_BODY 
        @echo running
        @echo chug chug chug
        @echo done
      endef
    else 
      define BOB_BODY 
        @echo chug chug chug
      endef
    endif
    

    更新

    define CHUG
      @echo chug chug chug
    endef
    
    ifdef DEBUG
      define BOB_BODY 
        @echo running
        $(CHUG)
        @echo done
      endef
    else 
      define BOB_BODY 
        $(CHUG)
      endef
    endif