Makefile lib

From Attie's Wiki
(Difference between revisions)
Jump to: navigation, search
m (Created page with 'This makefile has been built in 2 halves. 'makfile.generic' which contains things you should change, and 'makefile' which contains thing that can probably be left unchanged. ==m…')
 
m
Line 40: Line 40:
  
 
==makefile==
 
==makefile==
−
<source lang="text>
+
<source lang="text">
 
include makefile.generic
 
include makefile.generic
  

Revision as of 11:19, 23 January 2012

This makefile has been built in 2 halves. 'makfile.generic' which contains things you should change, and 'makefile' which contains thing that can probably be left unchanged.

makefile.generic

### libxbee configuration options:
 
### system install directories
SYS_LIBDIR:=    /usr/lib
SYS_INCDIR:=    /usr/include
 
### setup a cross-compile toolchain (either here, or in the environment)
#CROSS_COMPILE:=
 
### add build 'OPTIONS', these will be passed as -D<name> to gcc etc
 
### example from libxbee: un-comment to remove ALL logging (smaller & faster binary)
#OPTIONS+=       XBEE_DISABLE_LOGGING
 
################################################################################
### Do NOT change below this line
 
LIBMAJ:=        1
LIBMIN:=        0
LIBREV:=        0
 
LIBOUT:=        libmylib
 
LIBS:=          pthread
 
SRCS:=          mylib
 
SYS_HEADERS:=   mylib.h
RELEASE_FILES:= HISTORY
 
VER_DEFINES:=   -DLIB_REVISION="\"$(LIBFULLREV)\""                             \
                -DLIB_COMMIT="\"$(shell git log -1 --format="%H")\""           \
                -DLIB_COMMITTER="\"$(shell git log -1 --format="%cn <%ce>")\"" \
                -DLIB_BUILDTIME="\"$(shell date)\""

makefile

include makefile.generic
 
BUILDDIR:=.build
DESTDIR:=lib
LIBFULLREV:=$(LIBMAJ).$(LIBMIN).$(LIBREV)
 
RELEASE_ITEMS:=$(DESTDIR)/$(LIBOUT).so.$(LIBFULLREV)       \
               $(DESTDIR)/$(LIBOUT).so                     \
               $(DESTDIR)/$(LIBOUT).so.$(LIBFULLREV).dbg   \
               $(DESTDIR)/$(LIBOUT).a.$(LIBFULLREV)        \
               $(DESTDIR)/$(LIBOUT).a                      \
               $(SYS_HEADERS)                              \
               $(RELEASE_FILES)
 
AR:=$(CROSS_COMPILE)ar
LD:=$(CROSS_COMPILE)ld
GCC:=$(CROSS_COMPILE)gcc
OBJCOPY:=$(CROSS_COMPILE)objcopy
 
DEBUG:=-g
CFLAGS:=-Wall -Wstrict-prototypes -Wno-variadic-macros -c -fPIC $(DEBUG) $(addprefix -D,$(OPTIONS))
CFLAGS+=-fvisibility=hidden
#CFLAGS+=-pedantic
CLINKS:=$(addprefix -l,$(LIBS)) $(DEBUG)
 
###############################################################################
 
.PHONY: all install install_dbg install_sudo install_dbg_sudo help clean spotless new release .%.dir
.PRECIOUS: .%.dir $(BUILDDIR)/%.d
 
OBJS:=$(addprefix $(BUILDDIR)/,$(addsuffix .o,$(SRCS)))
 
 
all: $(DESTDIR)/$(LIBOUT).so $(DESTDIR)/$(LIBOUT).a
 
install: all
	sudo make install_sudo
 
install_dbg: all
	sudo make install_dbg_sudo
 
install_sudo: all $(addprefix $(SYS_INCDIR)/,$(SYS_HEADERS)) $(SYS_LIBDIR)/$(LIBOUT).so.$(LIBFULLREV) $(SYS_LIBDIR)/$(LIBOUT).a.$(LIBFULLREV)
 
install_dbg_sudo: install_sudo $(SYS_LIBDIR)/$(LIBOUT).so.$(LIBFULLREV).dbg
 
