Makefile'ifeq'/'findstring'看似不正确的字符串比较行为

时间:2014-02-24 21:21:39

标签: c makefile

我有几个与此类似的makefile变量......

BUILD_DIR = build

APP_SRCS =    \
  ./main.c    \
  ./module1.c \
  ./module2.c \
  etc.        \

APP_OBJS = $(addprefix $(BUILD_DIR)/, $(notdir $(APP_SRCS:.c=.o)))

......以及与此类似的规则...

$(BUILD_DIR)/%.o: %.c
    echo "---"$@"---" "---"$(findstring $@, $(APP_OBJS))"---"
    ifeq ($(findstring $@, $(APP_OBJS)), $@)
        echo "---App---"
    else
        echo "---Lib---"
    endif

执行此规则时,始终会执行if块。例如,请考虑以下终端输出:

  

--- build / main.o --- --- build / main.o ---
  --- ---应用

     

--- build / lib1.o --- ------
  --- ---应用

在这两种情况下,findstring都能正常工作。我遇到的问题是,是否在字符串中找到子字符串,即$@中是否$(APP_OBJS)if块总是被占用。我想使用这样的构造来编译具有不同警告标志的应用程序和库源文件,以使所有库警告静音。

2 个答案:

答案 0 :(得分:2)

本声明:

ifeq ($(findstring $@, $(APP_OBJS)), $@)

Make 条件,Make将在执行任何规则之前进行评估,因此在自动变量$@具有值之前。所以Make将“$ @”扩展为空:

ifeq ($(findstring , $(APP_OBJS)),)

findstring返回空列表,因为它找不到匹配项:

ifeq (,)

,条件评估为真。

您已经有一个解决方案:使用 shell 条件。或者您可以使用static pattern rule

$(APP_OBJS): $(BUILD_DIR)/%.o: %.c
    echo "---"$@"---" "---"$@"---"
    echo "---App---"

$(BUILD_DIR)/%.o: %.c
    echo "---"$@"---" "---""---"
    echo "---Lib---"

答案 1 :(得分:1)

以下按预期方式工作:

$(BUILD_DIR)/%.o: %.c
    if test $(findstring $@, $(APP_OBJS)); then \
        echo "---App---"; \
    else \
        echo "---Lib---"; \
    fi;