Skip to content
Snippets Groups Projects
Makefile.template 17.5 KiB
Newer Older
Nicolas Noble's avatar
Nicolas Noble committed
# GRPC global makefile
# This currently builds C and C++ code.
<%!
  from copy import deepcopy
  import re

  proto_re = re.compile('(.*)\.proto')

Nicolas Noble's avatar
Nicolas Noble committed
  def excluded(filename, exclude_res):
    for r in exclude_res:
      if r.match(filename):
        return True
    return False

  def proto_to_cc(filename):
    m = proto_re.match(filename)
    if not m:
      return filename
    return 'gens/' + m.group(1) + '.pb.cc'
Nicolas Noble's avatar
Nicolas Noble committed
%>

<%
  altlibs = []
  for lib in libs:
    for alt in lib.get('alternates', []):
      new = deepcopy(lib)
      new.name = alt.name
      new.alternates = []
      exclude_res = [re.compile(str) for str in alt.get('exclude_res', [])]

      src = [file for file in new.get('src', []) if not excluded(file, exclude_res)]
      src.extend(alt.get('include_src', []))
      new.src = src

      headers = [file for file in new.get('headers', []) if not excluded(file, exclude_res)]
      headers.extend(alt.get('include_headers', []))
      new.headers = headers

      public_headers = [file for file in new.get('public_headers', []) if not excluded(file, exclude_res)]
      public_headers.extend(alt.get('include_public_headers', []))
      new.public_headers = public_headers

      for prop in alt.properties:
        new[prop.name] = prop.value

      altlibs.append(new)
  libs.extend(altlibs)

Nicolas Noble's avatar
Nicolas Noble committed
  for lib in libs:
    for src in lib.src:
      m = proto_re.match(src)
      if m:
        protos.add(m.group(1))
Nicolas Noble's avatar
Nicolas Noble committed
  for tgt in targets:
    for src in tgt.src:
      m = proto_re.match(src)
      if m:
        protos.add(m.group(1))
Nicolas Noble's avatar
Nicolas Noble committed

  protos = sorted(protos)
Nicolas Noble's avatar
Nicolas Noble committed
%>

# General settings.
# You may want to change these depending on your system.

prefix ?= /usr/local

PROTOC = protoc
CC = gcc
CXX = g++
LD = gcc
LDXX = g++
AR = ar
STRIP = strip --strip-unneeded
INSTALL = install -D
RM = rm -f

HOST_CC = $(CC)
HOST_CXX = $(CXX)
HOST_LD = $(LD)
HOST_LDXX = $(LDXX)

Nicolas Noble's avatar
Nicolas Noble committed
ifeq ($(DEBUG),)
CPPFLAGS += -O2
DEFINES += NDEBUG
else
CPPFLAGS += -O0
DEFINES += _DEBUG DEBUG
endif

CFLAGS += -std=c89 -pedantic
CXXFLAGS += -std=c++11
CPPFLAGS += -g -fPIC -Wall -Werror -Wno-long-long
LDFLAGS += -g -pthread -fPIC

INCLUDES = . include gens
LIBS = rt m z event event_pthreads pthread
LIBSXX = protobuf
LIBS_SECURE = ssl crypto dl
LIBS_PROTOC = protoc protobuf
Nicolas Noble's avatar
Nicolas Noble committed

ifneq ($(wildcard /usr/src/gtest/src/gtest-all.cc),)
GTEST_LIB = /usr/src/gtest/src/gtest-all.cc -I/usr/src/gtest
else
GTEST_LIB = -lgtest
endif
GTEST_LIB += -lgflags
Nicolas Noble's avatar
Nicolas Noble committed
ifeq ($(V),1)
E = @:
Q =
else
E = @echo
Q = @
endif

VERSION = ${settings.version.major}.${settings.version.minor}.${settings.version.micro}.${settings.version.build}

CPPFLAGS_NO_ARCH += $(addprefix -I, $(INCLUDES)) $(addprefix -D, $(DEFINES))
CPPFLAGS += $(CPPFLAGS_NO_ARCH) $(ARCH_FLAGS)

