| # 2010, Google Inc. | |
| # All rights reserved. | |
| # | |
| # Redistribution and use in source and binary forms, with or without | |
| # modification, are permitted provided that the following conditions are | |
| # met: | |
| # | |
| # * Redistributions of source code must retain the above copyright | |
| # notice, this list of conditions and the following disclaimer. | |
| # * Redistributions in binary form must reproduce the above | |
| # copyright notice, this list of conditions and the following disclaimer | |
| # in the documentation and/or other materials provided with the | |
| # distribution. | |
| # * Neither the name of Google Inc. nor the names of its | |
| # contributors may be used to endorse or promote products derived from | |
| # this software without specific prior written permission. | |
| # | |
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
| # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
| # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
| # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
| # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
| # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
| # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
| # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
| # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
| # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
| # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| # | |
| # Alternatively, this software may be distributed under the terms of the | |
| # GNU General Public License ("GPL") version 2 as published by the Free | |
| # Software Foundation. | |
| PACKAGE_NAME = flashmap | |
| VERSION_MAJOR = 0 | |
| VERSION_MINOR = 3 | |
| AR ?= $(CROSS_COMPILE)ar | |
| CC ?= $(CROSS_COMPILE)gcc | |
| LD ?= $(CROSS_COMPILE)ld | |
| MAKE = make | |
| RM = rm -f | |
| INSTALL = install | |
| INSTALL_DATA := $(INSTALL) -m 644 | |
| INSTALL_DIR := $(INSTALL) -m 755 -d | |
| INSTALL_PROGRAM := $(INSTALL) -m 755 | |
| LN = ln | |
| SYMLINK = $(LN) -sf | |
| # OS package manager may set LIBDIR with respect to 32-bit/64-bit environment | |
| LIBDIR ?= lib | |
| prefix = /usr | |
| sbindir = $(prefix)/sbin | |
| libdir = $(prefix)/$(LIBDIR) | |
| includedir = $(prefix)/include | |
| pkgconfig_dir = $(libdir)/pkgconfig | |
| DEFS = -DVERSION_MAJOR=$(VERSION_MAJOR)\ | |
| -DVERSION_MINOR=$(VERSION_MINOR) | |
| CFLAGS += -O2 -Wall -Werror -Wno-unused-parameter -Ilib/ $(DEFS) | |
| CFLAGS_GCOV := -fprofile-arcs -ftest-coverage -lgcov | |
| LINKOPTS = | |
| PROGRAMS = fmap_decode fmap_encode fmap_csum libfmap_example | |
| TEST_PROGRAM = fmap_test | |
| SRC_LIBDIR = lib | |
| GENHTML_OUTPUT ?= html | |
| SHARED_OBJ = libfmap | |
| SHARED_OBJ_FILE = $(SHARED_OBJ).so.0.0.0 | |
| SHARED_OBJ_SONAME = $(SHARED_OBJ).so.0 | |
| SVNVERSION := $(shell LC_ALL=C svnversion -cn . 2>/dev/null | sed -e "s/.*://" -e "s/\([0-9]*\).*/\1/" | grep "[0-9]" || LC_ALL=C svn info . 2>/dev/null | awk '/^Revision:/ {print $$2 }' | grep "[0-9]" || LC_ALL=C git svn info . 2>/dev/null | awk '/^Revision:/ {print $$2 }' | grep "[0-9]" || echo unknown) | |
| RELEASENAME := $(PACKAGE_NAME)-$(VERSION_MAJOR).$(VERSION_MINOR)-r$(SVNVERSION) | |
| export CFLAGS | |
| all: $(PROGRAMS) $(SHARED_OBJ_FILE) | |
| help: | |
| @echo "flashmap build targets:" | |
| @echo "help - print this help screen" | |
| @echo "all - build utilities and shared library" | |
| @echo "test - build and run unit tests, generate coverage statistics" | |
| @echo "install - install utilities, headers, and shared library" | |
| @echo "uninstall - opposite of install" | |
| @echo "" | |
| $(SRC_LIBDIR)/libfmap.a: | |
| @$(MAKE) -C $(SRC_LIBDIR) | |
| ar rcs $@ $(SRC_LIBDIR)/*.o | |
| $(SHARED_OBJ_FILE): $(SRC_LIBDIR)/libfmap.a | |
| $(CC) -fpic -shared -Wl,-soname,$(SHARED_OBJ_SONAME) -o $@ -Wl,-whole-archive $^ -Wl,-no-whole-archive | |
| $(PROGRAMS): $(SRC_LIBDIR)/libfmap.a | |
| $(CC) $(CFLAGS) $(LINKOPTS) -I. -o $@ $@.c $^ | |
| # Add shared object filename to gcc command in case it's not installed already | |
| $(LIBFMAP_EXAMPLE): $(SHARED_OBJ_FILE) | |
| $(CC) $(CFLAGS) $(LINKOPTS) -o $@ $@.c $(SHARED_OBJ_FILE) | |
| $(TEST_PROGRAM): $(SRC_LIBDIR)/libfmap.a | |
| $(CC) $(CFLAGS) $(LINKOPTS) -I. -o $@ $@.c $^ | |
| test: CFLAGS += $(CFLAGS_GCOV) | |
| test: $(TEST_PROGRAM) | |
| lcov --directory . --zerocounters | |
| @echo "Running $(TEST_PROGRAM)" | |
| ./$(TEST_PROGRAM) | |
| lcov --directory . --capture \ | |
| --output-file $(TEST_PROGRAM).info --test-name $(TEST_PROGRAM) | |
| genhtml -o $(GENHTML_OUTPUT)/ $(TEST_PROGRAM).info | |
| @echo "Unit test coverage statistics are at $(GENHTML_OUTPUT)/index.html" | |
| test_only: $(TEST_PROGRAM) | |
| @echo "Running $(TEST_PROGRAM)" | |
| ./$(TEST_PROGRAM) | |
| PHONY += export | |
| export: | |
| @rm -rf $(EXPORTDIR)/$(RELEASENAME) | |
| @svn export -r BASE . $(EXPORTDIR)/$(RELEASENAME) | |
| @sed "s/^SVNVERSION.*/SVNVERSION := $(SVNVERSION)/" Makefile >$(EXPORTDIR)/$(RELEASENAME)/Makefile | |
| @LC_ALL=C svn log >$(EXPORTDIR)/$(RELEASENAME)/ChangeLog | |
| @echo Exported $(EXPORTDIR)/$(RELEASENAME)/ | |
| PHONY += tarball | |
| # TAROPTIONS reduces information leakage from the packager's system. | |
| # If other tar programs support command line arguments for setting uid/gid of | |
| # stored files, they can be handled here as well. | |
| TAROPTIONS = $(shell LC_ALL=C tar --version|grep -q GNU && echo "--owner=root --group=root") | |
| tarball: export | |
| @tar cjf $(EXPORTDIR)/$(RELEASENAME).tar.bz2 -C $(EXPORTDIR)/ $(TAROPTIONS) $(RELEASENAME)/ | |
| @rm -rf $(EXPORTDIR)/$(RELEASENAME) | |
| @echo Created $(EXPORTDIR)/$(RELEASENAME).tar.bz2 | |
| USE_PKG_CONFIG ?= $(shell if [ -d "$(ROOT)$(pkgconfig_dir)" ]; then echo 1; else echo 0; fi) | |
| ifeq ($(USE_PKG_CONFIG),1) | |
| define FMAP_PC | |
| prefix=$(prefix) | |
| exec_prefix=$(prefix) | |
| includedir=$(includedir) | |
| libdir=$(libdir) | |
| Name: fmap | |
| Description: Flashmap library | |
| Version: $(VERSION_MAJOR).$(VERSION_MINOR) | |
| Requires: | |
| Cflags: -I$(includedir) | |
| Libs: -L$(libdir) -lfmap | |
| endef | |
| export FMAP_PC | |
| pkgconfig_install: | |
| @echo "Installing pkg-config .pc file" | |
| @echo "$$FMAP_PC" > fmap.pc | |
| $(INSTALL_DIR) $(DESTDIR)$(pkgconfig_dir) | |
| $(INSTALL_DATA) fmap.pc $(DESTDIR)$(pkgconfig_dir) | |
| else | |
| pkgconfig_install: | |
| endif | |
| install: all pkgconfig_install | |
| $(INSTALL_DIR) $(DESTDIR)$(sbindir) | |
| $(INSTALL_DIR) $(DESTDIR)$(libdir) | |
| $(INSTALL_DIR) $(DESTDIR)$(includedir) | |
| $(INSTALL_PROGRAM) fmap_decode $(DESTDIR)$(sbindir) | |
| $(INSTALL_PROGRAM) fmap_encode $(DESTDIR)$(sbindir) | |
| $(INSTALL_PROGRAM) fmap_csum $(DESTDIR)$(sbindir) | |
| $(INSTALL_DATA) lib/fmap.h $(DESTDIR)$(includedir) | |
| $(INSTALL_DATA) lib/valstr.h $(DESTDIR)$(includedir) | |
| $(INSTALL_DATA) $(SRC_LIBDIR)/libfmap.a $(DESTDIR)$(libdir) | |
| $(INSTALL_DATA) $(SHARED_OBJ_FILE) $(DESTDIR)$(libdir) | |
| $(SYMLINK) $(SHARED_OBJ_FILE) $(DESTDIR)$(libdir)/$(SHARED_OBJ).so | |
| $(SYMLINK) $(SHARED_OBJ_FILE) $(DESTDIR)$(libdir)/$(SHARED_OBJ).so.0 | |
| @echo Installed shared library, please run ldconfig. | |
| ifeq ($(USE_PKG_CONFIG),1) | |
| pkgconfig_uninstall: | |
| @echo "Removing pkg-config .pc file" | |
| $(RM) $(DESTDIR)$(pkgconfig_dir)/fmap.pc | |
| else | |
| pkgconfig_uninstall: | |
| endif | |
| uninstall: pkgconfig_uninstall | |
| $(RM) $(DESTDIR)$(sbindir)/fmap_decode | |
| $(RM) $(DESTDIR)$(sbindir)/fmap_encode | |
| $(RM) $(DESTDIR)$(sbindir)/fmap_csum | |
| $(RM) $(DESTDIR)$(includedir)/fmap.h | |
| $(RM) $(DESTDIR)$(includedir)/valstr.h | |
| $(RM) $(DESTDIR)$(libdir)/libfmap.a | |
| $(RM) $(DESTDIR)$(libdir)/$(SHARED_OBJ_FILE) | |
| $(RM) $(DESTDIR)$(libdir)/$(SHARED_OBJ).so | |
| $(RM) $(DESTDIR)$(libdir)/$(SHARED_OBJ).so.0 | |
| .PHONY: clean | |
| RCS_FIND_IGNORE := \( -name SCCS -o -name BitKeeper -o -name .svn -o -name CVS -o -name .pc -o -name .hg -o -name .git \) -prune -o | |
| lcov-clean: | |
| @find . $(RCS_FIND_IGNORE) \ | |
| \( -name '*.css' -o -name '*.gcda' -o -name '*.png' \ | |
| -o -name '*.css' -o -name '*.info' -o -name '*.html' \ | |
| -o -name '*.gcno' \) \ | |
| -type f -print | xargs rm -f | |
| @rm -rf $(GENHTML_OUTPUT)/ | |
| clean: lcov-clean | |
| rm -f *.o *.a $(PROGRAMS) $(TEST_PROGRAM) $(LIBFMAP_EXAMPLE) $(SHARED_OBJ_FILE) | |
| @$(MAKE) -C $(SRC_LIBDIR) clean | |
| %.o: %.c | |
| $(CC) $(CFLAGS) -c $^ -I. -o $@ |