Global included Makefile
This commit is contained in:
parent
e50b781884
commit
df7c913bd9
1 changed files with 153 additions and 0 deletions
153
lib/Makefile.inc
Normal file
153
lib/Makefile.inc
Normal file
|
@ -0,0 +1,153 @@
|
|||
#####
|
||||
##Top Makefile to build the Minix libraries for ack and gnu
|
||||
#
|
||||
##needed in makefile that includes this file:
|
||||
#
|
||||
##libraries to build without .a:
|
||||
#LIBRARIES=liba libb libc
|
||||
#
|
||||
##object files per library:
|
||||
#liba_OBJECTS=filea2.o filea2.o
|
||||
#libb_OBJECTS=fileb.o
|
||||
#libc_OBJECTS=filec.o
|
||||
#
|
||||
##if it has subdirectories
|
||||
#SUBDIRS=subdir1 subdir2
|
||||
#
|
||||
#
|
||||
##The main Makefile has to specify the ack and gnu base object directories:
|
||||
#ACKBASE=/path/to/ack-obj
|
||||
#GNUBASE=/path/to/gnu-obj
|
||||
##or relative in this way:
|
||||
#ACKBASE=$(CURDIR)/ack-obj
|
||||
#GNUBASE=$(CURDIR)/gnu-obj
|
||||
#
|
||||
##All these variables have to be set before including this Makefile
|
||||
#
|
||||
#
|
||||
##To customize dependencies for targets you can do the following
|
||||
#$(call ADDDEPENDENCIES,filea2.o fileb.o,header1.h header2.h)
|
||||
#
|
||||
##And to customize MAKE variables for targets use the same construct this way
|
||||
#$(call ADDDEPENDENCIES,filea2.o fileb.o,CFLAGS+=-D_EXTRA_DEFINES -g)
|
||||
#
|
||||
##Only one variable can be set per call to ADDDEPENDENCIES
|
||||
#
|
||||
|
||||
##Object files that must end up in the top level object directory must be in
|
||||
##then variable named TOPLEVEL_OBJECTS
|
||||
|
||||
ifndef ACKBASE
|
||||
$(error ACKBASE not set)
|
||||
endif
|
||||
|
||||
ifndef GNUBASE
|
||||
$(error GNUBASE not set)
|
||||
endif
|
||||
|
||||
.PHONY: all
|
||||
all:: $(addsuffix .a, \
|
||||
$(addprefix $(ACKBASE)/,$(LIBRARIES)) \
|
||||
$(addprefix $(GNUBASE)/,$(LIBRARIES))) \
|
||||
$(addprefix $(ACKBASE)/,$(TOPLEVEL_OBJECTS)) \
|
||||
$(addprefix $(GNUBASE)/,$(TOPLEVEL_OBJECTS)) \
|
||||
subdirs
|
||||
|
||||
.PHONY: clean
|
||||
clean:: subdirs
|
||||
rm -rf $(ACKBASE)/$(OBJDIR) $(GNUBASE)/$(OBJDIR)
|
||||
|
||||
.PHONY: install
|
||||
install::
|
||||
|
||||
#Start objects
|
||||
define TOPLEVEL_template
|
||||
$$(addprefix $$(ACKBASE)/,$(1)): $$(addprefix $$(ACKBASE)/$$(OBJDIR)/,$(1))
|
||||
cp $$? $$@
|
||||
$$(addprefix $$(GNUBASE)/,$(1)): $$(addprefix $$(GNUBASE)/$$(OBJDIR)/,$(1))
|
||||
cp $$? $$@
|
||||
endef
|
||||
|
||||
$(foreach obj,$(TOPLEVEL_OBJECTS),$(eval $(call TOPLEVEL_template,$(obj))))
|
||||
|
||||
#Library stuff
|
||||
define LIBRARY_template
|
||||
$$(ACKBASE)/$(1).a: $$(addprefix $$(ACKBASE)/$$(OBJDIR)/,$$($(1)_OBJECTS))
|
||||
$$(AR) cr $$@ $$?
|
||||
|
||||
$$(GNUBASE)/$(1).a: $$(addprefix $$(GNUBASE)/$$(OBJDIR)/,$$($(1)_OBJECTS))
|
||||
$$(AR) cr $$@ $$?
|
||||
ranlib $$@
|
||||
endef
|
||||
|
||||
$(foreach lib,$(LIBRARIES),$(eval $(call LIBRARY_template,$(lib))))
|
||||
|
||||
#subdirectories
|
||||
.PHONY: subdirs $(SUBDIRS)
|
||||
subdirs: $(SUBDIRS)
|
||||
$(SUBDIRS):
|
||||
mkdir -p $(ACKBASE)/$(OBJDIR)/$@
|
||||
mkdir -p $(GNUBASE)/$(OBJDIR)/$@
|
||||
ACKBASE=$(ACKBASE) GNUBASE=$(GNUBASE) OBJDIR=$(OBJDIR)/$@ $(MAKE) -C $@ $(MAKECMDGOALS)
|
||||
# $(call compiledir-ack,$@)
|
||||
# $(call compiledir-gnu,$@)
|
||||
|
||||
#ack vs gnu
|
||||
define compiledir_ack
|
||||
mkdir -p $(ack_OBJDIR)/$(OBJDIR)/$(1)
|
||||
cd $(1) && OBJDIR=$(OBJDIR)/$(1) AR=ar AS='cc -c' CC=cc RANLIB= ASMEXT=s gmake $@ $(MAKECMDGOALS)
|
||||
endef
|
||||
|
||||
define compiledir_gnu
|
||||
mkdir -p $(gnu_OBJDIR)/$(OBJDIR)/$(1)
|
||||
cd $(1) && OBJDIR=$(OBJDIR)/$(1) AR=gar AS=gas CC=gcc RANLIB=ranlib ASMEXT=gs gmake $@ $(MAKECMDGOALS)
|
||||
endef
|
||||
|
||||
#Build commands
|
||||
#$(GNUBASE)/$(OBJDIR)/%: AR=gar AS=gas CC=gcc RANLIB=ranlib ASMEXT=gs ASMPREFIX=$(GNUBASE)/$(OBJDIR)
|
||||
#$(ACKBASE)/$(OBJDIR)/%: AR=ar AS='cc -c' CC=cc RANLIB= ASMEXT=s
|
||||
|
||||
#$(1)/$$(OBJDIR)/%.o: $(3)
|
||||
define COMPILE_template
|
||||
$(1)/%: AR=$(3)
|
||||
$(1)/%: AS=$(4)
|
||||
$(1)/%: CC=$(5)
|
||||
|
||||
$(1)/$$(OBJDIR)/%.o: %.$(2)
|
||||
$$(COMPILE.s) -o $$@ $$<
|
||||
|
||||
$(1)/$$(OBJDIR)/%.o: %.c
|
||||
$$(COMPILE.c) -o $$@ $$<
|
||||
endef
|
||||
|
||||
#ASMPREFIX?
|
||||
#$(1)/$$(OBJDIR)/%.o: $(2)%.$(3)
|
||||
# $$(COMPILE.s) -o $$@ $$<
|
||||
#$(eval $(call COMPILE_template,$$(ACKBASE),,s,ar,cc -c,cc))
|
||||
#$(eval $(call COMPILE_template,$$(GNUBASE),$$(GNUBASE)/$$(OBJDIR)/,gs,gar,gas,gcc))
|
||||
#$(GNUBASE)/$(OBJDIR)/%.gs: %.s
|
||||
|
||||
#$(GNUBASE)/$(OBJDIR)/%.o: $(GNUBASE)/$(OBJDIR)/%.gs
|
||||
# $(COMPILE.s) -o $@ $<
|
||||
|
||||
#$(GNUBASE)/$(OBJDIR)/%.o: %.c
|
||||
# $(COMPILE.c) -o $@ $<
|
||||
|
||||
$(eval $(call COMPILE_template,$$(ACKBASE),s,ar,cc -c,cc))
|
||||
$(eval $(call COMPILE_template,$$(GNUBASE),gs,gar,gas,gcc))
|
||||
|
||||
%.gs: %.s
|
||||
@echo converting $< to gnu assembler format...
|
||||
@-gcc $(CFLAGS) -E -x assembler-with-cpp -I. $< | asmconv -mi386 ack gnu > $@
|
||||
|
||||
#DEPENDENCIES
|
||||
define DEPENDENCIES_template
|
||||
$$(ACKBASE)/$$(OBJDIR)/$(1): $(2)
|
||||
$$(GNUBASE)/$$(OBJDIR)/$(1): $(2)
|
||||
endef
|
||||
|
||||
define ADDDEPENDENCIES
|
||||
$(foreach target,$(1),$(eval $(call DEPENDENCIES_template,$(target),$(2))))
|
||||
endef
|
||||
|
||||
#this could also be automated by adding an extra template that uses the names of object files as variable name
|
Loading…
Reference in a new issue