LDFLAGS += $(ARCH_FLAGS)
LDLIBS += $(addprefix -l, $(LIBS))
LDLIBSXX += $(addprefix -l, $(LIBSXX))
LDLIBS_SECURE += $(addprefix -l, $(LIBS_SECURE))
HOST_LDLIBS_PROTOC += $(addprefix -l, $(LIBS_PROTOC))

HOST_CPPFLAGS = $(CPPFLAGS)
HOST_CFLAGS = $(CFLAGS)
HOST_CXXFLAGS = $(CXXFLAGS)
HOST_LDFLAGS = $(LDFLAGS)
HOST_LDLIBS = $(LDLIBS)
Nicolas Noble's avatar
Nicolas Noble committed


# These are automatically computed variables.
# There shouldn't be any need to change anything from now on.

HOST_SYSTEM = $(shell uname | cut -f 1 -d_)
ifeq ($(SYSTEM),)
SYSTEM = $(HOST_SYSTEM)
endif

ifeq ($(wildcard .git),)
IS_GIT_FOLDER = false
else
IS_GIT_FOLDER = true
endif

EVENT2_CHECK_CMD = $(CC) $(CFLAGS) $(CPPFLAGS) -o /dev/null test/build/event2.c -levent $(LDFLAGS)
OPENSSL_ALPN_CHECK_CMD = $(CC) $(CFLAGS) $(CPPFLAGS) -o /dev/null test/build/openssl-alpn.c -levent $(LDFLAGS) $(LDLIBS_SECURE)
ZLIB_CHECK_CMD = $(CC) $(CFLAGS) $(CPPFLAGS) -o /dev/null test/build/event2.c -levent $(LDFLAGS)

HAS_SYSTEM_EVENT2 = $(shell $(EVENT2_CHECK_CMD) >& /dev/null && echo true || echo false)
HAS_SYSTEM_OPENSSL_ALPN = $(shell $(OPENSSL_ALPN_CHECK_CMD) >& /dev/null && echo true || echo false)
HAS_SYSTEM_ZLIB = $(shell $(ZLIB_CHECK_CMD) >& /dev/null && echo true || echo false)

ifeq ($(wildcard third_party/libevent/include/event2/event.h),)
HAS_EMBEDDED_EVENT2 = false
else
HAS_EMBEDDED_EVENT2 = true
endif

ifeq ($(wildcard third_party/openssl/ssl/ssl.h),)
HAS_EMBEDDED_OPENSSL_ALPN = false
else
HAS_EMBEDDED_OPENSSL_ALPN = true
endif

ifeq ($(wildcard third_party/zlib/zlib.h),)
HAS_EMBEDDED_ZLIB = false
else
HAS_EMBEDDED_ZLIB = true
endif

ifneq ($(SYSTEM),MINGW32)
ifeq ($(HAS_SYSTEM_EVENT2),false)
DEP_MISSING += libevent
endif
endif

ifeq ($(HAS_SYSTEM_ZLIB),false)
ifeq ($(HAS_EMBEDDED_ZLIB),true)
ZLIB_DEP = third_party/zlib/libz.a
CPPFLAGS += -Ithird_party/zlib
LDFLAGS += -Lthird_party/zlib
else
DEP_MISSING += zlib
endif
endif

ifeq ($(HAS_SYSTEM_OPENSSL_ALPN),false)
ifeq ($(HAS_EMBEDDED_OPENSSL_ALPN),true)
OPENSSL_DEP = third_party/openssl/libssl.a
CPPFLAGS += -Ithird_party/openssl/include
LDFLAGS += -Lthird_party/openssl
else
NO_SECURE = true
endif
endif

ifneq ($(DEP_MISSING),)
NO_DEPS = true
endif

ifneq ($(MAKECMDGOALS),clean)
NO_DEPS = true
endif

Nicolas Noble's avatar
Nicolas Noble committed
.SECONDARY = %.pb.h %.pb.cc

ifeq ($(DEP_MISSING),)
Nicolas Noble's avatar
Nicolas Noble committed
all: static shared\
% for tgt in targets:
% if tgt.build == 'all':
 bins/${tgt.name}\
% endif
% endfor

dep_error:
	@echo "You shouldn't see this message - all of your dependencies are correct."
else
all: dep_error git_update stop

