| # 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 $@ |