############################################################################ # # Makefile -- Top level uClinux makefile. # # Copyright (c) 2001-2004, SnapGear (www.snapgear.com) # Copyright (c) 2001, Lineo # VERSIONPKG = 3.2.0 VERSIONSTR = $(CONFIG_VENDOR)/$(CONFIG_PRODUCT) Version $(VERSIONPKG) ############################################################################ # # Lets work out what the user wants, and if they have configured us yet # .PHONY: all ifeq (.config,$(wildcard .config)) include .config all: no_root ucfront subdirs romfs modules modules_install image else all: no_root config_error endif .PHONY: no_root no_root: @if [ "`whoami`" = "root" ] && [ -z "$${FAKEROOTKEY}" ]; then \ echo "Building DSLinux as root is dangerous!"; \ echo "Build as non-root user instead."; \ echo "Exiting"; \ exit 1; \ fi ############################################################################ # # Get the core stuff worked out # LINUXDIR = $(CONFIG_LINUXDIR) LIBCDIR = $(CONFIG_LIBCDIR) ROOTDIR = $(shell pwd) PATH := $(PATH):$(ROOTDIR)/tools HOSTCC = cc IMAGEDIR = $(ROOTDIR)/images RELDIR = $(ROOTDIR)/release ROMFSDIR = $(ROOTDIR)/romfs ROMFSINST= romfs-inst.sh SCRIPTSDIR = $(ROOTDIR)/config/scripts TFTPDIR = /tftpboot BUILD_START_STRING = $(shell date) BUILD_START_UNIX = $(shell date +%s) LINUX_CONFIG = $(ROOTDIR)/$(LINUXDIR)/.config CONFIG_CONFIG = $(ROOTDIR)/config/.config MODULES_CONFIG = $(ROOTDIR)/modules/.config CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \ else if [ -x /bin/bash ]; then echo /bin/bash; \ else echo sh; fi ; fi) ifeq (config.arch,$(wildcard config.arch)) ifeq ($(filter %_default, $(MAKECMDGOALS)),) include config.arch ARCH_CONFIG = $(ROOTDIR)/config.arch export ARCH_CONFIG endif endif ifneq ($(SUBARCH),) # Using UML, so make the kernel and non-kernel with different ARCHs MAKEARCH = $(MAKE) ARCH=$(SUBARCH) CROSS_COMPILE=$(CROSS_COMPILE) MAKEARCH_KERNEL = $(MAKE) ARCH=$(ARCH) SUBARCH=$(SUBARCH) CROSS_COMPILE=$(CROSS_COMPILE) else MAKEARCH = $(MAKE) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) MAKEARCH_KERNEL = $(MAKEARCH) endif DIRS = $(VENDOR_TOPDIRS) include lib include user export VENDOR PRODUCT ROOTDIR LINUXDIR HOSTCC CONFIG_SHELL export CONFIG_CONFIG LINUX_CONFIG MODULES_CONFIG ROMFSDIR SCRIPTSDIR export VERSIONPKG VERSIONSTR ROMFSINST PATH IMAGEDIR RELDIR RELFILES TFTPDIR export BUILD_START_STRING BUILD_START_UNIX .PHONY: ucfront ucfront: no_root tools/ucfront/*.c $(MAKE) -C tools/ucfront ln -sf $(ROOTDIR)/tools/ucfront/ucfront tools/ucfront-gcc ln -sf $(ROOTDIR)/tools/ucfront/ucfront tools/ucfront-g++ ############################################################################ # # Config stuff, we recall ourselves to load the new config.arch before # running the kernel and other config scripts # .PHONY: config.tk config.in config.in: @chmod u+x config/mkconfig config/mkconfig > config.in config.tk: config.in $(MAKE) -C $(SCRIPTSDIR) tkparse ARCH=dummy $(SCRIPTSDIR)/tkparse < config.in > config.tmp @if [ -f /usr/local/bin/wish ]; then \ echo '#!'"/usr/local/bin/wish -f" > config.tk; \ else \ echo '#!'"/usr/bin/wish -f" > config.tk; \ fi cat $(SCRIPTSDIR)/header.tk >> ./config.tk -find . -depth -type d | grep -v .svn | xargs rmdir > /dev/null 2>&1 || exit 0 rm -f config.tmp echo "set defaults \"/dev/null\"" >> config.tk echo "set help_file \"config/Configure.help\"" >> config.tk cat $(SCRIPTSDIR)/tail.tk >> config.tk chmod 755 config.tk .PHONY: xconfig xconfig: no_root config.tk @wish -f config.tk @if [ ! -f .config ]; then \ echo; \ echo "You have not saved your config, please re-run make config"; \ echo; \ exit 1; \ fi @chmod u+x config/setconfig @config/setconfig defaults @if egrep "^CONFIG_DEFAULTS_KERNEL=y" .config > /dev/null; then \ $(MAKE) linux_xconfig; \ fi @if egrep "^CONFIG_DEFAULTS_MODULES=y" .config > /dev/null; then \ $(MAKE) modules_xconfig; \ fi @if egrep "^CONFIG_DEFAULTS_VENDOR=y" .config > /dev/null; then \ $(MAKE) config_xconfig; \ fi @config/setconfig final .PHONY: config config: no_root config.in @HELP_FILE=config/Configure.help \ $(CONFIG_SHELL) $(SCRIPTSDIR)/Configure config.in @chmod u+x config/setconfig @config/setconfig defaults @if egrep "^CONFIG_DEFAULTS_KERNEL=y" .config > /dev/null; then \ $(MAKE) linux_config; \ fi @if egrep "^CONFIG_DEFAULTS_MODULES=y" .config > /dev/null; then \ $(MAKE) modules_config; \ fi @if egrep "^CONFIG_DEFAULTS_VENDOR=y" .config > /dev/null; then \ $(MAKE) config_config; \ fi @config/setconfig final .PHONY: menuconfig menuconfig: no_root config.in $(MAKE) -C $(SCRIPTSDIR)/lxdialog all @HELP_FILE=config/Configure.help \ $(CONFIG_SHELL) $(SCRIPTSDIR)/Menuconfig config.in @if [ ! -f .config ]; then \ echo; \ echo "You have not saved your config, please re-run make config"; \ echo; \ exit 1; \ fi @chmod u+x config/setconfig @config/setconfig defaults @if egrep "^CONFIG_DEFAULTS_KERNEL=y" .config > /dev/null; then \ $(MAKE) linux_menuconfig; \ fi @if egrep "^CONFIG_DEFAULTS_MODULES=y" .config > /dev/null; then \ $(MAKE) modules_menuconfig; \ fi @if egrep "^CONFIG_DEFAULTS_VENDOR=y" .config > /dev/null; then \ $(MAKE) config_menuconfig; \ fi @config/setconfig final .PHONY: oldconfig oldconfig: no_root config.in @HELP_FILE=config/Configure.help \ $(CONFIG_SHELL) $(SCRIPTSDIR)/Configure -d config.in @$(MAKE) oldconfig_linux @$(MAKE) oldconfig_modules @$(MAKE) oldconfig_config @$(MAKE) oldconfig_uClibc @chmod u+x config/setconfig @config/setconfig final .PHONY: modules modules: . $(LINUXDIR)/.config; if [ "$$CONFIG_MODULES" = "y" ]; then \ [ -d $(LINUXDIR)/modules ] || mkdir $(LINUXDIR)/modules; \ $(MAKEARCH_KERNEL) -C $(LINUXDIR) modules; \ fi .PHONY: modules_install modules_install: modules . $(LINUXDIR)/.config; if [ "$$CONFIG_MODULES" = "y" ]; then \ [ -d $(ROMFSDIR)/lib/modules ] || mkdir -p $(ROMFSDIR)/lib/modules; \ $(MAKEARCH_KERNEL) -C $(LINUXDIR) INSTALL_MOD_PATH=$(ROMFSDIR) DEPMOD="../user/busybox/examples/depmod.pl -k vmlinux" modules_install; \ rm -f $(ROMFSDIR)/lib/modules/*/build; \ find $(ROMFSDIR)/lib/modules -type f -name "*o" | xargs -r $(STRIP) -R .comment -R .note -g; \ fi .PHONY: linux_xconfig linux_xconfig: $(MAKEARCH_KERNEL) -C $(LINUXDIR) xconfig .PHONY: linux_menuconfig linux_menuconfig: $(MAKEARCH_KERNEL) -C $(LINUXDIR) menuconfig .PHONY: linux_config linux_config: $(MAKEARCH_KERNEL) -C $(LINUXDIR) config .PHONY: modules_xconfig modules_xconfig: [ ! -d modules ] || $(MAKEARCH) -C modules xconfig .PHONY: modules_menuconfig modules_menuconfig: [ ! -d modules ] || $(MAKEARCH) -C modules menuconfig .PHONY: modules_config modules_config: [ ! -d modules ] || $(MAKEARCH) -C modules config .PHONY: modules_clean modules_clean: -[ ! -d modules ] || $(MAKEARCH) -C modules clean .PHONY: config_xconfig config_xconfig: $(MAKEARCH) -C config xconfig .PHONY: config_menuconfig config_menuconfig: $(MAKEARCH) -C config menuconfig .PHONY: config_config config_config: $(MAKEARCH) -C config config .PHONY: oldconfig_config oldconfig_config: $(MAKEARCH) -C config oldconfig .PHONY: oldconfig_modules oldconfig_modules: [ ! -d modules ] || $(MAKEARCH) -C modules oldconfig .PHONY: oldconfig_linux oldconfig_linux: $(MAKEARCH_KERNEL) -C $(LINUXDIR) oldconfig .PHONY: oldconfig_uClibc oldconfig_uClibc: [ -z "$(findstring uClibc,$(LIBCDIR))" ] || $(MAKEARCH) -C $(LIBCDIR) oldconfig ############################################################################ # # normal make targets # .PHONY: romfs romfs: no_root ucfront linux subdirs +for dir in vendors $(DIRS) ; do [ ! -d $$dir ] || $(MAKEARCH) -C $$dir romfs || exit 1 ; done -find $(ROMFSDIR)/. -name CVS | xargs -r rm -rf .PHONY: image image: no_root romfs modules modules_install [ -d $(IMAGEDIR) ] || mkdir $(IMAGEDIR) +$(MAKEARCH) -C vendors image .PHONY: netflash netflash netflash_only: ifeq ($(NO_NETFLASH_EXE),) $(MAKE) -C prop/mstools CONFIG_PROP_MSTOOLS_NETFLASH_NETFLASH=y endif .PHONY: release release: $(MAKE) -C release release .PHONY: %_fullrelease %_fullrelease: @echo "This target no longer works" @echo "Do a make -C release $@" exit 1 # # fancy target that allows a vendor to have other top level # make targets, for example "make vendor_flash" will run the # vendor_flash target in the vendors directory # .PHONY: vendor_% vendor_%: +$(MAKEARCH) -C vendors $@ .PHONY: linux linux linux%_only: @if [ $(LINUXDIR) != linux-2.5.x -a $(LINUXDIR) != linux-2.6.x -a ! -f $(LINUXDIR)/.depend ] ; then \ echo "ERROR: you need to do a 'make dep' first" ; \ exit 1 ; \ fi +$(MAKEARCH_KERNEL) -C $(LINUXDIR) $(LINUXTARGET) || exit 1 if [ -f $(LINUXDIR)/vmlinux ]; then \ ln -f $(LINUXDIR)/vmlinux $(LINUXDIR)/linux ; \ fi .PHONY: subdirs subdirs: ucfront linux @echo "Build start unix" @echo $(BUILD_START_UNIX) for dir in $(DIRS) ; do [ ! -d $$dir ] || $(MAKEARCH_KERNEL) -C $$dir || exit 1 ; done .PHONY: dep dep: @if [ ! -f $(LINUXDIR)/.config ] ; then \ echo "ERROR: you need to do a 'make config' first" ; \ exit 1 ; \ fi $(MAKEARCH_KERNEL) -C $(LINUXDIR) dep # This one removes all executables from the tree and forces their relinking .PHONY: relink relink: find user prop vendors -type f -name '*.gdb' | sed 's/^\(.*\)\.gdb/\1 \1.gdb/' | xargs rm -f .PHONY: clean clean: modules_clean for dir in $(LINUXDIR) $(DIRS); do [ ! -d $$dir ] || $(MAKEARCH) -C $$dir clean ; done rm -rf $(ROMFSDIR)/* rm -rf $(IMAGEDIR)/* rm -f config.tk rm -f $(LINUXDIR)/linux rm -rf $(LINUXDIR)/net/ipsec/alg/libaes $(LINUXDIR)/net/ipsec/alg/perlasm .PHONY: real_clean .PHONY: mrproper real_clean mrproper: clean -$(MAKEARCH_KERNEL) -C $(LINUXDIR) mrproper -$(MAKEARCH) -C config clean -$(MAKEARCH) -C uClibc distclean # -$(MAKEARCH) -C $(RELDIR) clean rm -rf romfs config.in config.arch config.tk images rm -f modules/config.tk rm -rf .config .config.old .oldconfig autoconf.h .PHONY: distclean distclean: mrproper -$(MAKEARCH_KERNEL) -C $(LINUXDIR) distclean -rm -f user/tinylogin/applet_source_list user/tinylogin/config.h .PHONY: %_only %_only: [ ! -d "$(@:_only=)" ] || $(MAKEARCH) -C $(@:_only=) .PHONY: %_clean %_clean: [ ! -d "$(@:_clean=)" ] || $(MAKEARCH) -C $(@:_clean=) clean .PHONY: %_default %_default: @if [ ! -f "vendors/$(@:_default=)/config.device" ]; then \ echo "vendors/$(@:_default=)/config.device must exist first"; \ exit 1; \ fi -$(MAKE) clean > /dev/null 2>&1 cp vendors/$(@:_default=)/config.device .config chmod u+x config/setconfig yes "" | config/setconfig defaults config/setconfig final $(MAKE) dep $(MAKE) .PHONY: config_error config_error: @echo "*************************************************" @echo "You have not run make config." @echo "The build sequence for this source tree is:" @echo "1. 'make config' or 'make xconfig'" @echo "2. 'make dep'" @echo "3. 'make'" @echo "*************************************************" @exit 1 .PHONY: prune prune: $(MAKE) -C user prune .PHONY: dist-prep dist-prep: -find $(ROOTDIR) -name 'Makefile*.bin' | while read t; do \ $(MAKEARCH) -C `dirname $$t` -f `basename $$t` $@; \ done ############################################################################ .PHONY: xsh xsh: @$(MAKE) -f Makefile.$@