dep_error:
	@echo
	@echo "DEPENDENCY ERROR"
	@echo
	@echo "You are missing system dependencies that are essential to build grpc,"
	@echo "and the third_party directory doesn't have them:"
	@echo
	@echo "  $(DEP_MISSING)"
	@echo
	@echo "Installing the development packages for your system will solve"
	@echo "this issue. Please consult INSTALL to get more information."
	@echo
	@echo "If you need information about why these tests failed, run:"
	@echo
	@echo "  make run_dep_checks"
	@echo
endif

git_update:
ifeq ($(IS_GIT_FOLDER),true)
	@echo "Additionally, since you are in a git clone, you can download the"
	@echo "missing dependencies in third_party by running the following command:"
	@echo
	@echo "  git submodule --init update"
	@echo
endif

openssl_dep_error: openssl_dep_message git_update stop

openssl_dep_message:
	@echo
	@echo "DEPENDENCY ERROR"
	@echo
	@echo "The target you are trying to run requires OpenSSL with ALPN support."
	@echo "Your system doesn't have it, and neither does the third_party directory."
	@echo
	@echo "Please consult INSTALL to get more information."
	@echo
	@echo "If you need information about why these tests failed, run:"
	@echo
	@echo "  make run_dep_checks"
	@echo

stop:
	@false

run_dep_checks:
	$(EVENT2_CHECK_CMD) || true
	$(OPENSSL_ALPN_CHECK_CMD) || true
	$(ZLIB_CHECK_CMD) || true

third_party/zlib/libz.a:
	(cd third_party/zlib ; CFLAGS="-fPIC -fvisibility=hidden" ./configure --static)
	$(MAKE) -C third_party/zlib

third_party/openssl/libssl.a:
	(cd third_party/openssl ; CC="$(CC) -fPIC -fvisibility=hidden" ./config)
	$(MAKE) -C third_party/openssl build_crypto build_ssl

Nicolas Noble's avatar
Nicolas Noble committed

static_c: dep_c\
Nicolas Noble's avatar
Nicolas Noble committed
% for lib in libs:
% if lib.build == 'all' and not lib.get('c++', False):
Nicolas Noble's avatar
Nicolas Noble committed
 libs/lib${lib.name}.a\
% endif
% endfor


static_cxx: dep_cxx\
Nicolas Noble's avatar
Nicolas Noble committed
% for lib in libs:
% if lib.build == 'all' and lib.get('c++', False):
 libs/lib${lib.name}.a\
% endif
% endfor


shared: shared_c shared_cxx

shared_c: dep_c\
% for lib in libs:
% if lib.build == 'all' and not lib.get('c++', False):
 libs/lib${lib.name}.so.$(VERSION)\
% endif
% endfor


shared_cxx: dep_cxx\
% for lib in libs:
% if lib.build == 'all' and lib.get('c++', False):
Nicolas Noble's avatar
Nicolas Noble committed
 libs/lib${lib.name}.so.$(VERSION)\
% endif
% endfor


privatelibs: privatelibs_c privatelibs_cxx

privatelibs_c: dep_c\
% for lib in libs:
% if lib.build == 'private':
 libs/lib${lib.name}.a\
% endif
% endfor


privatelibs_cxx: dep_cxx\
Nicolas Noble's avatar
Nicolas Noble committed
% for lib in libs:
% if lib.build == 'private':
 libs/lib${lib.name}.a\
% endif
% endfor


buildtests_c: bin_dep_c privatelibs_c\
Nicolas Noble's avatar
Nicolas Noble committed
% for tgt in targets:
% if tgt.build == 'test' and not tgt.get('c++', False):
Nicolas Noble's avatar
Nicolas Noble committed
 bins/${tgt.name}\
% endif
% endfor


buildtests_cxx: bin_dep_cxx privatelibs_cxx\
Nicolas Noble's avatar
Nicolas Noble committed
% for tgt in targets:
% if tgt.build == 'test' and tgt.get('c++', False):
Nicolas Noble's avatar
Nicolas Noble committed
 bins/${tgt.name}\
% endif
% endfor


