about summary refs log blame commit diff
path: root/Makefile.lib
blob: 16fd20c773b39ebc41400680a53e7b2920114134 (plain) (tree)
1
2
3
4
5
6
7
8
9
10


            






                                   








                                                                   
                            

             
         
 
 

                                                 

                          
                                                   




                                

                       



                

         
                                                                                                                 

        
                                                                                                          





                                    
                              
                                                            
                                                       
                                                           
 
                     
                               
 
                                
 



                               


                                          
                                                                                                                                                                           
 
                                                                                                   




                                                     


                                                                           
                                       
                                                                                                                                                                                     


                                                                                                                             
      
 


                                
                               
 
                                                      


                                             

       
                                                 
                                                           
 
                                                      
                                                                             
 

                                   
                            
                                                              
                         

     

                                                             





                                   
                                                            
                                                       
                                                           
                          
 
                                        
                                                                                                                                       
 

                                      







                                                                           
                                                                                                                                                                   




                                                

                  
       
 
                                                      
                                                                             
 

                                   

                                                     
                         

     
                                                                       
 
 
                     






                                                                                             
                 




                            


                     
default: all


# Include Autoconf variables.
Makefile.config: Makefile.config.in
	./config.status

include Makefile.config


# Include all sub-Makefiles.
define include_sub_makefile =
  d := $$(patsubst %/, %, $$(dir $(1)))
  include $(1)
endef

$(foreach mf, $(SUBS), $(eval $(call include_sub_makefile, $(mf))))


# Initialise some variables.
clean_list :=
dist_files :=
QUIET = @


# Pass -fPIC if we're building dynamic libraries.
ifeq ($(BUILD_SHARED_LIBS), 1)
  GLOBAL_CFLAGS += -fPIC
  GLOBAL_CXXFLAGS += -fPIC
  GLOBAL_LDFLAGS += -Wl,--no-copy-dt-needed-entries
endif


# Pass -g if we want debug info.
ifeq ($(BUILD_DEBUG), 1)
  GLOBAL_CFLAGS += -g
  GLOBAL_CXXFLAGS += -g
endif


# Pattern rules.

%.o: %.cc
	$(QUIET) $(CXX) -o $@ -c $< $(GLOBAL_CXXFLAGS) $(CXXFLAGS) $($@_CXXFLAGS) -MMD -MF $(basename $@).dep -MP

%.o: %.c
	$(QUIET) $(CC) -o $@ -c $< $(GLOBAL_CFLAGS) $(CFLAGS) $($@_CFLAGS) -MMD -MF $(basename $@).dep -MP


# Generate Make rules for libraries.
libs_list :=

