BSDmakefile   [plain text]


.ifndef DSTROOT
DSTROOT != x=`pwd`/DSTROOT && mkdir -p $$x && echo $$x
.endif
.ifndef OBJROOT
OBJROOT != x=`pwd`/OBJROOT && mkdir -p $$x && echo $$x
.endif
.ifndef SRCROOT
SRCROOT != dirname `pwd`
.endif
.ifndef SYMROOT
SYMROOT != x=`pwd`/SYMROOT && mkdir -p $$x && echo $$x
.endif
ARCH != arch
.ifndef RC_ARCHS
RC_ARCHS = $(ARCH)
RC_$(RC_ARCHS) = 1
.endif
NARCHS != echo $(RC_ARCHS) | wc -w
LIBSYS = $(SDKROOT)/usr/local/lib/system
NJOBS != perl -e '$$n = `/usr/sbin/sysctl -n hw.ncpu`; printf "%d\n", $$n < 2 ? 2 : ($$n * 1.5)'
BSDMAKE = bsdmake -f Makefile
BSDMAKEJ = $(BSDMAKE) -j $(NJOBS)

# This variables are to guarantee that the left-hand side of an expression is
# always a variable
dynamic = dynamic
static = static

# Remove the arch stuff, since we know better here.
LOCAL_CFLAGS != echo $(RC_CFLAGS) | sed 's/ *-arch [^ ][^ ]*//g'

FORMS := debug dynamic profile static

all: setup build

build: build-debug build-dynamic build-profile build-static

# These are the non B&I defaults
.ifndef RC_ProjectName
install: installhdrs install-all

.else # RC_ProjectName

install: setup
.for F in $(FORMS)
install: BI-install-$(F)
.endfor # FORMS
install:
	install -c -m 444 $(OBJROOT)/sys/libsyscall.list $(DSTROOT)/usr/local/lib/system
.endif # RC_ProjectName

.for F in $(FORMS)
.if $(dynamic) == $(F)
SUFFIX$(F) =
.else
SUFFIX$(F) = _$(F)
.endif
LIPOARGS$(F) != perl -e 'printf "%s\n", join(" ", map(qq(-arch $$_ \"$(OBJROOT)/obj.$$_/libsyscall$(SUFFIX$(F)).a\"), qw($(RC_ARCHS))))'

.for A in $(RC_ARCHS)
build-$(F): build-$(A)-$(F)
.endfor # RC_ARCHS
build-$(F):
.if $(NARCHS) == 1
	cp -p "$(OBJROOT)/obj.$(RC_ARCHS)/libsyscall$(SUFFIX$(F)).a" "$(SYMROOT)"
.else
	lipo -create $(LIPOARGS$(F)) -output $(SYMROOT)/libsyscall$(SUFFIX$(F)).a
.endif

.for A in $(RC_ARCHS)
build-$(A)-$(F):
	mkdir -p $(OBJROOT)/obj.$(A) && \
	MAKEOBJDIR="$(OBJROOT)/obj.$(A)" MACHINE_ARCH="$(A)" \
		DSTROOT='$(DSTROOT)' OBJROOT='$(OBJROOT)' SYMROOT='$(SYMROOT)' \
		MAKEFLAGS="" CFLAGS="-arch $(A) $(LOCAL_CFLAGS)" $(BSDMAKEJ) libsyscall$(SUFFIX$(F)).a
.endfor # RC_ARCHS
.endfor # FORMS

installhdrs:
	MAKEOBJDIR="$(OBJROOT)" DESTDIR="$(DSTROOT)" MAKEFLAGS="" \
		DSTROOT='$(DSTROOT)' OBJROOT='$(OBJROOT)' SYMROOT='$(SYMROOT)' \
		$(BSDMAKE) installhdrs
.for A in $(RC_ARCHS)
	mkdir -p "$(OBJROOT)/obj.$(A)" && \
	MAKEOBJDIR="$(OBJROOT)/obj.$(A)" MACHINE_ARCH="$(A)" \
		DSTROOT='$(DSTROOT)' OBJROOT='$(OBJROOT)' SYMROOT='$(SYMROOT)' \
		MAKEFLAGS="" $(BSDMAKE) installhdrs-md
.endfor # RC_ARCHS

.for F in $(FORMS)
BI-install-$(F): build-$(F)
	mkdir -p $(DSTROOT)/usr/local/lib/system
	if [ -f "$(SYMROOT)/libsyscall$(SUFFIX$(F)).a" ]; then \
		echo "Installing libsyscall$(SUFFIX$(F)).a" && \
		install -c -m 444 "$(SYMROOT)/libsyscall$(SUFFIX$(F)).a" \
			$(DSTROOT)/usr/local/lib/system && \
		ranlib "$(DSTROOT)/usr/local/lib/system/libsyscall$(SUFFIX$(F)).a"; \
	fi
.endfor # FORMS

install-man:
	mkdir -p $(DSTROOT)/usr/share/man/man2
	MAKEOBJDIR="$(OBJROOT)" DESTDIR="$(DSTROOT)" \
		DSTROOT='$(DSTROOT)' OBJROOT='$(OBJROOT)' SYMROOT='$(SYMROOT)' \
		MACHINE_ARCH="$(ARCH)" MAKEFLAGS="" $(BSDMAKE) all-man maninstall

install-all: setup build install-man
.for F in $(FORMS)
install-all: BI-install-$(F)
.endfor # FORMS

clean:
.for F in $(FORMS)
	rm -f $(OBJROOT)/libsyscall$(SUFFIX$(F)).a
.endfor # FORMS
.for A in $(RC_ARCHS)
	rm -rf $(OBJROOT)/obj.$(A)
.endfor # RC_ARCHS

INCLUDEDIR = $(OBJROOT)/include
SYSDIR = $(OBJROOT)/sys

setup: $(INCLUDEDIR) $(SYSDIR)

USR-INCLUDE = /usr/include
MOD-HEADERS = architecture/ppc/mode_independent_asm.h architecture/i386/asm_help.h

$(INCLUDEDIR):
	mkdir -p $(INCLUDEDIR)
.for h in $(MOD-HEADERS)
	mkdir -p $(INCLUDEDIR)/$(h:H)
	sed 's/\.globl/.private_extern/g' $(USR-INCLUDE)/$(h) > $(INCLUDEDIR)/$(h)
.endfor # MOD-HEADERS

$(SYSDIR):
	mkdir -p $(SYSDIR)
	$(SRCROOT)/libsyscall/create-syscalls.pl $(SRCROOT)/bsd/kern/syscalls.master $(SRCROOT)/libsyscall/custom $(SYSDIR)