Commit 8a61b76cfe23c1d953f737aa8d836782ee8d40c6
authorMichel Pollet <buserror@gmail.com>
Wed, 23 Feb 2011 13:55:29 +0000 (13:55 +0000)
committerMichel Pollet <buserror@gmail.com>
Wed, 23 Feb 2011 13:55:29 +0000 (13:55 +0000)
Changed the makefiles to derivate the target architecture from
gcc itself, and compile all the objects into obj-$arch. This
allows several compilers to be used to build simavr, at the same
time without interferences.

This allow arm cross compilation to live in the same tree as
the x86 one...

Signed-off-by: Michel Pollet <buserror@gmail.com>
6 files changed:
Makefile.common
examples/board_hd77480/Makefile
examples/board_ledramp/Makefile
examples/board_simduino/Makefile
examples/board_timer_64led/Makefile
simavr/Makefile

index e9fabcc9e83b27f9facaa16363794b2e4f580d1e..022f1f14ef65bd21ffbc20eb28d9e3e5a4b07b78 100644 (file)
 #      You should have received a copy of the GNU General Public License
 #      along with simavr.  If not, see <http://www.gnu.org/licenses/>.
 
-CFLAGS += -g --std=gnu99 -O2
+# get the first character of what the compiler says it is
+ARCH = ${shell $(CC) -dumpmachine | sed 's/\(.\).*/\1/'}
+
+ifeq ($(ARCH), i)
+CFLAGS += -mfpmath=sse -msse2 -fPIC
+endif
+
+CFLAGS += -g --std=gnu99
 CFLAGS += ${patsubst %,-I%,${subst :, ,${IPATH}}}
 LDFLAGS += -lelf 
 
@@ -41,6 +48,10 @@ AVR_INC := ${AVR_ROOT}
 AVR := avr-
 endif
 
+CC ?= gcc
+AR ?= ar
+RANLIB ?= ranlib
+
 # The code is compiled "optimized" to the max.
 # 
 # The wierd "-Wl,--undefined=_mmcu,--section-start=.mmcu=0x910000"
@@ -68,15 +79,47 @@ endif
                        ${^} -o ${@}
        @${AVR}size ${@}|sed '1d'
 
-OBJ = obj
+OBJ = obj-${shell $(CC) -dumpmachine}
+
+# this rule has precedence
+${OBJ}/sim_%.o : cores/sim_%.c
+ifeq ($(V),1)
+       $(CC) $(CFLAGS) -MD \
+               -I${AVR_INC}/include/ \
+               $<  -c -o $@
+else
+       @$(CC) $(CFLAGS) -MD \
+               -I${AVR_INC}/include/ \
+               $<  -c -o $@
+       @echo CORE $<
+endif
 
 ${OBJ}/%.o: %.c
+ifeq ($(V),1)
+       $(CC) $(CFLAGS) -MD \
+               $<  -c -o $@
+else
        @$(CC) $(CFLAGS) -MD \
                $<  -c -o $@
        @echo CC $<
+endif
 
+${OBJ}/%.elf:
+ifeq ($(V),1)
+       echo $^ / $<
+       $(CC) -MD ${CFLAGS}  ${LFLAGS} -o $@ $^ $(LDFLAGS)
+else
+       @echo LD $@
+       @$(CC) -MD ${CFLAGS}  ${LFLAGS} -o $@ $^ $(LDFLAGS)
+endif
+
+obj: ${OBJ}
 ${OBJ}: 
        @mkdir -p ${OBJ}
 
