blob: dc10fc5da9af16a0c6779cd9b1e214cd2c548747 [file] [log] [blame]
SRCROOT = .
# *DOCUMENTATION*
# To see a list of typical targets execute "make help"
# kbuild compatibility
export srctree := $(shell pwd)
export objtree := $(shell pwd)
export KLIBCSRC := usr/klibc
export VERSION := $(shell cat $(srctree)/$(KLIBCSRC)/version)
export KLIBCINC := usr/include
export KLIBCOBJ := usr/klibc
export KLIBCKERNELSRC ?= linux
export KLIBCKERNELOBJ ?= $(KLIBCKERNELSRC)
export VPATH := $(srctree)
include $(srctree)/scripts/Kbuild.include
KLIBCROSS ?= $(CROSS_COMPILE)
export KLIBCROSS
export CC := $(KLIBCROSS)gcc
export LD := $(KLIBCROSS)ld
export AR := $(KLIBCROSS)ar
export RANLIB := $(KLIBCROSS)ranlib
export STRIP := $(KLIBCROSS)strip
export NM := $(KLIBCROSS)nm
export OBJCOPY := $(KLIBCROSS)objcopy
export OBJDUMP := $(KLIBCROSS)objdump
NOSTDINC_FLAGS := -nostdlib -nostdinc -isystem $(shell $(CC) -print-file-name=include)
ARCH := $(shell uname -m | sed -e s/i.86/i386/ \
-e s/parisc64/parisc/ -e s/sun4u/sparc64/ \
-e s/arm.*/arm/ -e s/sa110/arm/ \
-e s/aarch64.*/arm64/ -e s/sh.*/sh/ \
-e s/ppc64le/ppc64/)
export KLIBCARCH ?= $(ARCH)
export KLIBCARCHDIR := $(shell echo $(KLIBCARCH) | sed -e s/s390x/s390/)
export HOSTCC := gcc
export HOSTCFLAGS := -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
export PERL := perl
# Location for installation
export prefix = /usr
export bindir = $(prefix)/bin
export libdir = $(prefix)/lib
export mandir = $(prefix)/man
export INSTALLDIR = $(prefix)/lib/klibc
export INSTALLROOT =
# Create a fake .config as present in the kernel tree
# But if it exists leave it alone
$(if $(wildcard $(objtree)/.config),,\
$(shell cp $(srctree)/defconfig $(objtree)/.config))
# Prefix Make commands with $(Q) to silence them
# Use quiet_cmd_xxx, cmd_xxx to create nice output
# use make V=1 to get verbose output
ifdef V
ifeq ("$(origin V)", "command line")
KBUILD_VERBOSE = $(V)
endif
endif
ifndef KBUILD_VERBOSE
KBUILD_VERBOSE = 0
endif
ifeq ($(KBUILD_VERBOSE),1)
quiet =
Q =
else
quiet=quiet_
Q = @
endif
# If the user is running make -s (silent mode), suppress echoing of
# commands
ifneq ($(findstring s,$(MAKEFLAGS)),)
quiet=silent_
endif
export quiet Q KBUILD_VERBOSE
# Do not print "Entering directory ..."
MAKEFLAGS += --no-print-directory
# Shorthand to call Kbuild.klibc
klibc := -f $(srctree)/scripts/Kbuild.klibc obj
# Very first target
.PHONY: all klcc klibc
all: klcc klibc
$(objtree)/.config: $(srctree)/defconfig
@echo "defconfig has changed, please remove or edit .config"
@false
$(KLIBCKERNELSRC):
@echo "Cannot find kernel sources."
@echo "Either make a 'linux' symlink point to a kernel tree "
@echo "configured for the $(KLIBCARCH) architecture or specify "
@echo "KLIBCKERNELSRC=<path> to the build."
@false
rpmbuild = $(shell which rpmbuild 2>/dev/null || which rpm)
klibc.spec: klibc.spec.in $(KLIBCSRC)/version
sed -e 's/@@VERSION@@/$(VERSION)/g' < $< > $@
# Build klcc - it is the first target
klcc: $(objtree)/.config
$(Q)$(MAKE) $(klibc)=klcc
klibc: $(objtree)/.config
$(Q)$(MAKE) $(klibc)=.
test: klibc
$(Q)$(MAKE) $(klibc)=usr/klibc/tests
help:
@echo 'Cleaning targets:'
@echo ' clean - Remove most generated files'
@echo ' mrproper - Remove all generated files + config'
@echo ' distclean - mprproper + editor backup + patch files'
@echo ''
@echo 'Build targets:'
@echo 'all - Build all targets'
@echo 'install - Install klibc'
@echo 'klcc - Wrapper around gcc to compile against klibc'
@echo 'test - Run klibc tests'
@echo
@echo 'Build options:'
@echo 'KLIBCKERNELSRC - Path to a configured linux tree'
@echo 'KLIBCKERNELOBJ - Path to kernel output dir (defaults to KLIBCKERNELSRC)'
@echo 'make V=0|1 [targets] 0 => quiet build (default), 1 => verbose build'
@echo 'make V=2 [targets] 2 => give reason for rebuild of target'
@echo
@echo 'Sample invocation:'
@echo 'make KLIBCKERNELSRC=`pwd`/../linux/usr/'
###
# allow one to say make dir/file.o
# Caveat: works only for .c files where we have a Kbuild file in same dir
%.o: %.c FORCE
$(Q)$(MAKE) $(klibc)=$(dir $<) $(dir $<)$(notdir $@)
%.s: %.c FORCE
$(Q)$(MAKE) $(klibc)=$(dir $<) $(dir $<)$(notdir $@)
%.i: %.c FORCE
$(Q)$(MAKE) $(klibc)=$(dir $<) $(dir $<)$(notdir $@)
FORCE: ;
###
# clean: remove generated files
# mrproper does a full cleaning including .config and linux symlink
FIND_IGNORE := \( -name .git \) -prune -o
quiet_cmd_rmfiles = $(if $(wildcard $(rm-files)),RM $(wildcard $(rm-files)))
cmd_rmfiles = rm -f $(rm-files)
clean:
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.clean obj=.
$(Q)find . $(FIND_IGNORE) \
\( -name *.o -o -name *.a -o -name '.*.cmd' -o \
-name '.*.d' -o -name '.*.tmp' \) \
-type f -print | xargs rm -f
rm-files := $(objtree)/.config linux
distclean mrproper: clean
$(Q)find . $(FIND_IGNORE) \
\( -name '*.orig' -o -name '*.rej' -o -name '*~' \
-o -name '*.bak' -o -name '#*#' -o -name '.*.orig' \
-o -name '.*.rej' -o -size 0 \
-o -name '*%' -o -name '.*.cmd' -o -name 'core' \) \
-type f -print | xargs rm -f
$(call cmd,rmfiles)
install: all
$(Q)$(MAKE) -f $(srctree)/scripts/Kbuild.install obj=.
# This does all the prep work needed to turn a freshly exported git repository
# into a release tarball tree
release: klibc.spec
rm -f maketar.sh .config