2 # Copyright 2008-2012 Michel Pollet <buserror@gmail.com>
4 # This file is part of simavr.
6 # simavr is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
11 # simavr is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License
17 # along with simavr. If not, see <http://www.gnu.org/licenses/>.
19 SHELL := ${shell which bash}
20 SIMAVR_VERSION := ${shell \
21 { git log -1 --tags --simplify-by-decoration --pretty="format:%d"|\
22 sed -e 's/[\(\) ]//g'; } || \
29 # tracing is useful especialy if you develop simavr core.
30 # it otherwise eat quite a bit of few cycles, even disabled
31 #CFLAGS += -DCONFIG_SIMAVR_TRACE=1
33 all: obj config libsimavr ${target}
35 include ../Makefile.common
37 cores := ${wildcard cores/*.c}
38 sim := ${wildcard sim/sim_*.c} ${wildcard sim/avr_*.c}
39 sim_o := ${patsubst sim/%.c, ${OBJ}/%.o, ${sim}}
51 ${OBJ}/libsimavr.a : ${sim_o}
53 $(AR) cru $@ $^ && $(RANLIB) $@
56 @$(AR) cru $@ $^ && $(RANLIB) $@
60 # Shared library (Linux)
62 ${OBJ}/libsimavr.so.1 : ${sim_o}
64 $(CC) -shared -Wl,-soname,libsimavr.so.1 -o $@ $^
67 @$(CC) -shared -Wl,-soname,libsimavr.so.1 -o $@ $^
70 ${OBJ}/libsimavr.so : ${OBJ}/libsimavr.so.1
71 ln -sf libsimavr.so.1 $@
73 libsimavr : config ${OBJ}/libsimavr.a
74 # shared library won't work that easily on non-linux
75 ifeq (${shell uname}, Linux)
76 libsimavr : ${OBJ}/libsimavr.so
79 ${OBJ}/${target}.elf : ${OBJ}/${target}.o
81 ${target} : ${OBJ}/${target}.elf
85 rm -rf ${target} *.a *.so
91 $(MKDIR) $(DESTDIR)/include/simavr/avr
92 $(INSTALL) -m644 sim/*.h $(DESTDIR)/include/simavr/
93 $(INSTALL) -m644 sim_core_*.h $(DESTDIR)/include/simavr/
94 $(INSTALL) -m644 sim/avr/*.h $(DESTDIR)/include/simavr/avr/
95 $(MKDIR) $(DESTDIR)/lib
96 $(INSTALL) ${OBJ}/libsimavr.a $(DESTDIR)/lib/
97 $(MKDIR) $(DESTDIR)/lib/pkgconfig/
98 sed -e "s|PREFIX|${PREFIX}|g" -e "s|VERSION|${SIMAVR_VERSION}|g" \
99 simavr-avr.pc >$(DESTDIR)/lib/pkgconfig/simavr-avr.pc
100 sed -e "s|PREFIX|${PREFIX}|g" -e "s|VERSION|${SIMAVR_VERSION}|g" \
101 simavr.pc >$(DESTDIR)/lib/pkgconfig/simavr.pc
102 ifeq (${shell uname}, Linux)
103 $(INSTALL) ${OBJ}/libsimavr.so.1 $(DESTDIR)/lib/
104 ln -sf libsimavr.so.1 $(DESTDIR)/lib/libsimavr.so
106 $(MKDIR) $(DESTDIR)/bin
107 $(INSTALL) ${OBJ}/${target}.elf $(DESTDIR)/bin/simavr
109 # Needs 'fpm', oneline package manager. Install with 'gem install fpm'
110 # This generates 'mock' debian files, without all the policy, scripts
111 # and all the things normal debian requires. If debian decides to roll
112 # in simavr officialy, this section shall diseapear
114 rm -rf /tmp/simavr-tmp && mkdir -p /tmp/simavr-tmp/usr && \
115 make cleam; make install DESTDIR=/tmp/simavr-tmp/usr RELEASE=1 && \
116 (cd /tmp/simavr-tmp && \
117 fpm -s dir -t deb -C /tmp/simavr-tmp -n libsimavr -v $(SIMAVR_VERSION) \
118 --iteration $(SIMAVR_REVISION) \
120 --description "lean and mean Atmel AVR simulator: Runtime library" \
121 usr/lib/lib*.so* && \
122 fpm -s dir -t deb -C /tmp/simavr-tmp -n libsimavr-dev -v $(SIMAVR_VERSION) \
123 --iteration $(SIMAVR_REVISION) \
124 -d 'libsimavr >= $(SIMAVR_VERSION)' \
125 --description "lean and mean Atmel AVR simulator: Development files" \
126 usr/include usr/lib/lib*.a usr/lib/pkgconfig && \
127 fpm -s dir -t deb -C /tmp/simavr-tmp -n simavr -v $(SIMAVR_VERSION) \
128 --iteration $(SIMAVR_REVISION) \
129 -d 'libsimavr >= $(SIMAVR_VERSION)' \
130 --description "lean and mean Atmel AVR simulator: Executable" \
134 config: ${OBJ}/cores.deps sim_core_config.h sim_core_decl.h
137 # this tries to preprocess all the cores and decide
138 # which ones have a chance of compiling at all. Some platform
139 # ship with old version of avr-gcc and associated and needs
143 DEBUGLOG=/tmp/simavr_conf.log
147 sim_core_config.h ${OBJ}/cores.deps: $(cores) Makefile
149 @conf=""; decl=""; array=""; \
150 mkdir -p ${OBJ} ; echo >${OBJ}/cores.deps ; echo >$(DEBUGLOG) ;\
151 for core in cores/*.c ; do \
152 file=$$core; global=$${core/cores\/sim_}; global=$${global/.c}; \
153 upper=$$(echo $$global|tr '[a-z]' '[A-Z]'); \
154 if $(CC) -E $(CFLAGS) ${AVR_CPPFLAGS} $$file \
155 >>$(DEBUGLOG) 2>&1 ; then \
156 conf+="#define CONFIG_$$upper 1\n"; \
157 obj=$${file/.c/.o} ; obj=$${obj/cores\/}; \
158 printf "\$${OBJ}/libsimavr.a: \$${OBJ}/$$obj\n">>${OBJ}/cores.deps ; \
159 printf "\$${OBJ}/libsimavr.so.1: \$${OBJ}/$$obj\n">>${OBJ}/cores.deps ; \
161 echo WARNING $$file did not compile, check your avr-gcc toolchain; \
164 ( printf "// Autogenerated do not edit\n"; \
165 printf "#ifndef __SIM_CORE_CONFIG_H__\n#define __SIM_CORE_CONFIG_H__\n\n"; \
166 printf "#define CONFIG_SIMAVR_VERSION \"${SIMAVR_VERSION}\"\n"; \
172 # This take the config file that was generated, and create the static
173 # table of all available cores for name lookups, as well as a C
176 sim_core_decl.h: sim_core_config.h $(cores) Makefile
178 @decl=""; array=""; \
179 for core in $$(grep -r avr_kind_t cores/|awk -F '[ :]' '{print $$1 "=" $$3;}') ; do \
180 file=$${core/=*}; global=$${core/*=}; \
181 upper=$${file/cores\/sim_}; upper=$${upper/.c}; \
182 upper=$$(echo $$upper|tr '[a-z]' '[A-Z]'); \
183 decl+="#if CONFIG_$$upper\nextern avr_kind_t $$global;\n#endif\n"; \
184 array+="#if CONFIG_$$upper\n\t&$$global,\n#endif\n"; \
186 ( printf "// Autogenerated do not edit\n"; \
187 printf "#ifndef __SIM_CORE_DECL_H__\n#define __SIM_CORE_DECL_H__\n\n"; \
188 printf "#include \"sim_core_config.h\"\n";\
189 printf "$$decl\n" ; \
190 printf "extern avr_kind_t * avr_kind[];\n"; \
191 printf "#ifdef AVR_KIND_DECL\navr_kind_t * avr_kind[] = {\n$$array\tNULL\n};\n#endif\n"; \
195 -include ${OBJ}/cores.deps