test: test_c test_cxx
test_c: buildtests_c
% for tgt in targets:
% if tgt.build == 'test' and tgt.get('run', True) and not tgt.get('c++', False):
	$(E) "[RUN]     Testing ${tgt.name}"
	$(Q) ./bins/${tgt.name} || ( echo test ${tgt.name} failed ; exit 1 )
% endif
% endfor


test_cxx: buildtests_cxx
Nicolas Noble's avatar
Nicolas Noble committed
% for tgt in targets:
% if tgt.build == 'test' and tgt.get('run', True) and tgt.get('c++', False):
Nicolas Noble's avatar
Nicolas Noble committed
	$(E) "[RUN]     Testing ${tgt.name}"
	$(Q) ./bins/${tgt.name} || ( echo test ${tgt.name} failed ; exit 1 )
% endif
% endfor


tools: privatelibs\
% for tgt in targets:
% if tgt.build == 'tool':
 bins/${tgt.name}\
% endif
% endfor


protoc_plugins:\
% for tgt in targets:
% if tgt.build == 'protoc':
 bins/${tgt.name}\
% endif
% endfor


Nicolas Noble's avatar
Nicolas Noble committed
buildbenchmarks: privatelibs\
% for tgt in targets:
% if tgt.build == 'benchmark':
 bins/${tgt.name}\
% endif
% endfor


benchmarks: buildbenchmarks

strip: strip-static strip-shared

strip-static_c: static_c
% for lib in libs:
% if not lib.get("c++", False):
% if lib.build == "all":
	$(E) "[STRIP]   Stripping lib${lib.name}.a"
	$(Q) $(STRIP) libs/lib${lib.name}.a
% endif
% endif
% endfor

strip-static_cxx: static_cxx
Nicolas Noble's avatar
Nicolas Noble committed
% for lib in libs:
% if lib.get("c++", False):
Nicolas Noble's avatar
Nicolas Noble committed
% if lib.build == "all":
	$(E) "[STRIP]   Stripping lib${lib.name}.a"
	$(Q) $(STRIP) libs/lib${lib.name}.a
% endif
% endif
% endfor

strip-shared_c: shared_c
% for lib in libs:
% if not lib.get("c++", False):
% if lib.build == "all":
	$(E) "[STRIP]   Stripping lib${lib.name}.so"
	$(Q) $(STRIP) libs/lib${lib.name}.so.$(VERSION)
% endif
% endif
Nicolas Noble's avatar
Nicolas Noble committed
% endfor

strip-shared_cxx: shared_cxx
Nicolas Noble's avatar
Nicolas Noble committed
% for lib in libs:
% if lib.get("c++", False):
Nicolas Noble's avatar
Nicolas Noble committed
% if lib.build == "all":
	$(E) "[STRIP]   Stripping lib${lib.name}.so"
	$(Q) $(STRIP) libs/lib${lib.name}.so.$(VERSION)
% endif
Nicolas Noble's avatar
Nicolas Noble committed
% endfor

% for p in protos:
deps/gens/${p}.pb.dep:
	$(Q) mkdir -p `dirname $@`
	$(Q) touch $@

gens/${p}.pb.cc: ${p}.proto protoc_plugins
Nicolas Noble's avatar
Nicolas Noble committed
	$(E) "[PROTOC]  Generating protobuf CC file from $<"
	$(Q) mkdir -p `dirname $@`
	$(Q) $(PROTOC) --cpp_out=gens --grpc_out=gens --plugin=protoc-gen-grpc=bins/cpp_plugin $<

% endfor
Nicolas Noble's avatar
Nicolas Noble committed

deps/%.dep : %.c
	$(E) "[DEP]     Generating dependencies for $<"
	$(Q) mkdir -p `dirname $@`
	$(Q) $(CC) $(CFLAGS) $(CPPFLAGS_NO_ARCH) -MG -M $< > $@

deps/%.dep : %.cc
	$(E) "[DEP]     Generating dependencies for $<"
	$(Q) mkdir -p `dirname $@`
	$(Q) $(CXX) $(CXXFLAGS) $(CPPFLAGS_NO_ARCH) -MG -M $< > $@

