109 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
#####
 | 
						|
##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 GNUBASE
 | 
						|
$(error GNUBASE not set)
 | 
						|
endif
 | 
						|
 | 
						|
.PHONY: all 
 | 
						|
all:: $(addsuffix .a, \
 | 
						|
	$(addprefix $(GNUBASE)/,$(LIBRARIES))) \
 | 
						|
	$(addprefix $(GNUBASE)/,$(TOPLEVEL_OBJECTS)) \
 | 
						|
	subdirs
 | 
						|
 | 
						|
.PHONY: clean
 | 
						|
clean:: subdirs
 | 
						|
	rm -rf $(GNUBASE)/$(OBJDIR)
 | 
						|
 | 
						|
#Start objects
 | 
						|
define TOPLEVEL_template
 | 
						|
$$(addprefix $$(GNUBASE)/,$(1)): $$(addprefix $$(GNUBASE)/$$(OBJDIR)/,$(1))
 | 
						|
	cp $$? $$@
 | 
						|
endef
 | 
						|
 | 
						|
$(foreach obj,$(TOPLEVEL_OBJECTS),$(eval $(call TOPLEVEL_template,$(obj))))
 | 
						|
 | 
						|
#Library stuff
 | 
						|
define LIBRARY_template
 | 
						|
$$(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):
 | 
						|
	if [ ! -d $(GNUBASE)/$(OBJDIR)/$@ ]; \
 | 
						|
	then \
 | 
						|
		mkdir $(GNUBASE)/$(OBJDIR)/$@; \
 | 
						|
	fi
 | 
						|
	GNUBASE=$(GNUBASE) OBJDIR=$(OBJDIR)/$@ $(MAKE) -C $@ $(MAKECMDGOALS)
 | 
						|
 | 
						|
#Build commands
 | 
						|
#define COMPILE_template
 | 
						|
$(GNUBASE)/%: AR=gar
 | 
						|
$(GNUBASE)/%: AS=gas
 | 
						|
$(GNUBASE)/%: CC=gcc
 | 
						|
 | 
						|
$(GNUBASE)/$(OBJDIR)/%.o: %.gs
 | 
						|
	$(COMPILE.s) -o $@ $<
 | 
						|
 | 
						|
$(GNUBASE)/$(OBJDIR)/%.o: %.c
 | 
						|
	$(COMPILE.c) -o $@ $<
 | 
						|
#endef
 | 
						|
 | 
						|
#$(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
 | 
						|
$$(GNUBASE)/$$(OBJDIR)/$(1): $(2)
 | 
						|
endef
 | 
						|
 | 
						|
define ADDDEPENDENCIES
 | 
						|
$(foreach target,$(1),$(eval $(call DEPENDENCIES_template,$(target),$(2))))
 | 
						|
endef
 |