blob: 8b2863cac6f9e3a7dbffc679463d5df870fac0d5 [file] [log] [blame]
# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
AR ?= ar
CC ?= gcc
CXX ?= g++
CFLAGS += \
-Wall \
-Werror \
-Wextra \
-Wno-missing-field-initializers \
-Wno-unused-parameter \
-Wno-unused-result \
-Wuninitialized
CXXFLAGS ?= -fno-strict-aliasing
# -std=gnu++11 is c++11 with GNU extensions. In particular, typeof is allowed.
CXXFLAGS += $(CFLAGS) \
-std=gnu++11 \
-Woverloaded-virtual
CXXFLAGS += $(EXTRA_CXXFLAGS)
CPPFLAGS ?= -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS
PKG_CONFIG ?= pkg-config
DBUSXX_XML2CPP = dbusxx-xml2cpp
BUILDDIR = build
VPATH = $(BUILDDIR)
LIBDIR = /usr/lib
RUNDIR = /var/run/lorgnette
CPPFLAGS += -DRUNDIR=\"$(RUNDIR)\"
BASE_VER ?= 180609
COMMON_PC_DEPS = libchrome-$(BASE_VER) libchromeos-$(BASE_VER)
LORGNETTE_PC_DEPS = \
$(COMMON_PC_DEPS) \
dbus-c++-1 \
gio-2.0 \
glib-2.0
INCLUDE_DIRS = \
-iquote.. \
-iquote $(BUILDDIR) \
$(shell $(PKG_CONFIG) --cflags $(LORGNETTE_PC_DEPS))
LORGNETTE_LIBS = \
-lmetrics \
-lminijail \
-lrt \
$(shell $(PKG_CONFIG) --libs $(LORGNETTE_PC_DEPS))
DBUS_BINDINGS_DIR = dbus_bindings
BUILD_DBUS_BINDINGS_DIR = $(BUILDDIR)/lorgnette/$(DBUS_BINDINGS_DIR)
_CREATE_BUILDDIR := $(shell mkdir -p \
$(BUILDDIR) \
$(BUILD_DBUS_BINDINGS_DIR))
# Rename local XML files with the names required by DBus to XML files with the
# names required by the style guide, which will then be turned into generated
# headers later.
DBUS_BINDINGS_XML_LOCAL = \
org.chromium.lorgnette.Manager>lorgnette-manager
define ADD_LOCAL_BINDING
$(eval _SOURCE = $(word 1,$(subst >, ,$(1))))
$(eval _TARGET = $(word 2,$(subst >, ,$(1))))
DBUS_ADAPTOR_HEADERS += $(_TARGET).h
$(BUILD_DBUS_BINDINGS_DIR)/$(_TARGET).xml: $(DBUS_BINDINGS_DIR)/$(_SOURCE).xml
echo " CP " $$@
cp $$< $$@
endef
$(foreach b,$(DBUS_BINDINGS_XML_LOCAL),$(eval $(call ADD_LOCAL_BINDING,$(b))))
DBUS_ADAPTOR_BINDINGS = \
$(addprefix $(BUILD_DBUS_BINDINGS_DIR)/, $(DBUS_ADAPTOR_HEADERS))
LORGNETTE_LIB = $(BUILDDIR)/lorgnette.a
LORGNETTE_OBJS = $(addprefix $(BUILDDIR)/, daemon.o manager.o minijail.o)
LORGNETTE_BIN = lorgnette
# Broken out separately, because (unlike other LORGNETTE_OBJS), it
# shouldn't be linked into TEST_BIN.
LORGNETTE_MAIN_OBJ = $(BUILDDIR)/main.o
TEST_BIN = lorgnette_unittest
TEST_OBJS = $(addprefix $(BUILDDIR)/, manager_unittest.o testrunner.o)
OBJS = $(LORGNETTE_MAIN_OBJ) $(LORGNETTE_OBJS) $(TEST_OBJS)
GTEST_LIBS := $(shell gmock-config --libs) $(shell gtest-config --libs)
TEST_LIBS = $(LORGNETTE_LIBS) $(GTEST_LIBS)
.PHONY: all clean
all: $(LORGNETTE_BIN)
$(BUILD_DBUS_BINDINGS_DIR)/%.xml: $(DBUS_BINDINGS_DIR)/%.xml
echo " CP " $@
cp $< $@
$(DBUS_ADAPTOR_BINDINGS): %.h: %.xml
echo " DBUSXX_XML2CPP " $@
$(DBUSXX_XML2CPP) $< --adaptor=$@
$(BUILDDIR)/%.o: %.cc
echo " CXX " $@
$(CXX) $(CPPFLAGS) $(CXXFLAGS) $(INCLUDE_DIRS) -MMD -c $< -o $@
$(LORGNETTE_OBJS): $(DBUS_ADAPTOR_BINDINGS)
$(TEST_OBJS): $(DBUS_ADAPTOR_BINDINGS)
$(LORGNETTE_LIB): $(LORGNETTE_OBJS)
echo " AR " $@
$(AR) rcs $@ $^
$(LORGNETTE_BIN): $(LORGNETTE_MAIN_OBJ) $(LORGNETTE_LIB)
echo " CXX " $@
$(CXX) $(CXXFLAGS) $(LDFLAGS) $^ $(LORGNETTE_LIBS) -o $@
$(TEST_BIN): CPPFLAGS += -DUNIT_TEST
$(TEST_BIN): \
$(TEST_OBJS) \
$(LORGNETTE_LIB)
echo " CXX " $@
$(CXX) $(CXXFLAGS) $(LDFLAGS) $^ $(TEST_LIBS) -o $@
clean:
rm -rf \
$(BUILDDIR) \
$(LORGNETTE_BIN) \
$(TEST_BIN)
# Don't output build commands. When adding rules, please echo a short
# form of the build command manually. E.g. 'echo " CXX " $@'.
.SILENT:
-include $(OBJS:.o=.d)