Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
script3r
GitHub Repository: script3r/os161
Path: blob/master/mk/os161.hostcompile.mk
733 views
#
# OS/161 build environment: compile source files for the host system.
#
# Usage: use os161.hostprog.mk or os161.hostlib.mk
#
# Variables controlling this file:
#
# SRCS				.c and .S files to compile.
#
# Provides:
#
# HOST_OBJS			.ho files from compilation.
#

# Objects list starts empty. It is added to below.
HOST_OBJS=

# .ho is a host object.
.SUFFIXES: .ho

clean: cleanhostcompile
cleanhostcompile:
	rm -f $(MYBUILDDIR)/*.ho $(MYBUILDDIR)/*.ha

distclean: distcleanhostcompile
distcleanhostcompile:
	rm -f .hostdepend

#
# Depend: generate dependency information.
# Use gcc's -MM argument for this.
#
# Note that we use -MM rather than -M, so we don't get system headers.
# They would be host system headers and we don't want to get involved
# with those.
#
# The awk scripts and the first sed invocation transform the results to
# have one file per line.
# 
# The second sed command changes the .o filenames in gcc's output
# to .ho names.
#
# The third sed command replaces the value of $(INSTALLTOP) -- which
# is some pathname -- with the string $(INSTALLTOP). This makes the
# depend file independent of the value of $(INSTALLTOP).
#
# XXX: why the $p;$x? That seems like a no-op in this script... also,
# this logic is extremely opaque and could be done a lot better...
#
depend: dependhostcompile
dependhostcompile:
	$(HOST_CC) $(HOST_CFLAGS) -DHOST -MM $(SRCS) |\
	  awk '{x=$$0~"^ ";for(i=1;i<=NF;i++){printf "%d %s\n",x,$$i;x=1; }}'|\
	  sed '/1 \\/d' | awk '{ printf "%s%s", $$1?" \\\n ":"\n", $$2 }' |\
	  sed 's/\.o/\.ho/' |\
	  sed 's|$(INSTALLTOP)|$$(INSTALLTOP)|;$$p;$$x' |\
          sed 's|^\([^ ]\)|$$(MYBUILDDIR)/\1|' > .deptmp
	mv -f .deptmp .depend

# We do need to explicitly include .hostdepend, unlike .depend.
.-include ".hostdepend"

# No tags for host programs.
tags: tagshostcompile
tagshostcompile: ;

#
# Compile rules.
# We can use the same rules for .c and .S because gcc knows how to handle
# .S files.
#
.for _S_ in $(SRCS:M*.[cS])
HOST_OBJS+=$(MYBUILDDIR)/$(_S_:T:R).ho
$(MYBUILDDIR)/$(_S_:T:R).ho: $(_S_)
	$(HOST_CC) $(HOST_CFLAGS) -DHOST -c $(_S_) -o $(.TARGET)
.endfor

# Make non-file rules PHONY.
.PHONY: clean cleanhostcompile distclean distcleanhostcompile 
.PHONY: depend dependhostcompile tags tagshostcompile

# End.