about summary refs log blame commit diff
path: root/Makefile.lib
blob: 3ebb8df7c98ba582d514c366169813499b4cfe3d (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
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 := $$($(1)_DIR)
  _srcs := $$(foreach src, $$($(1)_SOURCES), $$(_d)/$$(src))
  _objs := $$(addsuffix .o, $$(basename $$(_srcs)))

  ifeq ($(BUILD_SHARED_LIBS), 1)
    _lib := $$(_d)/$(1).so
    $$(_lib): $$(_objs)
	$(QUIET) $(CC) -o $$@ -shared $$^ $$($(1)_LDFLAGS)
  else
    _lib := $$(_d)/$(1).a
    $$(_lib): $$(_objs)
	$(QUIET) ar crs $$@ $$?
    $(1)_LDFLAGS_PROPAGATED += $$($(1)_LDFLAGS)
  endif

  $(1)_NAME := $$(_lib)

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

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

  libs_list += $$(_lib)
  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))
  _objs := $$(addsuffix .o, $$(basename $$(_srcs)))
  _libs := $$(foreach lib, $$($(1)_LIBS), $$($$(lib)_NAME))
  _prog := $$(_d)/$(1)

  $$(_prog): $$(_objs) $$(_libs)
	$(QUIET) $(CXX) -o $$@ -Wl,--no-copy-dt-needed-entries $$^ $$($(1)_LDFLAGS) $$(foreach lib, $$($(1)_LIBS), $$($$(lib)_LDFLAGS_PROPAGATED))

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

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

  programs_list += $$(_prog)
  clean_list += $$(_prog) $$(_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)