help:
	@echo "usage:"
	@echo "  make [all]        - to simply build $(LIBOUT)"
	@echo "  make clean        - to remote all object files and start again"
	@echo "  make new          - to perform a 'clean', followed by an 'all'"
	@echo "  make spotless     - to remove ALL generated files and directories"
	@echo "  make release      - to make a *.tar.bz2 file containing all files required to make use of $(LIBOUT)"
	@echo "  make install      - to install $(LIBOUT) on this system"
	@echo "  make install_dbg  - to install $(LIBOUT) along with debug information on this system"
	@echo "  make help         - to display this help information"
	@echo ""
	@echo "other information:"
	@echo "  to modify settings for the build environment and control various aspects ofthe resulting binary,"
	@echo "  edit 'makefile.generic'"
 
 
$(SYS_LIBDIR)/$(LIBOUT).%.$(LIBFULLREV): $(DESTDIR)/$(LIBOUT).%.$(LIBFULLREV)
	cp -f $^ $@
	chmod 644 $@
	ln -fs $@ $(subst .$(LIBFULLREV),,$@)
 
$(SYS_LIBDIR)/$(LIBOUT).so.$(LIBFULLREV).dbg: $(DESTDIR)/$(LIBOUT).so.$(LIBFULLREV).dbg
	cp -f $^ $@
	chmod 644 $@
 
$(SYS_INCDIR)/%.h: %.h
	cp -f $^ $@
	chmod 644 $@
 
 
new: clean
	@$(MAKE) --no-print-directory all
 
clean:
	rm -rdf $(BUILDDIR)/*.o
	rm -rdf $(DESTDIR)/*
 
spotless: clean
	rm -rdf $(BUILDDIR) .$(BUILDDIR).dir
	rm -rdf $(DESTDIR) .$(DESTDIR).dir
 
 
release: all
	tar -cjvf $(LIBOUT)_v$(LIBFULLREV)_`date +%Y-%m-%d`_`git rev-parse --verify --short HEAD`_`uname -m`.tar.bz2 $(RELEASE_ITEMS)
 
 
.%.dir:
	@if [ ! -d $* ]; then echo "mkdir -p $*"; mkdir -p $*; else echo "!mkdir $*"; fi
	@touch $@
 
 
$(DESTDIR)/$(LIBOUT).so: $(DESTDIR)/$(LIBOUT).so.$(LIBFULLREV)
	@ln -fs `basename $^` $@
 
$(DESTDIR)/$(LIBOUT).so.$(LIBFULLREV): .$(DESTDIR).dir $(DESTDIR)/$(LIBOUT).o
	@echo "  [SPLIT] $@ / $@.dbg"
	@$(GCC) -shared -Wl,-soname,$(LIBOUT).so.$(LIBFULLREV) $(CLINKS) $(filter %.o,$^) -o $@
	@$(OBJCOPY) --only-keep-debug $@ $@.dbg
	@$(OBJCOPY) --add-gnu-debuglink=$@.dbg $@
	@$(OBJCOPY) --strip-debug $@
 
$(DESTDIR)/$(LIBOUT).a: $(DESTDIR)/$(LIBOUT).a.$(LIBFULLREV)
	@ln -fs `basename $^` $@
 
$(DESTDIR)/$(LIBOUT).a.$(LIBFULLREV): .$(DESTDIR).dir $(DESTDIR)/$(LIBOUT).o
	@echo "  [AR]    $@"
	@$(AR) rcs $@ $(filter %.o,$^)
 
$(DESTDIR)/$(LIBOUT).o: .$(DESTDIR).dir $(OBJS)
	@echo "  [LD]    $@"
	@$(LD) -r $(filter %.o,$^) -o $@
 
 
$(BUILDDIR)/%.d: .$(BUILDDIR).dir %.c
	@echo "  [GEN]   $@"
	@$(GCC) -MM -MT $(addprefix $(BUILDDIR)/,$*.o) $*.c -o $@
 
$(BUILDDIR)/ver.o: $(BUILDDIR)/ver.d *.c *.h
	@echo "  [GCC]   $@"
	@$(GCC) $(CFLAGS) $(VER_DEFINES) ver.c -o $@
 
$(BUILDDIR)/%.o: $(BUILDDIR)/%.d
	@echo "  [GCC]   $@"
	@$(GCC) $(CFLAGS) $*.c -o $@
 
include $(wildcard $(BUILDDIR)/*.d)
Personal tools
Namespaces

Variants
Actions
Navigation
Toolbox