Making now keeps track of which target you want
authorKevin Klues <klueska@ros-dev.(none)>
Fri, 26 Mar 2010 03:02:33 +0000 (20:02 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:37 +0000 (17:35 -0700)
Do a 'make realclean' to make it forget which target you want to
compile for, and then type 'make' again.  The rest should be
intuitive.

GNUmakefile
kern/src/Makefrag
scripts/augment-gcc [deleted file]

index 5434a43..150ed27 100644 (file)
@@ -1,20 +1,45 @@
-#
-# This makefile system follows the structuring conventions
-# recommended by Peter Miller in his excellent paper:
-#
-#      Recursive Make Considered Harmful
-#      http://aegis.sourceforge.net/auug97.pdf
-#
+# The ROS Top level Makefile
+# Make sure that 'all' is the first target
 
 
-OBJDIR := obj
+############################################################################# 
+########## Initial Setup so that we can build for different TARGETS #########
+############################################################################# 
 
 
-# Make sure that 'all' is the first target
-all:
+ARCH_LINK := $(shell readlink kern/include/arch)
+ifneq ($(ARCH_LINK),)
+       ARCH_LINK := $(shell basename $(ARCH_LINK))
+       TARGET_ARCH ?= $(ARCH_LINK)
+endif
+ifeq ($(TARGET_ARCH),)
+busted:
+       @echo "You must initially specify your target in the form TARGET_ARCH=<target>"
+       @echo "Current valid values for TARGET_ARCH are 'i686' and 'sparc'"
+       @echo "Subsequent calls for the same target can be made by simply invoking 'make'"
+endif
+
+$(TARGET_ARCH):
+       @if [ "$(ARCH_LINK)" != "$@" ];\
+       then\
+         $(MAKE) realclean;\
+         $(MAKE) all -j;\
+       else\
+         $(MAKE) real-all -j;\
+       fi
 
 
-# User defined constants passed on the command line 
-TARGET_ARCH := i686
+############################################################################# 
+########## Beginning of the guts of the real Makefile #######################
+############################################################################# 
+
+# Default values for configurable Make system variables
 COMPILER := GCC
 COMPILER := GCC
+OBJDIR := obj
+V := @
+
+# Make sure that 'all' is the first target when not erroring out
+all: symlinks
 
 
+# Then grab the users Makelocal file to let them override Make system variables
+# and set up other Make targets
 -include Makelocal
 
 TOP_DIR := .
 -include Makelocal
 
 TOP_DIR := .
@@ -23,25 +48,35 @@ INCLUDE_DIR := $(TOP_DIR)/kern/include
 DOXYGEN_DIR := $(TOP_DIR)/Documentation/doxygen
 
 UNAME=$(shell uname -m)
 DOXYGEN_DIR := $(TOP_DIR)/Documentation/doxygen
 
 UNAME=$(shell uname -m)
-V = @
 
 # Cross-compiler ros toolchain
 #
 # This Makefile will automatically use the cross-compiler toolchain
 
 # Cross-compiler ros toolchain
 #
 # This Makefile will automatically use the cross-compiler toolchain
-# installed as 'i686-ros-*', if one exists.  If the host tools ('gcc',
-# 'objdump', and so forth) compile for a 32-bit x86 ELF target, that will
+# installed as '$(TARGET_ARCH)-ros-*', if one exists.  If the host tools ('gcc',
+# 'objdump', and so forth) compile for a 32-bit ELF target, that will
 # be detected as well.  If you have the right compiler toolchain installed
 # using a different name, set GCCPREFIX explicitly in your Makelocal file
 
 # be detected as well.  If you have the right compiler toolchain installed
 # using a different name, set GCCPREFIX explicitly in your Makelocal file
 
-# try to infer the correct GCCPREFIX
+# Try to infer the correct GCCPREFIX
+ifneq ($(TARGET_ARCH),)
 ifndef GCCPREFIX
 ifndef GCCPREFIX
-GCCPREFIX := $(shell if $(TARGET_ARCH)-ros-objdump -i 2>&1 >/dev/null 2>&1; \
-       then echo '$(TARGET_ARCH)-ros-'; \
-       elif objdump -i 2>&1 | grep 'elf32-$(TARGET_ARCH)' >/dev/null 2>&1; \
-       then echo ''; \
-       else echo "***" 1>&2; \
-       echo "*** Error: Couldn't find $(TARGET_ARCH)-*-ros version of GCC/binutils." 1>&2; \
-       echo "***" 1>&2; exit 1; fi)
+TEST_PREFIX := $(TARGET_ARCH)-ros-
+else
+TEST_PREFIX := $(GCCPREFIX)
+endif
+GCC_EXISTS = $(shell which $(TEST_PREFIX)gcc)
+ifneq ($(GCC_EXISTS),)
+       GCCPREFIX := $(TEST_PREFIX)
+else
+       ERROR := "*** Error: Couldn't find $(TEST_PREFIX) version of GCC/binutils." 
+endif
+ifdef ERROR
+error: 
+       @echo $(ERROR)
+       @exit 1
+else
+error:
+endif
 endif
 
 # Default programs for compilation
 endif
 
 # Default programs for compilation
@@ -71,7 +106,7 @@ PERL    := perl
 EXTRAARGS ?= -std=gnu99 -Wno-attributes -fno-stack-protector -fgnu89-inline
 
 # GCC Library path
 EXTRAARGS ?= -std=gnu99 -Wno-attributes -fno-stack-protector -fgnu89-inline
 
 # GCC Library path
-ifneq ($(shell which $(CC)),)
+ifneq ($(GCC_EXISTS),)
 GCC_LIB := $(shell $(CC) -print-libgcc-file-name)
 endif
 
 GCC_LIB := $(shell $(CC) -print-libgcc-file-name)
 endif
 
@@ -91,14 +126,15 @@ OBJDIRS :=
 
 ROS_ARCH_DIR ?= $(TARGET_ARCH)
 
 
 ROS_ARCH_DIR ?= $(TARGET_ARCH)
 
-kern/include/arch:
-       @ln -s ../arch/$(ROS_ARCH_DIR)/ kern/include/arch
-kern/boot:
-       @ln -s arch/$(ROS_ARCH_DIR)/boot/ kern/boot
-DEPENDS := kern/boot kern/include/arch
+symlinks: error
+       ln -fs ../arch/$(ROS_ARCH_DIR) kern/include/arch
+       ln -fs arch/$(ROS_ARCH_DIR)/boot kern/boot
+       @$(MAKE) -j real-all
 
 # Include Makefrags for subdirectories
 
 # Include Makefrags for subdirectories
+ifneq ($(TARGET_ARCH),)
 include kern/Makefrag
 include kern/Makefrag
+endif
 
 # Eliminate default suffix rules
 .SUFFIXES:
 
 # Eliminate default suffix rules
 .SUFFIXES:
@@ -129,15 +165,14 @@ docs:
 doxyclean:
        rm -rf $(DOXYGEN_DIR)/rosdoc
 
 doxyclean:
        rm -rf $(DOXYGEN_DIR)/rosdoc
 
-augment-gcc: symlinks
-       scripts/augment-gcc $(dir $(shell which $(CC))).. $(TARGET_ARCH)
-
 # For deleting the build
 clean:
        @rm -rf $(OBJDIR)
 # For deleting the build
 clean:
        @rm -rf $(OBJDIR)
+       @echo All clean and pretty!
+
+realclean: clean
        @rm -f kern/boot
        @rm -f kern/include/arch
        @rm -f kern/boot
        @rm -f kern/include/arch
-       @echo All clean and pretty!
 
 always:
        @:
 
 always:
        @:
index 75bb2a3..b0e16d8 100644 (file)
@@ -88,12 +88,12 @@ KERN_LDLIBS    := -livykern
 
 KERN_GCC_LIB   ?= $(GCC_LIB)
 
 
 KERN_GCC_LIB   ?= $(GCC_LIB)
 
-$(OBJDIR)/$(KERN_DIR)/%.o: $(KERN_DIR)/%.c $(DEPENDS)
+$(OBJDIR)/$(KERN_DIR)/%.o: $(KERN_DIR)/%.c
        @echo + cc [KERN] $<
        @mkdir -p $(@D)
        $(V)$(CC) $(KERN_CFLAGS) -c -o $@ $<
 
        @echo + cc [KERN] $<
        @mkdir -p $(@D)
        $(V)$(CC) $(KERN_CFLAGS) -c -o $@ $<
 
-$(OBJDIR)/$(KERN_DIR)/%.o: $(KERN_DIR)/%.S $(DEPENDS)
+$(OBJDIR)/$(KERN_DIR)/%.o: $(KERN_DIR)/%.S
        @echo + as [KERN] $<
        @mkdir -p $(@D)
        $(V)$(CC) $(KERN_CFLAGS) -D__ASSEMBLER__ -c -o $@ $<
        @echo + as [KERN] $<
        @mkdir -p $(@D)
        $(V)$(CC) $(KERN_CFLAGS) -D__ASSEMBLER__ -c -o $@ $<
@@ -105,15 +105,5 @@ $(OBJDIR)/$(KERN_DIR)/kernel: $(KERN_LDDEPENDS)
        $(V)$(OBJDUMP) -S $@ > $@.asm
        $(V)$(NM) -n $@ > $@.sym
 
        $(V)$(OBJDUMP) -S $@ > $@.asm
        $(V)$(NM) -n $@ > $@.sym
 
-all: $(OBJDIR)/$(KERN_DIR)/kernel
+real-all: $(OBJDIR)/$(KERN_DIR)/kernel
 
 
-#$(OBJDIR)/$(KERN_DIR)/bochs.img: $(OBJDIR)/$(KERN_DIR)/kernel $(OBJDIR)/$(KERN_DIR)/boot
-#      @echo + mk [KERN] $@
-#      $(V)dd if=/dev/zero of=$(OBJDIR)/$(KERN_DIR)/bochs.img~ count=10080 2>/dev/null
-#      $(V)dd if=$(OBJDIR)/$(KERN_DIR)/boot of=$(OBJDIR)/$(KERN_DIR)/bochs.img~ conv=notrunc 2>/dev/null
-#      $(V)dd if=$(OBJDIR)/$(KERN_DIR)/kernel of=$(OBJDIR)/$(KERN_DIR)/bochs.img~ seek=1 conv=notrunc 2>/dev/null
-#      $(V)mv $(OBJDIR)/kern/bochs.img~ $(OBJDIR)/kern/bochs.img
-
-ifeq ($(AUGMENT_GCC),TRUE)
-all: augment-gcc
-endif
diff --git a/scripts/augment-gcc b/scripts/augment-gcc
deleted file mode 100755 (executable)
index d2125c0..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-#!/bin/bash
-
-function overwrite
-{
-       for i in `find $1 -iname $3`
-       do
-               if [ ! -f $i.bak ]
-               then
-                       cp $i $i.bak
-               fi
-               cp $2 $i
-       done
-}
-
-if [ -z "$1" -o -z "$2" ]
-then
-       echo usage: $1 path-to-ros-gcc target-arch
-       exit
-fi
-
-overwrite $1 obj/user/parlib/src/$2/crtbegin.o crtbegin.o
-overwrite $1 obj/user/parlib/src/$2/crtend.o crtend.o
-overwrite $1 obj/user/parlib/src/$2/entry.o crt0.o
-
-LIBGCC=`find $1 -iname libgcc.a.bak`
-if [ -z "$LIBGCC" ]
-then
-       LIBGCC=`find $1 -iname libgcc.a`
-fi
-LIBC=$1/$2-elf/lib/libc.a
-LIBM=$1/$2-elf/lib/libm.a
-LIBG=$1/$2-elf/lib/libg.a
-LIBPARLIB=../obj/user/parlib/libparlib.a
-LIBPTHREAD=../obj/user/parlib/libpthread.a
-rm -rf tmp
-mkdir tmp
-cd tmp
-ar x $LIBPARLIB
-for i in *.o; do mv $i first-$i; ar xN 1 $LIBPARLIB $i 2> /dev/null; done
-ar rcs libgcc.a *.o; rm *.o
-ar x $LIBPTHREAD
-for i in *.o; do mv $i first-$i; ar xN 1 $LIBPTHREAD $i 2> /dev/null; done
-ar rcs libgcc.a *.o; rm *.o
-ar x $LIBGCC
-ar x $LIBC
-ar x $LIBM
-ar x $LIBG
-ar rcs libgcc.a *.o
-cd ..
-
-overwrite $1 tmp/libgcc.a libgcc.a
-rm -rf tmp
-
-SYS_INC=$1/$2-elf/sys-include
-cp -Lr user/parlib/inc/* $SYS_INC