+clean-${OBJ}:
+       rm -rf ${OBJ}
+
 # include the dependency files generated by gcc, if any
 -include ${wildcard ${OBJ}/*.d}
index a3ca9799cccae2f2da090f5b6738dda21c55739b..0824356f79c222a68ce1c8e2e80ffa3a19c32940 100644 (file)
@@ -16,7 +16,7 @@
 #      You should have received a copy of the GNU General Public License
 #      along with simavr.  If not, see <http://www.gnu.org/licenses/>.
 
-board= charlcd
+target=        charlcd
 firm_src = ${wildcard at*${board}.c}
 firmware = ${firm_src:.c=.axf}
 simavr = ../../
@@ -38,19 +38,22 @@ else
 LDFLAGS += -framework GLUT -framework OpenGL 
 endif
 
-all: obj atmega48_charlcd.axf ${board
+all: obj atmega48_charlcd.axf ${target
 
 atmega48_charlcd.axf: atmega48_charlcd.c
 
 include ${simavr}/Makefile.common
 
-${board} : ${simavr}/simavr/libsimavr.a
+board = ${OBJ}/${target}.elf
+
 ${board} : ${OBJ}/ac_input.o
 ${board} : ${OBJ}/hd44780.o
 ${board} : ${OBJ}/hd44780_glut.o
-${board} : ${OBJ}/${board}.o
-       @echo LD $@
-       @gcc -MD ${CFLAGS}  ${LFLAGS} -o $@ $^ $(LDFLAGS)
+${board} : ${OBJ}/${target}.o
+${board} : ${simavr}/simavr/${OBJ}/libsimavr.a
+
+${target}: ${board}
+       @echo $@ done
 
-clean:
-       rm -rf obj *.hex *.a *.axf ${board} *.vcd .*.swo .*.swp .*.swm .*.swn
+clean: clean-${OBJ}
+       rm -rf *.hex *.a *.axf ${target} *.vcd .*.swo .*.swp .*.swm .*.swn
index 2274a2697b3687e7dfd4a12bebc1ee1ab5ba9ba2..cc6ac6855e0246ae1bb81e63a4b7c85de5f6a1e8 100644 (file)
@@ -16,7 +16,7 @@
 #      You should have received a copy of the GNU General Public License
 #      along with simavr.  If not, see <http://www.gnu.org/licenses/>.
 
-board= ledramp
+target=        ledramp
 firm_src = ${wildcard at*${board}.c}
 firmware = ${firm_src:.c=.axf}
 simavr = ../../
@@ -38,15 +38,18 @@ else
 LDFLAGS += -framework GLUT -framework OpenGL 
 endif
 
-all: obj ${firmware} ${board}
+all: obj ${firmware} ${target}
 
 include ${simavr}/Makefile.common
 
-${board} : ${simavr}/simavr/libsimavr.a
+board = ${OBJ}/${target}.elf
+
 ${board} : ${OBJ}/button.o
-${board} : ${OBJ}/${board}.o
-       @echo LD $@
-       @gcc -MD ${CFLAGS}  ${LFLAGS} -o $@ $^ $(LDFLAGS)
+${board} : ${OBJ}/${target}.o
+${board} : ${simavr}/simavr/${OBJ}/libsimavr.a
+
+${target}: ${board}
+       @echo $@ done
 
-clean:
-       rm -rf obj *.hex *.a *.axf ${board} *.vcd
+clean: clean-${OBJ}
+       rm -rf *.a *.axf ${target} *.vcd
index 3d5843b7ff8608a2e4930e4a2075207224fec4d6..b620ba29446323cf48ca6d34ceac1f6dbf20ba81 100644 (file)
@@ -16,7 +16,7 @@
 #      You should have received a copy of the GNU General Public License
 #      along with simavr.  If not, see <http://www.gnu.org/licenses/>.
 
-board= simduino
+target=        simduino
 firm_src = ${wildcard atmega*.c}
 firmware = ${firm_src:.c=.hex}
 simavr = ../../
@@ -38,16 +38,19 @@ else
 LDFLAGS += -framework GLUT -framework OpenGL 
 endif
 
-all: obj ${firmware} ${board}
+all: obj ${firmware} ${target}
 
 include ${simavr}/Makefile.common
 
-${board} : ${simavr}/simavr/libsimavr.a
+board = ${OBJ}/${target}.elf
+
 ${board} : ${OBJ}/button.o
 ${board} : ${OBJ}/uart_udp.o
-${board} : ${OBJ}/${board}.o
-       @echo LD $@
-       @gcc -MD ${CFLAGS}  ${LFLAGS} -o $@ $^ $(LDFLAGS)
+${board} : ${OBJ}/${target}.o
+${board} : ${simavr}/simavr/${OBJ}/libsimavr.a
+
+${target}: ${board}
+       @echo $@ done
 
-clean:
-       rm -rf obj *.a *.axf ${board} *.vcd
+clean: clean-${OBJ}
+       rm -rf *.a *.axf ${target} *.vcd
index cde8e4c10c2fe7bac6bcc96b9d656a58dcdc38fd..0dd927295c7a18b6135edceef8c501d79f0a49f7 100644 (file)
@@ -16,8 +16,8 @@
 #      You should have received a copy of the GNU General Public License
 #      along with simavr.  If not, see <http://www.gnu.org/licenses/>.
 
-board= timer_64led
-firm_src = ${wildcard at*${board}.c}
+target=        timer_64led
+firm_src = ${wildcard at*${target}.c}
 firmware = ${firm_src:.c=.axf}
 simavr = ../../
 
@@ -38,16 +38,19 @@ else
 LDFLAGS += -framework GLUT -framework OpenGL 
 endif
 
-all: obj ${firmware} ${board}
+all: obj ${firmware} ${target}
 
 include ${simavr}/Makefile.common
 
-${board} : ${simavr}/simavr/libsimavr.a
+board = ${OBJ}/${target}.elf
+
 ${board} : ${OBJ}/button.o
 ${board} : ${OBJ}/hc595.o
-${board} : ${OBJ}/${board}.o
-       @echo LD $@
-       @gcc -MD ${CFLAGS}  ${LFLAGS} -o $@ $^ $(LDFLAGS)
+${board} : ${OBJ}/${target}.o
+${board} : ${simavr}/simavr/${OBJ}/libsimavr.a
+
+${target}: ${board}
+       @echo $@ done
 
-clean:
-       rm -rf obj *.hex *.a *.axf ${board} *.vcd
+clean: clean-${OBJ}
+       rm -rf *.a *.axf ${target} *.vcd
index 25bba60b9383a619b356f7c7023869c3f74662ba..4e57f8998e9455e8f03e0207bbeded435c99d84d 100644 (file)
 
 target = run_avr
 
-CFLAGS += -O3  -mfpmath=sse -msse2 -Wall -Werror
+CFLAGS += -O3 -Wall -Werror
+
+# tracing id useful especialy if you develop simavr core.
+# it otherwise eat quite a bit of few cycles, even disabled
 #CFLAGS        += -DCONFIG_SIMAVR_TRACE=1
 
+all:   obj libsimavr ${target}
+
+include ../Makefile.common
+
 cores  = ${wildcard cores/*.c}
-cores_o = ${patsubst cores/%.c, obj/%.o, ${cores}}
+cores_o = ${patsubst cores/%.c, ${OBJ}/%.o, ${cores}}
 sim            = ${wildcard sim/sim_*.c} ${wildcard sim/avr_*.c}
-sim_o  = ${patsubst sim/%.c, obj/%.o, ${sim}}
+sim_o  = ${patsubst sim/%.c, ${OBJ}/%.o, ${sim}}
 
 VPATH  = cores
 VPATH  += sim
@@ -37,38 +44,29 @@ IPATH       += ../include
 IPATH  += /opt/local/include
 LFLAGS = -L/opt/local/lib/
 
-all:   obj libsimavr.a
 # shared library won't work that easily on non-linux
 ifeq (${shell uname}, Linux)
-all:   libsimavr.so
+all:   ${OBJ}/libsimavr.so
 endif
-all:   ${target}
 
-obj/sim_%.o : cores/sim_%.c
-       @gcc $(CFLAGS) -MD \
-               -I${AVR_INC}/include/ \
-               $<  -c -o $@
-       @echo CORE $<
 
-include ../Makefile.common
-
-libsimavr.a    :       ${cores_o}
-libsimavr.a    :       ${sim_o}
+${OBJ}/libsimavr.a     :       ${cores_o}
+${OBJ}/libsimavr.a     :       ${sim_o}
        @echo AR $@
-       @ar cru $@ $^
-       @ranlib $@
+       @$(AR) cru $@ $^ && $(RANLIB) $@
 
-libsimavr.so   :       ${cores_o}
-libsimavr.so   :       ${sim_o}
+libsimavr: ${OBJ}/libsimavr.a
+${OBJ}/libsimavr.so    :       ${cores_o}
+${OBJ}/libsimavr.so    :       ${sim_o}
        @echo LD $@
-       @gcc -shared -fPIC -o $@ $(LFLAGS) $^ $(LDFLAGS)
+       @$(CC) -shared -fPIC -o $@ $(LFLAGS) $^ $(LDFLAGS)
 
-${target}      :       libsimavr.a
-${target}      :       obj/${target}.o
-       @gcc $(CFLAGS) $(LFLAGS) \
-               ${^} -o $@ \
-                $(LDFLAGS)
-       @echo LD $@
+${OBJ}/${target}.elf   :       ${OBJ}/${target}.o
+${OBJ}/${target}.elf   :       ${OBJ}/libsimavr.a
 
-clean:
-       rm -rf ${target} obj *.a *.so
+${target}      : ${OBJ}/${target}.elf
+       ln -sf $< $@
+clean: clean-${OBJ}
+       rm -rf ${target} *.a *.so