Makefiles: Use PREFIX instead of DESTDIR in simavr.pc
[simavr] / simavr / Makefile
1 #
2 #       Copyright 2008-2012 Michel Pollet <buserror@gmail.com>
3 #
4 #       This file is part of simavr.
5 #
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.
10 #
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.
15 #
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/>.
18
19 SIMAVR_VERSION  = ${shell git tag |tail -1|sed 's/[^0-9]*//'}
20 SIMAVR_REVISION = 2
21
22 target  = run_avr
23
24 CFLAGS  += -Werror
25 # tracing id useful especialy if you develop simavr core.
26 # it otherwise eat quite a bit of few cycles, even disabled
27 #CFLAGS += -DCONFIG_SIMAVR_TRACE=1
28
29 all:    obj config libsimavr ${target}
30
31 include ../Makefile.common
32
33 cores   = ${wildcard cores/*.c}
34 sim             = ${wildcard sim/sim_*.c} ${wildcard sim/avr_*.c}
35 sim_o   = ${patsubst sim/%.c, ${OBJ}/%.o, ${sim}}
36
37 VPATH   = cores
38 VPATH   += sim
39
40 IPATH   = sim
41 IPATH   += .
42 IPATH   += ../../shared
43 IPATH   += ../include
44     
45 #
46 # Static library
47 #
48 ${OBJ}/libsimavr.a      :       ${sim_o}
49 ifeq ($(V),1)
50         $(AR) cru $@ $^ && $(RANLIB) $@
51 else
52         @echo AR $@
53         @$(AR) cru $@ $^ && $(RANLIB) $@
54 endif
55
56 #
57 # Shared library (Linux)
58 #
59 ${OBJ}/libsimavr.so.1   :       ${sim_o}
60 ifeq ($(V),1)
61         $(CC) -shared -Wl,-soname,libsimavr.so.1 -o $@ $^
62 else
63         @echo SHARED $@
64         @$(CC) -shared -Wl,-soname,libsimavr.so.1 -o $@ $^
65 endif
66
67 ${OBJ}/libsimavr.so             : ${OBJ}/libsimavr.so.1
68         ln -sf libsimavr.so.1 $@
69
70 libsimavr       : config ${OBJ}/libsimavr.a
71 # shared library won't work that easily on non-linux
72 ifeq (${shell uname}, Linux)
73 libsimavr       :       ${OBJ}/libsimavr.so
74 endif
75
76 ${OBJ}/${target}.elf    : ${OBJ}/${target}.o
77
78 ${target}       : ${OBJ}/${target}.elf
79         ln -sf $< $@
80  
81 clean: clean-${OBJ}
82         rm -rf ${target} *.a *.so
83
84 DESTDIR = /usr/local
85 PREFIX = ${DESTDIR}
86
87 install : all
88         $(MKDIR) $(DESTDIR)/include/simavr/avr
89         $(INSTALL) sim/*.h $(DESTDIR)/include/simavr/
90         $(INSTALL) sim_core_*.h $(DESTDIR)/include/simavr/
91         $(INSTALL) ../include/*.h $(DESTDIR)/include/simavr/avr/
92         $(MKDIR) $(DESTDIR)/lib
93         $(INSTALL) ${OBJ}/libsimavr.a $(DESTDIR)/lib/
94         $(MKDIR) $(DESTDIR)/lib/pkgconfig/
95         sed -e "s|PREFIX|${PREFIX}|g" -e "s|VERSION|${SIMAVR_VERSION}|g" \
96                 simavr.pc >$(DESTDIR)/lib/pkgconfig/simavr.pc
97 ifeq (${shell uname}, Linux)
98         $(INSTALL) ${OBJ}/libsimavr.so.1 $(DESTDIR)/lib/
99         ln -sf libsimavr.so.1 $(DESTDIR)/lib/libsimavr.so
100 endif
101         $(MKDIR) $(DESTDIR)/bin
102         $(INSTALL) ${OBJ}/${target}.elf $(DESTDIR)/bin/simavr
103
104 # Needs 'fpm', oneline package manager. Install with 'gem install fpm'
105 # This generates 'mock' debian files, without all the policy, scripts
106 # and all the things normal debian requires. If debian decides to roll
107 # in simavr officialy, this section shall diseapear
108 debian: 
109         rm -rf /tmp/simavr-tmp && mkdir -p /tmp/simavr-tmp/usr && \
110         make install DESTDIR=/tmp/simavr-tmp/usr && \
111         (cd /tmp/simavr-tmp && \
112         fpm -s dir -t deb -C /tmp/simavr-tmp -n libsimavr -v $(SIMAVR_VERSION) \
113                 --iteration $(SIMAVR_REVISION) \
114                 -d 'libelf' \
115         --description "lean and mean Atmel AVR simulator: Runtime library" \
116         usr/lib/lib*.so* && \
117         fpm -s dir -t deb -C /tmp/simavr-tmp -n libsimavr-dev -v $(SIMAVR_VERSION) \
118                 --iteration $(SIMAVR_REVISION) \
119                 -d 'libsimavr >= $(SIMAVR_VERSION)' \
120         --description "lean and mean Atmel AVR simulator: Development files" \
121         usr/include usr/lib/lib*.a usr/lib/pkgconfig && \
122         fpm -s dir -t deb -C /tmp/simavr-tmp -n simavr -v $(SIMAVR_VERSION) \
123                 --iteration $(SIMAVR_REVISION) \
124                 -d 'libsimavr >= $(SIMAVR_VERSION)' \
125         --description "lean and mean Atmel AVR simulator: Executable" \
126         usr/bin ) && \
127         echo Done
128
129 config: ${OBJ}/cores.deps sim_core_config.h sim_core_decl.h
130
131 #
132 # this tries to preprocess all the cores and decide
133 # which ones have a chance of compiling at all. Some platform
134 # ship with old version of avr-gcc and associated and needs
135 # to be verified
136 #
137 ifeq ($(V), 1)
138 DEBUGLOG=/tmp/simavr_conf.log
139 else
140 DEBUGLOG=/dev/null
141 endif
142 sim_core_config.h ${OBJ}/cores.deps: $(cores) Makefile
143         @echo CONF $@
144         @conf=""; decl=""; array=""; \
145         mkdir -p ${OBJ} ; echo >${OBJ}/cores.deps ; echo >$(DEBUGLOG) ;\
146         for core in cores/*.c ; do \
147                 file=$$core; global=$${core/cores\/sim_}; global=$${global/.c}; \
148                 upper=$$(echo $$global|tr '[a-z]' '[A-Z]'); \
149                 if $(CC) -E $(CFLAGS) ${AVR_CPPFLAGS} $$file \
150                         >>$(DEBUGLOG) 2>&1 ; then \
151                         conf+="#define CONFIG_$$upper 1\n"; \
152                         obj=$${file/.c/.o} ; obj=$${obj/cores\/}; \
153                         printf "\$${OBJ}/libsimavr.a: \$${OBJ}/$$obj\n">>${OBJ}/cores.deps ; \
154                         printf "\$${OBJ}/libsimavr.so.1: \$${OBJ}/$$obj\n">>${OBJ}/cores.deps ; \
155                 else \
156                         echo WARNING $$file did not compile, check your avr-gcc toolchain; \
157                 fi \
158         done ; \
159         ( printf "// Autogenerated do not edit\n"; \
160           printf "#ifndef __SIM_CORE_CONFIG_H__\n#define __SIM_CORE_CONFIG_H__\n\n"; \
161           printf "$$conf\n"; \
162           printf "#endif\n"; \
163         ) >sim_core_config.h
164
165 #
166 # This take the config file that was generated, and create the static
167 # table of all available cores for name lookups, as well as a C
168 # config file
169 #  
170 sim_core_decl.h: sim_core_config.h $(cores) Makefile
171         @echo CONF $@
172         @decl=""; array=""; \
173         for core in $$(grep -r avr_kind_t cores/|awk -F '[ :]' '{print $$1 "=" $$3;}') ; do \
174                 file=$${core/=*}; global=$${core/*=}; \
175                 upper=$${file/cores\/sim_}; upper=$${upper/.c}; \
176                 upper=$$(echo $$upper|tr '[a-z]' '[A-Z]'); \
177                 decl+="#if CONFIG_$$upper\nextern avr_kind_t $$global;\n#endif\n"; \
178                 array+="#if CONFIG_$$upper\n\t&$$global,\n#endif\n"; \
179         done ; \
180         ( printf "// Autogenerated do not edit\n"; \
181           printf "#ifndef __SIM_CORE_DECL_H__\n#define __SIM_CORE_DECL_H__\n\n"; \
182           printf "#include \"sim_core_config.h\"\n";\
183           printf "$$decl\n" ;  \
184           printf "extern avr_kind_t * avr_kind[];\n"; \
185           printf "#ifdef AVR_KIND_DECL\navr_kind_t * avr_kind[] = {\n$$array\tNULL\n};\n#endif\n"; \
186           printf "#endif\n"; \
187         ) >sim_core_decl.h
188
189 -include ${OBJ}/cores.deps