define LIBS_template =
  _d := $$(strip $$($(1)_DIR))
  _srcs := $$(foreach src, $$($(1)_SOURCES), $$(_d)/$$(src))
  $(1)_OBJS := $$(addsuffix .o, $$(basename $$(_srcs)))
  _libs := $$(foreach lib, $$($(1)_LIBS), $$($$(lib)_PATH))

  $(1)_LDFLAGS_USE :=
  $(1)_LDFLAGS_USE_INSTALLED :=

  ifeq ($(BUILD_SHARED_LIBS), 1)

    ifndef $(1)_ALLOW_UNDEFINED
      $(1)_LDFLAGS += -z defs
    endif

    $(1)_PATH := $$(_d)/$(1).so

    $$($(1)_PATH): $$($(1)_OBJS) $$(_libs)
	$(QUIET) $(CXX) -o $$@ -shared $(GLOBAL_LDFLAGS) $$($(1)_OBJS) $$($(1)_LDFLAGS) $$($(1)_LDFLAGS_PROPAGATED) $$(foreach lib, $$($(1)_LIBS), $$($$(lib)_LDFLAGS_USE))

    $(1)_LDFLAGS_USE += -L$$(_d) -Wl,-rpath,$$(abspath $$(_d)) -l$$(patsubst lib%,%,$$(strip $(1)))

    $(1)_INSTALL_DIR := $$(pkglibdir)

    $(1)_INSTALL_PATH := $$($(1)_INSTALL_DIR)/$(1).so

    _libs_final := $$(foreach lib, $$($(1)_LIBS), $$($$(lib)_INSTALL_PATH))

    $$($(1)_INSTALL_PATH): $$($(1)_OBJS) $$(_libs_final)
	install -d $$($(1)_INSTALL_DIR)
	$(QUIET) $(CXX) -o $$@ -shared $(GLOBAL_LDFLAGS) $$($(1)_OBJS) $$($(1)_LDFLAGS) $$($(1)_LDFLAGS_PROPAGATED) $$(foreach lib, $$($(1)_LIBS), $$($$(lib)_LDFLAGS_USE_INSTALLED))

    $(1)_LDFLAGS_USE_INSTALLED += -L$$($(1)_INSTALL_DIR) -Wl,-rpath,$$($(1)_INSTALL_DIR) -l$$(patsubst lib%,%,$$(strip $(1)))

  else

    $(1)_PATH := $$(_d)/$(1).a

    $$($(1)_PATH): $$($(1)_OBJS)
	$(QUIET) ar crs $$@ $$?

    $(1)_LDFLAGS_USE += $$($(1)_PATH) $$($(1)_LDFLAGS)

    $(1)_INSTALL_PATH := $$(pkglibdir)/$(1).a

  endif

  $(1)_LDFLAGS_USE += $$($(1)_LDFLAGS_PROPAGATED)
  $(1)_LDFLAGS_USE_INSTALLED += $$($(1)_LDFLAGS_PROPAGATED)

  # Propagate CXXFLAGS to the individual object files.
  $$(foreach obj, $$($(1)_OBJS), $$(eval $$(obj)_CXXFLAGS=$$($(1)_CXXFLAGS)))

  include $$(wildcard $$(_d)/*.dep)

  libs_list += $$($(1)_PATH)
  clean_list += $$(_d)/*.a $$(_d)/*.so $$(_d)/*.o $$(_d)/*.dep
  dist_files += $$(_srcs)
endef

$(foreach lib, $(LIBS), $(eval $(call LIBS_template,$(lib))))


# Generate Make rules for programs.
programs_list :=

define PROGRAMS_template =
  _d := $$($(1)_DIR)
  _srcs := $$(foreach src, $$($(1)_SOURCES), $$(_d)/$$(src))
  $(1)_OBJS := $$(addsuffix .o, $$(basename $$(_srcs)))
  _libs := $$(foreach lib, $$($(1)_LIBS), $$($$(lib)_PATH))
  $(1)_PATH := $$(_d)/$(1)

  $$($(1)_PATH): $$($(1)_OBJS) $$(_libs)
	$(QUIET) $(CXX) -o $$@ $(GLOBAL_LDFLAGS) $$($(1)_OBJS) $$($(1)_LDFLAGS) $$(foreach lib, $$($(1)_LIBS), $$($$(lib)_LDFLAGS_USE))

  $(1)_INSTALL_PATH := $$(bindir)/$(1)

  install:: $$($(1)_INSTALL_PATH)

  ifeq ($(BUILD_SHARED_LIBS), 1)

    _libs_final := $$(foreach lib, $$($(1)_LIBS), $$($$(lib)_INSTALL_PATH))

    $$($(1)_INSTALL_PATH): $$($(1)_OBJS) $$(_libs_final)
	install -d $$(dir $$($(1)_INSTALL_PATH))
	$(QUIET) $(CXX) -o $$($(1)_INSTALL_PATH) $(GLOBAL_LDFLAGS) $$($(1)_OBJS) $$($(1)_LDFLAGS) $$(foreach lib, $$($(1)_LIBS), $$($$(lib)_LDFLAGS_USE_INSTALLED))

  else

    $$($(1)_INSTALL_PATH): $$($(1)_PATH)
	install -d $$(dir $$($(1)_INSTALL_PATH))
	cp $$< $$@

  endif

  # Propagate CXXFLAGS to the individual object files.
  $$(foreach obj, $$($(1)_OBJS), $$(eval $$(obj)_CXXFLAGS=$$($(1)_CXXFLAGS)))

  include $$(wildcard $$(_d)/*.dep)

  programs_list += $$($(1)_PATH)
  clean_list += $$($(1)_PATH) $$(_d)/*.o $$(_d)/*.dep
  dist_files += $$(_srcs)
endef

$(foreach prog, $(PROGRAMS), $(eval $(call PROGRAMS_template,$(prog))))


# Distributing stuff.
dist_name = $(PACKAGE_NAME)-$(PACKAGE_VERSION)

dist:
	@echo $(dist_files)
	$(QUIET) tar cvfj $(dist_name).tar.bz2 $(dist_files) --transform 's,^,$(dist_name)/,'


# Cleaning stuff.
clean:
	rm -fv $(clean_list)

dryclean:
	@echo $(clean_list)


all: $(programs_list)