VPATH不使用Makefile规则

时间:2012-07-31 13:54:38

标签: makefile vpath

我在Makefile中添加了另一个规则,试图构建一个使用SWIG使用JNI包装Java函数的C共享库

附加规则看起来像这样(基本上取自一个SWIG java示例)

java: $(program_C_SRCS)
    $(SWIG) -java $(SWIGOPT) $(INTERFACEPATH)
    $(CC) -c $(CFLAGS) $(JAVACFLAGS) $(program_C_SRCS) $(ISRCS) $(CPPFLAGS) $(JAVA_INCLUDE)
    $(JAVALDSHARED) $(CFLAGS) $(program_C_OBJS) $(IOBJS) $(JAVA_DLNK) $(LDFLAGS) -o $(JAVA_LIBPREFIX)$(TARGET)$(JAVASO)
    javac *.java

我遇到的问题是我的VPATH似乎不再使用* .c文件了

我注意到这个规则导致所有.c文件编译为一次调用gcc而不是单独调用gcc来编译每个.o文件

我之前没有任何JNI的编译规则如下所示:

.PHONY: all clean

all: $(program_DEBUG_NAME) $(program_RELEASE_NAME)

# original rule to build library in src dir (no longer inc. in all)
$(program_NAME): $(program_C_OBJS)
    $(LINK.c) -shared -Wl,-soname,$@ $^ -o $@

# new rules to build debug/release libraries and place them in relevant build
# dirs
$(program_DEBUG_NAME): $(DEBUG_OBJS)
    $(DEBUG_LINK.c) -shared -Wl,-soname,$@ $^ -o $(BUILD_DIR)/debug/$@

$(program_RELEASE_NAME): $(RELEASE_OBJS)
    $(RELEASE_LINK.c) -shared -Wl,-soname,$@ $^ -o $(BUILD_DIR)/release/$@

# rule to build object files (replaces implicit rule)
$(BUILD_DIR)/debug/%.o: %.c
    $(DEBUG_LINK.c) $< -c -o $@

$(BUILD_DIR)/release/%.o: %.c
    $(RELEASE_LINK.c) $< -c -o $@

这些与VPATH合作没问题

我的VPATH声明如下:

VPATH = ../../pulse_IO/src ../../../g2/src

1 个答案:

答案 0 :(得分:2)

看看你的规则:

java: $(program_C_SRCS)
    ...
    $(CC) -c $(CFLAGS) $(JAVACFLAGS) $(program_C_SRCS) ...
    ...

假设program_C_SRCSfoo.c,路径为somewhere/foo.c。如果没有VPATH,则此规则根本不会运行,因为Make无法找到foo.c。使用VPATH,Make找到它,并且知道真正的先决条件是somewhere/foo.c。但是你的规则中有$(program_C_SRCS)

java: somewhere/foo.c
    ...
    $(CC) -c $(CFLAGS) $(JAVACFLAGS) foo.c ...
    ...

此操作失败,因为没有foo.c(本地)。

试试这个:

java: $(program_C_SRCS)
    ...
    $(CC) -c $(CFLAGS) $(JAVACFLAGS) $^ ...
    ...

(使用像$^这样的自动变量是你之前的规则有效的原因。)