objs/%.o : %.c
	$(E) "[C]       Compiling $<"
	$(Q) mkdir -p `dirname $@`
	$(Q) $(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<

objs/%.o : gens/%.pb.cc
	$(E) "[CXX]     Compiling $<"
	$(Q) mkdir -p `dirname $@`
	$(Q) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c -o $@ $<

objs/src/compiler/%.o : src/compiler/%.cc
	$(E) "[HOSTCXX] Compiling $<"
	$(Q) mkdir -p `dirname $@`
	$(Q) $(HOST_CXX) $(HOST_CXXFLAGS) $(HOST_CPPFLAGS) -c -o $@ $<

Nicolas Noble's avatar
Nicolas Noble committed
objs/%.o : %.cc
	$(E) "[CXX]     Compiling $<"
	$(Q) mkdir -p `dirname $@`
	$(Q) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c -o $@ $<

Nicolas Noble's avatar
Nicolas Noble committed
% for lib in libs:
Nicolas Noble's avatar
Nicolas Noble committed
 deps_lib${lib.name}\
Nicolas Noble's avatar
Nicolas Noble committed
% endfor
Nicolas Noble's avatar
Nicolas Noble committed
% for tgt in targets:
Nicolas Noble's avatar
Nicolas Noble committed
 deps_${tgt.name}\
% endif
% endfor


dep_cxx:\
% for lib in libs:
% if lib.get('c++', False):
 deps_lib${lib.name}\
% endif
% endfor
% for tgt in targets:
% if tgt.get('c++', False):
 deps_${tgt.name}\
% endif
Nicolas Noble's avatar
Nicolas Noble committed
% endfor


install: install_c install_cxx

install_c: install-headers_c install-static_c install-shared_c

install_cxx: install-headers_cxx install-static_cxx install-shared_cxx

install-headers: install-headers_c install-headers_cxx

install-headers_c:
	$(E) "[INSTALL] Installing public C headers"
	$(Q) $(foreach h, $(PUBLIC_HEADERS_C), $(INSTALL) $(h) $(prefix)/$(h) && ) exit 0 || exit 1

install-headers_cxx:
	$(E) "[INSTALL] Installing public C++ headers"
	$(Q) $(foreach h, $(PUBLIC_HEADERS_CXX), $(INSTALL) $(h) $(prefix)/$(h) && ) exit 0 || exit 1
Nicolas Noble's avatar
Nicolas Noble committed

install-static: install-static_c install-static_cxx
Nicolas Noble's avatar
Nicolas Noble committed

install-static_c: static_c strip-static_c
Nicolas Noble's avatar
Nicolas Noble committed
% for lib in libs:
% if not lib.get("c++", False):
Nicolas Noble's avatar
Nicolas Noble committed
% if lib.build == "all":
	$(E) "[INSTALL] Installing lib${lib.name}.a"
	$(Q) $(INSTALL) libs/lib${lib.name}.a $(prefix)/lib/lib${lib.name}.a
% endif
% endif
% endfor

install-static_cxx: static_cxx strip-static_cxx
% for lib in libs:
% if lib.get("c++", False):
% if lib.build == "all":
	$(E) "[INSTALL] Installing lib${lib.name}.a"
	$(Q) $(INSTALL) libs/lib${lib.name}.a $(prefix)/lib/lib${lib.name}.a
% endif
% endif
% endfor

install-shared_c: shared_c strip-shared_c
% for lib in libs:
% if not lib.get("c++", False):
% if lib.build == "all":
	$(E) "[INSTALL] Installing lib${lib.name}.so"
	$(Q) $(INSTALL) libs/lib${lib.name}.so.$(VERSION) $(prefix)/lib/lib${lib.name}.so.$(VERSION)
% endif
% endif
Nicolas Noble's avatar
Nicolas Noble committed
% endfor

install-shared_cxx: shared_cxx strip-shared_cxx
Nicolas Noble's avatar
Nicolas Noble committed
% for lib in libs:
% if lib.get("c++", False):
Nicolas Noble's avatar
Nicolas Noble committed
% if lib.build == "all":
	$(E) "[INSTALL] Installing lib${lib.name}.so"
	$(Q) $(INSTALL) libs/lib${lib.name}.so.$(VERSION) $(prefix)/lib/lib${lib.name}.so.$(VERSION)
% endif
Nicolas Noble's avatar
Nicolas Noble committed
% endfor

clean:\
% for lib in libs:
 clean_lib${lib.name}\
% endfor
% for tgt in targets:
 clean_${tgt.name}\
% endfor

	$(Q) $(RM) -r deps objs libs bins gens


# The various libraries

% for lib in libs:
${makelib(lib)}
% endfor


# All of the test targets, and protoc plugins
Nicolas Noble's avatar
Nicolas Noble committed

% for tgt in targets:
${maketarget(tgt)}
% endfor

<%def name="makelib(lib)">
LIB${lib.name.upper()}_SRC = \\

% for src in lib.src:
    ${proto_to_cc(src)} \\
Nicolas Noble's avatar
Nicolas Noble committed

% endfor

% if "public_headers" in lib:
% if lib.get("c++", False):
PUBLIC_HEADERS_CXX += \\
Nicolas Noble's avatar
Nicolas Noble committed

% else:
PUBLIC_HEADERS_C += \\

% endif
Nicolas Noble's avatar
Nicolas Noble committed
% for hdr in lib.public_headers:
    ${hdr} \\

% endfor
% endif

LIB${lib.name.upper()}_OBJS = $(addprefix objs/, $(addsuffix .o, $(basename $(LIB${lib.name.upper()}_SRC))))
LIB${lib.name.upper()}_DEPS = $(addprefix deps/, $(addsuffix .dep, $(basename $(LIB${lib.name.upper()}_SRC))))

% if lib.get('secure', True):
LIB${lib.name.upper()}_OBJS += $(OPENSSL_DEP)

ifeq ($(NO_SECURE),true)

libs/lib${lib.name}.a: openssl_dep_error

else

% endif
Nicolas Noble's avatar
Nicolas Noble committed
libs/lib${lib.name}.a: $(LIB${lib.name.upper()}_OBJS)
	$(E) "[AR]      Creating $@"
	$(Q) mkdir -p `dirname $@`
Nicolas Noble's avatar
Nicolas Noble committed
	$(Q) $(AR) rcs libs/lib${lib.name}.a $(LIB${lib.name.upper()}_OBJS)

% if lib.build == "all":
libs/lib${lib.name}.so.$(VERSION): $(LIB${lib.name.upper()}_OBJS)
	$(E) "[LD]      Linking $@"
	$(Q) mkdir -p `dirname $@`
Nicolas Noble's avatar
Nicolas Noble committed
% if lib.get('c++', False):
	$(Q) $(LDXX) $(LDFLAGS) -shared -Wl,-soname,lib${lib.name}.so.${settings.version.major} \
% else:
	$(Q) $(LD) $(LDFLAGS) -shared -Wl,-soname,lib${lib.name}.so.${settings.version.major} \
% endif
-o libs/lib${lib.name}.so.$(VERSION) $(LIB${lib.name.upper()}_OBJS) $(LDLIBS)\
% if lib.get('secure', True):
Nicolas Noble's avatar
Nicolas Noble committed
% endif
% endif

% if lib.get('secure', True):

endif
% endif
Nicolas Noble's avatar
Nicolas Noble committed

deps_lib${lib.name}: $(LIB${lib.name.upper()}_DEPS)

% if lib.get('secure', True):
ifneq ($(NO_SECURE),true)
% endif
ifneq ($(NO_DEPS),true)
Nicolas Noble's avatar
Nicolas Noble committed
-include $(LIB${lib.name.upper()}_DEPS)
endif
% if lib.get('secure', True):
endif
% endif
Nicolas Noble's avatar
Nicolas Noble committed

clean_lib${lib.name}:
	$(E) "[CLEAN]   Cleaning lib${lib.name} files"
	$(Q) $(RM) $(LIB${lib.name.upper()}_OBJS)
	$(Q) $(RM) $(LIB${lib.name.upper()}_DEPS)
	$(Q) $(RM) libs/lib${lib.name}.a
	$(Q) $(RM) libs/lib${lib.name}.so.$(VERSION)
</%def>

<%def name="maketarget(tgt)">
${tgt.name.upper()}_SRC = \\

% for src in tgt.src:
    ${proto_to_cc(src)} \\
Nicolas Noble's avatar
Nicolas Noble committed

% endfor

${tgt.name.upper()}_OBJS = $(addprefix objs/, $(addsuffix .o, $(basename $(${tgt.name.upper()}_SRC))))
${tgt.name.upper()}_DEPS = $(addprefix deps/, $(addsuffix .dep, $(basename $(${tgt.name.upper()}_SRC))))

% if tgt.get('secure', True):
ifeq ($(NO_SECURE),true)

bins/${tgt.name}: openssl_dep_error

else

% endif
Nicolas Noble's avatar
Nicolas Noble committed
bins/${tgt.name}: $(${tgt.name.upper()}_OBJS)\
% for dep in tgt.deps:
 libs/lib${dep}.a\
% endfor

% if tgt.get("c++", False):
% if tgt.build == 'protoc':
	$(E) "[HOSTLD]  Linking $@"
	$(Q) mkdir -p `dirname $@`
	$(Q) $(HOST_LDXX) $(HOST_LDFLAGS) $(${tgt.name.upper()}_OBJS)\
% else:
Nicolas Noble's avatar
Nicolas Noble committed
	$(E) "[LD]      Linking $@"
	$(Q) mkdir -p `dirname $@`
	$(Q) $(LDXX) $(LDFLAGS) $(${tgt.name.upper()}_OBJS)\
% if tgt.build == 'test':
 $(GTEST_LIB)\
% endif
 -Llibs\
Nicolas Noble's avatar
Nicolas Noble committed
% else:
	$(E) "[LD]      Linking $@"
	$(Q) mkdir -p `dirname $@`
Nicolas Noble's avatar
Nicolas Noble committed
	$(Q) $(LD) $(LDFLAGS) $(${tgt.name.upper()}_OBJS) -Llibs\
% endif
% for dep in tgt.deps:
 -l${dep}\
% endfor
% if tgt.get("c++", False):
% if tgt.build == 'protoc':
 $(HOST_LDLIBSXX)\
% else:
Nicolas Noble's avatar
Nicolas Noble committed
 $(LDLIBSXX)\
% endif
% endif
% if tgt.build == 'protoc':
 $(HOST_LDLIBS)\
% else:
Nicolas Noble's avatar
Nicolas Noble committed
 $(LDLIBS)\
% endif
% if tgt.build == 'protoc':
 $(HOST_LDLIBS_PROTOC)\
% elif tgt.get('secure', True):
 $(LDLIBS_SECURE)\
Nicolas Noble's avatar
Nicolas Noble committed
% endif
 -o bins/${tgt.name}
% if tgt.get('secure', True):

endif
% endif
Nicolas Noble's avatar
Nicolas Noble committed

deps_${tgt.name}: $(${tgt.name.upper()}_DEPS)

% if tgt.get('secure', True):
ifneq ($(NO_SECURE),true)
% endif
ifneq ($(NO_DEPS),true)
Nicolas Noble's avatar
Nicolas Noble committed
-include $(${tgt.name.upper()}_DEPS)
endif
% if tgt.get('secure', True):
endif
% endif
Nicolas Noble's avatar
Nicolas Noble committed

clean_${tgt.name}:
	$(E) "[CLEAN]   Cleaning ${tgt.name} files"
	$(Q) $(RM) $(${tgt.name.upper()}_OBJS)
	$(Q) $(RM) $(${tgt.name.upper()}_DEPS)
	$(Q) $(RM) bins/${tgt.name}
</%def>

.PHONY: all strip tools \
dep_error openssl_dep_error openssl_dep_message git_update stop \
buildtests buildtests_c buildtests_cxx \
test test_c test_cxx \
install install_c install_cxx \
install-headers install-headers_c install-headers_cxx \
install-shared install-shared_c install-shared_cxx \
install-static install-static_c install-static_cxx \
strip strip-shared strip-static \
strip_c strip-shared_c strip-static_c \
strip_cxx strip-shared_cxx strip-static_cxx \
clean\
Nicolas Noble's avatar
Nicolas Noble committed
% for lib in libs:
 deps_lib${lib.name} clean_lib${lib.name}\
% endfor
% for tgt in targets:
 deps_${tgt.name} clean_${tgt.name}\
% endfor