# TODO:
# - Consider merging the two target-detection bits (Linux's config, mixed, or
# dot target, and the symlink handling). Also, could consider moving around
-# the KFS and EXT2 targets. Clean doesn't need to know about them, for
-# instance.
+# the KFS target. Clean doesn't need to know about it, for instance.
#
# - Review, with an eye for being better about $(srctree). It might only be
# necessary in this file, if we every do the KBUILD_OUTPUT option. But we
export_parent_env := $(shell export | sed 's/$$/;/')
# Save the ability to clear the current environment for future use
-clear_current_env := for c in $$(env | cut -d '=' -f 1); do unset $$c; done;
+clear_current_env := for c in $$(awk 'BEGIN{for (v in ENVIRON){print v}}'); do unset $$c; done;
define export_user_variables
CROSS_COMPILE="$(CROSS_COMPILE)"\
# cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $<
#
# If $(quiet) is empty, the whole command will be printed.
-# If it is set to "quiet_", only the short version will be printed.
+# If it is set to "quiet_", only the short version will be printed.
# If it is set to "silent_", nothing will be printed at all, since
# the variable $(silent_cmd_cc_o_c) doesn't exist.
#
AKAROSINCLUDE := -I$(srctree)/kern/include/
# CROSS_COMPILE is defined per-arch. Each arch can set other makeflags, kbuild
-# directories, etc.
+# directories, etc.
-include $(srctree)/kern/arch/$(ARCH)/Makefile
-CC := $(CROSS_COMPILE)gcc
+CC := $(CROSS_COMPILE)gcc
CPP := $(CROSS_COMPILE)g++
AS := $(CROSS_COMPILE)as
AR := $(CROSS_COMPILE)ar
CFLAGS_KERNEL += -std=gnu99 -fgnu89-inline
CFLAGS_KERNEL += -fno-strict-aliasing -fno-omit-frame-pointer
CFLAGS_KERNEL += -fno-stack-protector
-CFLAGS_KERNEL += -Wall -Wno-format -Wno-unused -Werror
-CFLAGS_KERNEL += -DROS_KERNEL
+CFLAGS_KERNEL += -Wall -Wno-format -Wno-unused -Werror -Wreturn-type
+CFLAGS_KERNEL += -DROS_KERNEL -D__KERNEL__
CFLAGS_KERNEL += -include include/generated/autoconf.h -include include/common.h
CFLAGS_KERNEL += -fplan9-extensions
ifeq ($(CONFIG_64BIT),y)
export KBUILD_BUILTIN KBUILD_CHECKSRC
CFLAGS_USER += -O2 -std=gnu99 -fno-stack-protector -fgnu89-inline \
- -Wsystem-headers -Werror
+ -Wsystem-headers -Werror -Wreturn-type
CXXFLAGS_USER += -O2
CFLAGS_USER_LIBS += -fPIC -static -fno-omit-frame-pointer -g
# Akaros Kernel Build
# =========================================================================
# Add top level directories, either to an existing entry (core-y) or to its
-# own.
+# own.
#
# From these, we determine deps and dirs. We recursively make through the
# dirs, generating built-in.o at each step, which are the deps from which we
kern_cpio := $(OBJDIR)/kern/initramfs.cpio
kern_cpio_obj := $(kern_cpio).o
-# ext2 will crash at runtime if we don't have a block device. try to catch the
-# errors now. if it is a bad one, you're just out of luck.
-ifneq ($(CONFIG_EXT2FS),)
-ext2-bdev := $(patsubst "%",%,$(CONFIG_EXT2_BDEV))
-ifeq ($(ext2-bdev),)
-$(error EXT2 selected with no block device [$(ext2-bdev)], fix your .config)
-endif
-ext2_bdev_obj = $(OBJDIR)/kern/$(shell basename $(ext2-bdev)).o
-endif
-
# a bit hacky: we want to make sure the directories exist, and error out
# otherwise. we also want to error out before the initramfs target, otherwise
# we might not get the error (if initramfs files are all up to date). the
# Not the worlds most elegant link command. link-kernel takes the obj output
# name, then the linker script, then everything else you'd dump on the ld
# command line, including linker options and objects to link together.
-#
+#
# After the script is done, we run the arch-specific command directly.
quiet_cmd_link-akaros = LINK $@
cmd_link-akaros = $(CONFIG_SHELL) scripts/link-kernel.sh $@ \
# List all userspace directories here, and state any dependencies between them,
# such as how pthread depends on parlib.
-user-dirs = parlib pthread benchutil iplib ndblib vmm perfmon
+# Critical libraries, also built during the toolchain install
+user-base-dirs = parlib pthread benchutil iplib ndblib perfmon
benchutil: parlib
pthread: parlib benchutil
iplib: parlib
ndblib: iplib
-vmm: parlib benchutil
-PHONY += install-libs $(user-dirs)
-install-libs: $(user-dirs) symlinks cc-exists
+# Higher-level libraries. Built before tests/, but after apps-install.
+# TODO: would like to move perfmon here, since it's not meant to be low-level.
+# But the apps-install has perf, which depends on user/perfmon.
+user-extra-dirs = vmm electric-fence
+$(user-extra-dirs): $(user-base-dirs)
+
+user-dirs = $(user-base-dirs) $(user-extra-dirs)
+
+PHONY += install-base-libs $(user-dirs)
+install-base-libs: $(user-base-dirs) symlinks cc-exists
$(user-dirs):
@$(MAKE) -C user/$@ DEPLIBS="$^" && $(MAKE) -C user/$@ install
+PHONY += user
user: $(user-dirs)
PHONY += userclean $(clean-user-dirs)
@$(MAKE) -C user/$(patsubst _clean_user_%,%,$@) clean
tests/: tests
-tests: install-libs
+tests: user
@$(MAKE) -f tests/Makefile
PHONY += utest
@echo "User space tests removed from KFS"
@touch $(OBJDIR)/.dont-force-fill-kfs
-fill-kfs: $(OBJDIR)/.dont-force-fill-kfs install-libs tests
+fill-kfs: $(OBJDIR)/.dont-force-fill-kfs user tests
@mkdir -p $(FIRST_KFS_PATH)/lib
$(Q)cp -uP $(xcc-so-files) $(FIRST_KFS_PATH)/lib
@echo "Cross Compiler 'so' files installed to KFS"
# Use doxygen to make documentation for ROS (Untested since 2010 or so)
doxygen-dir := $(CUR_DIR)/Documentation/doxygen
-docs:
+docs:
@echo " Making doxygen"
@doxygen-dir=$(doxygen-dir) doxygen $(doxygen-dir)/rosdoc.cfg
@if [ ! -d $(doxygen-dir)/rosdoc/html/img ]; \
PHONY += apps-install
apps-install: $(app-dirs-install)
- @$(call make_as_parent, -C tools/apps/busybox)
- @$(call make_as_parent, -C tools/apps/ipconfig install)
- @$(call make_as_parent, -C tools/dev-libs/elfutils install)
- @$(call make_as_parent, -C tools/dev-util/perf install)
- @$(call make_as_parent, -C tools/sys-apps/bash install)
+ @$(shell mkdir -p $(AKAROS_ROOT)/build_logs)
+ @$(call make_as_parent, -C tools/apps/busybox) > build_logs/busybox_install.log 2>&1
+ @echo busybox install succeeded.
+ @$(call make_as_parent, -C tools/apps/ipconfig install) > build_logs/ipconfig_install.log 2>&1
+ @echo ipconfig install succeeded.
+ @$(call make_as_parent, -C tools/dev-libs/elfutils install) > build_logs/elfutils_install.log 2>&1
+ @echo elfutils install succeeded.
+ @$(call make_as_parent, -C tools/dev-util/perf install) > build_logs/perf_install.log 2>&1
+ @echo perf install succeeded.
+ @$(call make_as_parent, -C tools/sys-apps/bash install) > build_logs/bash_install.log 2>&1
+ @echo bash install succeeded.
PHONY += apps-clean
apps-clean: $(app-dirs-clean)
- @$(call make_as_parent, -C tools/apps/busybox clean)
- @$(call make_as_parent, -C tools/apps/ipconfig clean)
- @$(call make_as_parent, -C tools/dev-libs/elfutils clean)
- @$(call make_as_parent, -C tools/dev-util/perf clean)
+ @$(shell mkdir -p $(AKAROS_ROOT)/build_logs)
+ @$(call make_as_parent, -C tools/apps/busybox clean) > build_logs/busybox_clean.log 2>&1
+ @echo busybox clean succeeded.
+ @$(call make_as_parent, -C tools/apps/ipconfig clean) > build_logs/ipconfig_clean.log 2>&1
+ @echo ipconfig clean succeeded.
+ @$(call make_as_parent, -C tools/dev-libs/elfutils clean) > build_logs/elfutils_clean.log 2>&1
+ @echo elfutils clean succeeded.
+ @$(call make_as_parent, -C tools/dev-util/perf clean) > build_logs/perf_clean.log 2>&1
+ @echo perf clean succeeded.
+ @$(call make_as_parent, -C tools/sys-apps/bash clean) > build_logs/bash_clean.log 2>&1
+ @echo bash clean succeeded.
# Cross Compiler
# =========================================================================
PHONY += xcc-upgrade
xcc-upgrade: xcc
@$(MAKE) userclean
- @$(MAKE) install-libs
+ @$(MAKE) install-base-libs
@$(MAKE) testclean utestclean
@$(call make_as_parent, apps-clean)
@$(call make_as_parent, apps-install)