Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Makefile:如何编写仅在某个共享对象库不运行时执行的规则';不存在?_Makefile - Fatal编程技术网

Makefile:如何编写仅在某个共享对象库不运行时执行的规则';不存在?

Makefile:如何编写仅在某个共享对象库不运行时执行的规则';不存在?,makefile,Makefile,我正在尝试编写一个规则,只有当某个共享对象库不存在时才应该执行该规则 $(OUTDIR)/libv8-$(ARCH).so: v8 v8: # to be able to build V8 only with "make v8" cd V8; bash V8Update.sh 但是,每次都执行V8Update.sh。这是完整的Makefile: CC=g++ V8INCLUDEDIR=V8/build/v8/include CFLAGS=-c -Wall -std=c++0x -fP

我正在尝试编写一个规则,只有当某个共享对象库不存在时才应该执行该规则

$(OUTDIR)/libv8-$(ARCH).so: v8

v8: # to be able to build V8 only with "make v8"
    cd V8; bash V8Update.sh
但是,每次都执行
V8Update.sh
。这是完整的
Makefile

CC=g++
V8INCLUDEDIR=V8/build/v8/include
CFLAGS=-c -Wall -std=c++0x -fPIC -I$(V8INCLUDEDIR) -I/usr/include -I/usr/include/c++/4.6                               \
       -I/usr/include/c++/4.6/backward -I/usr/include/c++/4.6/x86_64-linux-gnu -I/usr/include/x86_64-linux-gnu         \
       -I/usr/lib/gcc/x86_64-linux-gnu/4.6/include -I/usr/lib/gcc/x86_64-linux-gnu/4.6/include-fixed                   \
       -I/usr/local/include -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include/
DEPS=ProxyTypes.h $(V8INCLUDEDIR)/v8.h $(V8INCLUDEDIR)/v8-debug.h $(V8INCLUDEDIR)/v8stdint.h
ARCH=x64 # TODO: Add support for building 32-bit libraries.
LDFLAGS=-shared -lglib-2.0 -L/usr/lib/x86_64-linux-gnu/ #-Wl,--no-undefined
SOURCES=Exports.cpp FunctionTemplateProxy.cpp HandleProxy.cpp ObjectTemplateProxy.cpp Utilities.cpp V8EngineProxy.cpp  \
        ValueProxy.cpp
OBJECTS=$(patsubst %,$(OUTDIR)/%,$(SOURCES:.cpp=.o))
LIBRARY=libV8_Net_Proxy.so

.PHONY: all v8 release debug makeoutdir clean copybin

all: debug copybin

v8: # to be able to build V8 only with "make v8"
    cd V8; bash V8Update.sh

release: OUTDIR=bin/Release
debug: OUTDIR=bin/Debug

release debug:
    $(MAKE) -S makeoutdir $(LIBRARY) OUTDIR=$(OUTDIR)


makeoutdir:
    mkdir -p $(OUTDIR)

clean:
    rm bin/ -rf
#   rm V8/build -rf

copybin:
    cp -a bin/Debug/*.so ../bin/Debug

$(LIBRARY): $(OUTDIR)/libv8-$(ARCH).so $(OBJECTS)
    $(CC) $(LDFLAGS) -lv8-$(ARCH) -L$(OUTDIR) -o $(patsubst %,$(OUTDIR)/%,$@) $(OBJECTS)

$(OUTDIR)/libv8-$(ARCH).so: v8

$(OUTDIR)/%.o: %.cpp $(DEPS)
    $(CC) $(CFLAGS) -o $@ $<
CC=g++
V8INCLUDEDIR=V8/build/V8/include
CFLAGS=-c-Wall-std=c++0x-fPIC-I$(V8INCLUDEDIR)-I/usr/include-I/usr/include/c++/4.6\
-I/usr/include/c++/4.6/backward-I/usr/include/c++/4.6/x86_64-linux-gnu-I/usr/include/x86_64-linux-gnu\
-I/usr/lib/gcc/x86_64-linux-gnu/4.6/include-I/usr/lib/gcc/x86_64-linux-gnu/4.6/include-fixed\
-I/usr/local/include-I/usr/include/glib-2.0-I/usr/lib/x86_64-linux-gnu/glib-2.0/include/
DEPS=ProxyTypes.h$(V8INCLUDEDIR)/v8.h$(V8INCLUDEDIR)/v8 debug.h$(V8INCLUDEDIR)/v8stdint.h
ARCH=x64#TODO:添加对构建32位库的支持。
LDFLAGS=-shared-lglib-2.0-L/usr/lib/x86_64-linux-gnu/#-Wl,--无未定义
SOURCES=Exports.cpp FunctionTemplateProxy.cpp HandleProxy.cpp ObjectTemplateProxy.cpp Utilities.cpp V8EngineProxy.cpp\
ValueProxy.cpp
对象=$(patsubst%,$(OUTDIR)/%,$(源:.cpp=.o))
LIBRARY=libV8_Net_Proxy.so
.PHONY:all v8发行版调试makeoutdir清理copybin
全部:调试copybin
v8:#只能使用“make v8”构建v8
cd V8;bash V8Update.sh
释放:OUTDIR=bin/release
调试:OUTDIR=bin/debug
发布调试:
$(MAKE)-S makeoutdir$(库)OUTDIR=$(OUTDIR)
makeoutdir:
mkdir-p$(OUTDIR)
清洁:
rm bin/-rf
#rm V8/内置-右前
复印箱:
cp-a bin/Debug/*.so../bin/Debug
$(库):$(OUTDIR)/libv8-$(ARCH).so$(对象)
$(CC)$(LDFLAGS)-lv8-$(ARCH)-L$(OUTDIR)-o$(patsubst%,$(OUTDIR)/%,$@)$(对象)
$(OUTDIR)/libv8-$(ARCH.so:v8
$(OUTDIR)/%.o:%.cpp$(DEPS)
$(CC)$(CFLAGS)-o$@$<
我做错了什么?

应该是这样的

v8: $(OUTDIR)/libv8-$(ARCH).so

$(OUTDIR)/libv8-$(ARCH).so:
    cd V8; bash V8Update.sh

你不能依赖虚假的目标——它每次都会执行(顺便说一句,这是一项功能)。

由于某些原因,这不起作用。V8Update.sh仍然每次都被调用,现在它被调用了两次(我猜一次用于发布,一次用于调试)。它只需要执行一次,因为V8Update.sh会生成发行版和调试二进制文件。此外,在规则
v8
中,
$(OUTDIR)
并没有被定义为仅在运行
debug
release
目标时定义的。只是注意到,当将
ls$@
添加到您答案中的第二个规则时,它实际上执行
ls-bin/debug/libv8-x64
。我想知道为什么
.so
后缀不见了。这解释了为什么它仍然总是被执行。另外,
v8
目标没有定义
$(OUTDIR)
的解决方案是只复制命令,而不是使它依赖于
$(OUTDIR)/libv8-$(ARCH)。因此
.ARCH=x64#TODO:添加对构建32位库的支持。拱门应为“x64”(包括“#”之前的空格)。不要使用这样的评论,把它放到另一行。