From 9e5b6c43b13a561b09908d2a57edb6c96e4fedaf Mon Sep 17 00:00:00 2001 From: Jason Parker Date: Tue, 12 Feb 2013 14:00:13 -0600 Subject: Add support for building and using shared libraries. --- build/rules.mak | 79 ++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 56 insertions(+), 23 deletions(-) (limited to 'build') diff --git a/build/rules.mak b/build/rules.mak index 0d35c56..b816643 100644 --- a/build/rules.mak +++ b/build/rules.mak @@ -6,17 +6,20 @@ BINDIR = ../bin endif # -# The full path of output lib file (e.g. ../lib/libapp.a). -# -LIB = $($(APP)_LIB) - -# -# The full path of output lib file (e.g. ../lib/libapp.a). +# The name(s) of output lib file(s) (e.g. libapp.a). # +LIB := $($(APP)_LIB) SHLIB = $($(APP)_SHLIB) +SONAME = $($(APP)_SONAME) + +ifeq ($(SHLIB_SUFFIX),so) +SHLIB_OPT := -shared -Wl,-soname,$(SONAME) +else +SHLIB_OPT := +endif # -# The full path of output executable file (e.g. ../bin/app.exe). +# The name of output executable file (e.g. app.exe). # EXE = $($(APP)_EXE) @@ -75,27 +78,46 @@ print_common: @echo RANLIB=$(RANLIB) print_bin: print_common - @echo EXE=$(EXE) - @echo BINDIR=$(BINDIR) - + @echo EXE=$(BINDIR)/$(EXE) + @echo BINDIR=$(BINDIR) + print_lib: print_common - @echo LIB=$(LIB) +ifneq ($(LIB),) + @echo LIB=$(LIBDIR)/$(LIB) +endif +ifneq ($(SHLIB),) + @echo SHLIB=$(LIBDIR)/$(SHLIB) +endif +ifneq ($(SONAME),) + @echo SONAME=$(LIBDIR)/$(SONAME) +endif @echo LIBDIR=$(LIBDIR) -$(LIB): $(OBJDIRS) $(OBJS) $($(APP)_EXTRA_DEP) +ifneq ($(LIB),) +$(LIBDIR)/$(LIB): $(OBJDIRS) $(OBJS) $($(APP)_EXTRA_DEP) if test ! -d $(LIBDIR); then $(subst @@,$(subst /,$(HOST_PSEP),$(LIBDIR)),$(HOST_MKDIR)); fi - $(AR) $(LIB) $(OBJS) - $(RANLIB) $(LIB) + $(AR) $(AR_FLAGS) $@ $(OBJS) + $(RANLIB) $@ +endif -$(SHLIB): $(OBJDIRS) $(OBJS) $($(APP)_EXTRA_DEP) +ifneq ($(SHLIB),) +$(LIBDIR)/$(SHLIB): $(OBJDIRS) $(OBJS) $($(APP)_EXTRA_DEP) if test ! -d $(LIBDIR); then $(subst @@,$(subst /,$(HOST_PSEP),$(LIBDIR)),$(HOST_MKDIR)); fi - $(LD) $(LDOUT)$(subst /,$(HOST_PSEP),$(SHLIB)) \ - $(subst /,$(HOST_PSEP),$(OBJS)) $($(APP)_LDFLAGS) + $(LD) $(LDOUT)$(subst /,$(HOST_PSEP),$@) \ + $(subst /,$(HOST_PSEP),$(OBJS)) $($(APP)_LDFLAGS) $(SHLIB_OPT) +endif + +ifneq ($(SONAME),) +$(LIBDIR)/$(SONAME): $(LIBDIR)/$(SHLIB) + ln -sf $(SHLIB) $@ +endif -$(EXE): $(OBJDIRS) $(OBJS) $($(APP)_EXTRA_DEP) +ifneq ($(EXE),) +$(BINDIR)/$(EXE): $(OBJDIRS) $(OBJS) $($(APP)_EXTRA_DEP) if test ! -d $(BINDIR); then $(subst @@,$(subst /,$(HOST_PSEP),$(BINDIR)),$(HOST_MKDIR)); fi - $(LD) $(LDOUT)$(subst /,$(HOST_PSEP),$(EXE)) \ + $(LD) $(LDOUT)$(subst /,$(HOST_PSEP),$(BINDIR)/$(EXE)) \ $(subst /,$(HOST_PSEP),$(OBJS)) $($(APP)_LDFLAGS) +endif $(OBJDIR)/$(app).o: $(OBJDIRS) $(OBJS) $(CROSS_COMPILE)ld -r -o $@ $(OBJS) @@ -146,13 +168,13 @@ $(OBJDIR)/%$(OBJEXT): $(SRCDIR)/%.cpp $(subst /,$(HOST_PSEP),$<) $(OBJDIRS): - $(subst @@,$(subst /,$(HOST_PSEP),$@),$(HOST_MKDIR)) + $(subst @@,$(subst /,$(HOST_PSEP),$@),$(HOST_MKDIR)) $(LIBDIR): - $(subst @@,$(subst /,$(HOST_PSEP),$(LIBDIR)),$(HOST_MKDIR)) + $(subst @@,$(subst /,$(HOST_PSEP),$@),$(HOST_MKDIR)) $(BINDIR): - $(subst @@,$(subst /,$(HOST_PSEP),$(BINDIR)),$(HOST_MKDIR)) + $(subst @@,$(subst /,$(HOST_PSEP),$@),$(HOST_MKDIR)) clean: $(subst @@,$(subst /,$(HOST_PSEP),$(OBJDIR)/*),$(HOST_RMR)) @@ -167,7 +189,18 @@ gcov-report: done realclean: clean - $(subst @@,$(subst /,$(HOST_PSEP),$(LIB)) $(subst /,$(HOST_PSEP),$(EXE)),$(HOST_RM)) +ifneq ($(LIB),) + $(subst @@,$(subst /,$(HOST_PSEP),$(LIBDIR)/$(LIB)),$(HOST_RM)) +endif +ifneq ($(SHLIB),) + $(subst @@,$(subst /,$(HOST_PSEP),$(LIBDIR)/$(SHLIB)),$(HOST_RM)) +endif +ifneq ($(SONAME),) + $(subst @@,$(subst /,$(HOST_PSEP),$(LIBDIR)/$(SONAME)),$(HOST_RM)) +endif +ifneq ($(EXE),) + $(subst @@,$(subst /,$(HOST_PSEP),$(BINDIR)/$(EXE)),$(HOST_RM)) +endif $(subst @@,$(DEP_FILE),$(HOST_RM)) ifeq ($(OS_NAME),linux-kernel) rm -f ../lib/$(app).ko -- cgit v1.2.3