1#  Top level -*- Makefile -*- for GHDL.
2#  Copyright (C) 2002 - 2014 Tristan Gingold
3#
4#  This program is free software: you can redistribute it and/or modify
5#  it under the terms of the GNU General Public License as published by
6#  the Free Software Foundation, either version 2 of the License, or
7#  (at your option) any later version.
8#
9#  This program is distributed in the hope that it will be useful,
10#  but WITHOUT ANY WARRANTY; without even the implied warranty of
11#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12#  GNU General Public License for more details.
13#
14#  You should have received a copy of the GNU General Public License
15#  along with this program.  If not, see <gnu.org/licenses>.
16CC=@CC@
17CXX=@CXX@
18build=@build@
19srcdir=@srcdir@
20abs_srcdir=@abs_srcdir@
21GNATMAKE=@GNATMAKE@
22MAKE=@MAKE@
23prefix=@prefix@
24backend=@backend@
25libdirsuffix=@libdirsuffix@
26libdirreverse=@libdirreverse@
27EXEEXT=@EXEEXT@
28SOEXT=@SOEXT@
29PIC_FLAGS=@PIC_FLAGS@
30gcc_src_dir=@gcc_src_dir@
31LLVM_CONFIG=@llvm_config@
32LDFLAGS=@LDFLAGS@
33LIBBACKTRACE=@backtrace_lib@
34llvm_be=@llvm_be@
35build_mode=@build_mode@
36ghdl_version=@ghdl_version@
37libghdl_version=@libghdl_version@
38enable_werror=@enable_werror@
39enable_checks=@enable_checks@
40enable_gplcompat=@enable_gplcompat@
41enable_libghdl=@enable_libghdl@
42default_pic=@default_pic@
43
44INSTALL_PROGRAM=install -m 755
45INSTALL_DATA=install -m 644
46PWD?=$(shell pwd)
47DESTDIR=
48bindir=$(prefix)/bin
49libdir=$(prefix)/lib
50incdir=$(prefix)/include
51MKDIR=mkdir
52LN=ln -s
53CP=cp
54MV=mv
55SED=sed
56GRT_RANLIB=ranlib
57GHDL_DESC?=tarball
58
59VHDL_LIB_DIR=$(prefix)/$(libdirsuffix)
60
61ifeq "$(enable_checks)" "true"
62 # Debug + checks
63 OPT_FLAGS+=-g
64 ADA_FLAGS+=-gnata
65 LIB_CFLAGS+=
66else
67 # Optimize + no checks
68 ADA_FLAGS+=-gnatpn
69 OPT_FLAGS+=-O
70 LIB_CFLAGS=-O
71endif
72
73# Profiling.
74#ADA_FLAGS+=-gnatn
75#OPT_FLAGS+=-pg -O
76
77# Coverage
78ifeq "$(build_mode)" "coverage"
79OPT_FLAGS+=-fprofile-arcs -ftest-coverage
80endif
81
82GNATFLAGS=-gnat12 -gnaty3befhkmr -gnatwa -gnatwC -gnatf $(OPT_FLAGS) $(ADA_FLAGS)
83GRT_FLAGS=$(OPT_FLAGS)
84
85ifeq "$(default_pic)" "true"
86GRT_FLAGS+=$(PIC_FLAGS)
87endif
88
89WARN_CFLAGS=-Wall
90
91GNAT_BARGS=-bargs -E
92
93# Warnings as errors.  Comment this line if a warning looks not valid.
94ifeq "$(enable_werror)" "true"
95GNATFLAGS+=-gnatwe
96endif
97
98target=$(build)
99#target=i686-pc-linux-gnu
100#target=x86_64-pc-linux-gnu
101#target=i686-apple-darwin
102#target=x86_64-apple-darwin
103#target=i386-pc-mingw32
104
105ifeq ($(SOEXT),.so)
106SHLIB_FLAGS=-Wl,-soname,$@
107else ifeq ($(SOEXT),.dll)
108SHLIB_FLAGS=
109else ifeq ($(SOEXT),.dylib)
110# Allow the use of -rpath in executable
111SHLIB_FLAGS=-Wl,-install_name,@rpath/$@
112endif
113
114# Flags for libraries
115LIBSRC_DIR:=$(srcdir)/libraries
116LIBDST_DIR:=$(libdirsuffix)
117
118LIBVHDL_FLAGS_TO_PASS=\
119 LIBSRC_DIR="$(LIBSRC_DIR)" \
120 LIBDST_DIR="$(LIBDST_DIR)" \
121 enable_gplcompat="$(enable_gplcompat)" \
122 LN="$(LN)" CP="$(CP)" MKDIR="$(MKDIR)"
123
124# Object files from grt for the synthesis.
125GRT_SYNTH_OBJS=grt-cstdio.o
126
127all: Makefile all.$(backend) all.libghdl
128
129install: install.$(backend)
130#       Generate std.standard package VHDL source
131	$(DESTDIR)$(bindir)/ghdl$(EXEEXT) --disp-standard --std=87 > $(DESTDIR)$(VHDL_LIB_DIR)/src/std/v87/standard.vhdl
132	$(DESTDIR)$(bindir)/ghdl$(EXEEXT) --disp-standard --std=93 > $(DESTDIR)$(VHDL_LIB_DIR)/src/std/v93/standard.vhdl
133	$(DESTDIR)$(bindir)/ghdl$(EXEEXT) --disp-standard --std=08 > $(DESTDIR)$(VHDL_LIB_DIR)/src/std/v08/standard.vhdl
134
135uninstall: uninstall.$(backend)
136
137test: test.$(backend)
138
139copy-sources: copy-sources.$(backend)
140
141libs: libs.vhdl.$(backend)
142
143./config.status: $(srcdir)/configure
144	@if [ -e $@ ]; then \
145	  echo "./config.status --reconfigure"; \
146	  ./config.status --reconfigure; \
147	else \
148	  echo "config.status is lost, please configure manually" ; \
149	  exit 1; \
150	fi
151
152Makefile: $(srcdir)/Makefile.in ./config.status
153	./config.status
154
155setup.py: $(srcdir)/setup.py.in ./config.status
156	./config.status
157
158GHDL_COMMON_INCFLAGS=-aI$(srcdir)/src -aI$(srcdir)/src/vhdl -aI$(srcdir)/src/synth -aI$(srcdir)/src/grt -aI$(srcdir)/src/psl -aI$(srcdir)/src/vhdl/translate
159
160GRTSRCDIR=$(abs_srcdir)/src/grt
161include $(srcdir)/src/grt/Makefile.inc
162
163version.tmp: $(srcdir)/src/version.in force
164#	Create version.tmp from version.in, using git date/hash, or envvars.
165	GHDL_VER_DESC=$${GHDL_VER_DESC:-tarball}; \
166	GHDL_VER_REF=$${GHDL_VER_REF:-unknown}; \
167	GHDL_VER_HASH=$${GHDL_VER_HASH:-unknown}; \
168	if test -d $(srcdir)/.git && desc=`cd $(srcdir); git describe --dirty --long`; then \
169	  GHDL_VER_DESC=`echo $$desc | sed -e 's/\([^-]*-g\)/r\1/' -e 's/-/./g' -e 's/^v//g'`; \
170	  GHDL_VER_REF=`cd $(srcdir); git rev-parse --abbrev-ref HEAD`; \
171	  GHDL_VER_HASH=`cd $(srcdir); git rev-parse HEAD`; \
172	fi; \
173	sed \
174	  -e "s#@VER@#$(ghdl_version)#" \
175	  -e "s#@DESC@#$${GHDL_VER_DESC}#" \
176	  -e "s#@REF@#$${GHDL_VER_REF}#" \
177	  -e "s#@HASH@#$${GHDL_VER_HASH}#" \
178	  < $< > $@;
179
180version.ads: version.tmp
181#	Change version.ads only if version.tmp has been modified to avoid
182#	useless rebuild.
183	if [ ! -r $@ ] || ! cmp $< $@ > /dev/null; then $(CP) $< $@; fi
184
185#################### For mcode backend ##############################
186
187all.mcode: ghdl_mcode$(EXEEXT) libs.vhdl.mcode all.vpi
188
189GHDL_MCODE_INCFLAGS=$(GHDL_COMMON_INCFLAGS) -aI$(srcdir)/src/ghdldrv -aI$(srcdir)/src/ortho -aI$(srcdir)/src/ortho/mcode -aI$(srcdir)/src/synth
190
191ghdl_mcode$(EXEEXT): GRT_FLAGS+=-DWITH_GNAT_RUN_TIME
192ghdl_mcode$(EXEEXT): $(GRT_ADD_OBJS) $(GRT_SRC_DEPS) $(ORTHO_DEPS) \
193            memsegs_c.o chkstk.o version.ads force
194	$(GNATMAKE) -o $@ -gnat12 $(GHDL_MCODE_INCFLAGS) $(GNATFLAGS) -gnatw.A ghdl_jit.adb $(GNAT_BARGS) -largs memsegs_c.o chkstk.o $(GRT_ADD_OBJS) $(LDFLAGS) $(GNAT_LARGS) $(subst @,$(GRTSRCDIR),$(GRT_EXTRA_LIB) $(GRT_EXEC_OPTS))
195
196memsegs_c.o: $(srcdir)/src/ortho/mcode/memsegs_c.c
197	$(CC) -c $(OPT_FLAGS) -o $@ $<
198
199libs.vhdl.mcode: ghdl_mcode$(EXEEXT)
200	$(MAKE) -f $(srcdir)/libraries/Makefile.inc $(LIBVHDL_FLAGS_TO_PASS) GHDL=$(PWD)/ghdl_mcode$(EXEEXT) GHDL_FLAGS="" VHDL_COPY_OBJS=no vhdl.libs.all
201
202install.mcode.program: install.dirs ghdl_mcode$(EXEEXT)
203	$(INSTALL_PROGRAM) ghdl_mcode$(EXEEXT) $(DESTDIR)$(bindir)/ghdl$(EXEEXT)
204
205uninstall.mcode.program:
206	$(RM) $(DESTDIR)$(bindir)/ghdl$(EXEEXT)
207
208install.mcode: install.mcode.program install.vhdllib install.vpi install.libghdl
209
210uninstall.mcode: uninstall.mcode.program uninstall.vhdllib uninstall.vpi uninstall.libghdl
211
212test.mcode: ghdl_mcode$(EXEEXT)
213	cd $(srcdir)/testsuite; GHDL=$(CURDIR)/ghdl_mcode$(EXEEXT) ./testsuite.sh
214
215oread-mcode$(EXEEXT): force
216	$(MAKE) -f $(srcdir)/src/ortho/mcode/Makefile \
217	 ortho_srcdir=$(srcdir)/src/ortho ortho_exec=$@ \
218	 GNATFLAGS="-aI$(srcdir)/src/ortho/oread $(GNATFLAGS)" all
219
220#################### For gcc backend ##############################
221
222gcc_vhdl_dir=$(gcc_src_dir)/gcc/vhdl
223
224all.gcc:
225	@echo "For installing sources in gcc, do:"
226	@echo "1) $(MAKE) copy-sources"
227	@echo "2) configure, build and install gcc"
228	@echo "3) $(MAKE) ghdllib"
229	@echo "4) $(MAKE) install"
230
231copy-sources.gcc: version.ads
232	$(RM) -rf $(gcc_vhdl_dir)
233	$(MKDIR) $(gcc_vhdl_dir)
234	$(CP) -p version.ads ghdlsynth_maybe.ads $(gcc_vhdl_dir)
235	$(CP) -p $(srcdir)/src/*.ad? $(gcc_vhdl_dir)
236	$(CP) -p $(srcdir)/src/vhdl/*.ad? $(gcc_vhdl_dir)
237	$(CP) -p $(srcdir)/src/vhdl/translate/*.ad? $(gcc_vhdl_dir)
238	$(CP) -p $(srcdir)/src/synth/*.ad? $(gcc_vhdl_dir)
239	$(CP) -p $(srcdir)/src/psl/*.ad? $(gcc_vhdl_dir)
240	$(CP) -p $(srcdir)/src/grt/grt.ad? $(gcc_vhdl_dir)
241	$(CP) -p $(srcdir)/src/grt/grt-types.ads $(gcc_vhdl_dir)
242	$(CP) -p $(srcdir)/src/grt/grt-c.ad? $(gcc_vhdl_dir)
243	$(CP) -p $(srcdir)/src/grt/grt-fcvt.ad? $(gcc_vhdl_dir)
244	$(CP) -p $(srcdir)/src/grt/grt-algos.ad? $(gcc_vhdl_dir)
245	$(CP) -p $(srcdir)/src/grt/grt-vstrings.ad? $(gcc_vhdl_dir)
246	$(CP) -p $(srcdir)/src/grt/grt-cstdio.c $(gcc_vhdl_dir)
247	$(CP) -p $(srcdir)/src/grt/grt-stdio.ad? $(gcc_vhdl_dir)
248	$(CP) -p $(srcdir)/src/grt/grt-table.ad? $(gcc_vhdl_dir)
249	$(CP) -p $(srcdir)/src/grt/grt-files_operations.ad? $(gcc_vhdl_dir)
250	$(CP) -p $(srcdir)/src/grt/grt-to_strings.ad? $(gcc_vhdl_dir)
251	$(CP) -p $(srcdir)/src/grt/grt-severity.ads $(gcc_vhdl_dir)
252	$(CP) -p $(srcdir)/src/ortho/*.ad? $(gcc_vhdl_dir)
253	$(CP) -p $(srcdir)/src/ortho/gcc/*.ad? $(gcc_vhdl_dir)
254	$(CP) -p $(srcdir)/src/ortho/gcc/*.c $(gcc_vhdl_dir)
255	$(CP) -p $(srcdir)/src/ortho/gcc/*.opt $(gcc_vhdl_dir)
256	base_ver=`cat $(gcc_src_dir)/gcc/BASE-VER`; \
257	case $$base_ver in \
258	 4.9*)     gcc_ortho_lang=ortho-lang-49.c ;; \
259	 5.*)      gcc_ortho_lang=ortho-lang-5.c ;; \
260	 6 | 6.*)  gcc_ortho_lang=ortho-lang-6.c ;; \
261	 7.*)      gcc_ortho_lang=ortho-lang-7.c ;; \
262	 8.*)      gcc_ortho_lang=ortho-lang-8.c ;; \
263	 9.*)      gcc_ortho_lang=ortho-lang-9.c ;; \
264	 10.*)     gcc_ortho_lang=ortho-lang-9.c ;; \
265	 *) echo "Mismatch gcc version from $(gcc_src_dir)"; \
266	    echo "Need gcc version 4.9.x, 5.x, 6.x, 7.x, 8.x, 9.x or 10.x"; \
267	    exit 1 ;; \
268	esac; \
269	$(CP) -p $(srcdir)/src/ortho/gcc/$$gcc_ortho_lang \
270	  $(gcc_vhdl_dir)/ortho-lang.c
271	$(CP) -p $(srcdir)/doc/ghdl.texi $(srcdir)/doc/ghdl.1 $(gcc_vhdl_dir)
272	$(MKDIR) $(gcc_vhdl_dir)/ghdldrv
273	$(CP) -pR $(srcdir)/src/ghdldrv/*.ad? $(gcc_vhdl_dir)/ghdldrv
274	$(CP) -p $(srcdir)/scripts/gcc/Make-lang.in $(gcc_vhdl_dir)
275	$(CP) -p $(srcdir)/scripts/gcc/config-lang.in $(gcc_vhdl_dir)
276	$(CP) -p $(srcdir)/scripts/gcc/lang-options.h $(gcc_vhdl_dir)
277	$(CP) -p $(srcdir)/scripts/gcc/lang-specs.h $(gcc_vhdl_dir)
278
279# To build vhdl libs using a non-installed ghdl, define GHDL_GCC_BIN to the
280# path of ghdl and GHDL1_GCC_BIN to path of ghdl1
281GHDL_GCC_BIN=$(DESTDIR)$(bindir)/ghdl$(EXEEXT)
282GHDL1_GCC_BIN=  # --GHDL1=/path/to/ghdl1
283
284libs.vhdl.gcc:
285	$(MAKE) -f $(srcdir)/libraries/Makefile.inc $(LIBVHDL_FLAGS_TO_PASS) GHDL="$(GHDL_GCC_BIN)" GHDL_FLAGS="$(GHDL1_GCC_BIN) $(LIB_CFLAGS)" vhdl.libs.all libs.vhdl.standard
286
287ghdllib: libs.vhdl.gcc $(libdirsuffix)/libgrt.a all.libghdl
288
289install.gcc: install.vhdllib install.grt install.vpi install.libghdl
290
291uninstall.gcc: uninstall.vhdllib uninstall.grt uninstall.vpi uninstall.libghdl
292
293test.gcc:
294	cd $(srcdir)/testsuite; GHDL=$(GHDL_GCC_BIN) ./testsuite.sh
295
296#################### For gcc backend - development only (local build) ####
297
298GHDL_GCC_INCFLAGS=$(GHDL_COMMON_INCFLAGS)
299
300ghdl1-gcc$(EXEEXT): version.ads force
301	$(MAKE) -f $(srcdir)/src/ortho/gcc/Makefile \
302	 ortho_srcdir=$(srcdir)/src/ortho ortho_exec=$@ \
303	 GNATFLAGS="$(GHDL_GCC_INCFLAGS) $(GNATFLAGS)" all
304
305ghdl_gcc$(EXEEXT): version.ads $(GRT_SYNTH_OBJS) force
306	$(GNATMAKE) $(GHDL_GCC_INCFLAGS) -aI$(srcdir)/src/ghdldrv \
307	 $(GNATFLAGS) ghdl_gcc $(GNAT_BARGS) \
308         -largs $(GRT_SYNTH_OBJS) $(GNAT_LARGS)
309
310libs.vhdl.local_gcc: ghdl_gcc$(EXEEXT) ghdl1-gcc$(EXEEXT)
311	$(MAKE) -f $(srcdir)/libraries/Makefile.inc $(LIBVHDL_FLAGS_TO_PASS) GHDL=$(PWD)/ghdl_gcc$(EXEEXT) GHDL_FLAGS="--GHDL1=$(PWD)/ghdl1-gcc$(EXEEXT) $(LIB_CFLAGS)" vhdl.libs.all libs.vhdl.standard
312
313ghdl1-debug$(EXEEXT): version.ads force
314	$(MAKE) -f $(srcdir)/src/ortho/debug/Makefile \
315	 ortho_srcdir=$(srcdir)/src/ortho ortho_exec=$@ \
316	 GNATFLAGS="$(GHDL_GCC_INCFLAGS) $(GNATFLAGS)" \
317	 GNATMAKE="$(GNATMAKE)" all
318
319oread-gcc$(EXEEXT): force
320	$(MAKE) -f $(srcdir)/src/ortho/gcc/Makefile \
321	 ortho_srcdir=$(srcdir)/src/ortho ortho_exec=$@ \
322	 GNATFLAGS="-aI$(srcdir)/src/ortho/oread $(GNATFLAGS)" all
323
324#################### For llvm backend ##############################
325
326GHDL_LLVM_INCFLAGS=$(GHDL_COMMON_INCFLAGS) -aI$(srcdir)/src/ghdldrv -aI$(srcdir)/src/ortho -aI$(srcdir)/src/ortho/$(llvm_be) -aI$(srcdir)/src/synth
327
328all.llvm: ghdl1-llvm$(EXEEXT) ghdl_llvm$(EXEEXT) grt-all libs.vhdl.llvm all.vpi
329
330all.llvm_jit: ghdl_llvm_jit$(EXEEXT)
331
332ghdl_llvm_jit$(EXEEXT): GRT_FLAGS+=-DWITH_GNAT_RUN_TIME
333ghdl_llvm_jit$(EXEEXT): $(GRT_ADD_OBJS) $(GRT_SRC_DEPS) $(ORTHO_DEPS) \
334               llvm-cbindings.o version.ads force
335	$(GNATMAKE) -o $@ $(GHDL_LLVM_INCFLAGS) $(GNATFLAGS) ghdl_jit.adb \
336	 $(GNAT_BARGS) -largs llvm-cbindings.o $(GNAT_LARGS) $(GRT_ADD_OBJS) \
337	 $(subst @,$(GRTSRCDIR),$(GRT_EXTRA_LIB)) --LINK=$(CXX) \
338	 `$(LLVM_CONFIG) --ldflags --libs --system-libs` $(LDFLAGS)
339
340llvm-cbindings.o: $(srcdir)/src/ortho/$(llvm_be)/llvm-cbindings.cpp
341	$(CXX) -c `$(LLVM_CONFIG) --includedir --cxxflags` \
342	  $(OPT_FLAGS) -o $@ $<
343
344libs.vhdl.llvmjit: ghdl_llvm_jit$(EXEEXT)
345	$(MAKE) -f $(srcdir)/libraries/Makefile.inc $(LIBVHDL_FLAGS_TO_PASS) GHDL=$(PWD)/ghdl_llvm$(EXEEXT) GHDL_FLAGS="" VHDLLIBS_COPY_OBJS=no vhdl.libs.all
346
347libs.vhdl.llvm: ghdl_llvm$(EXEEXT) ghdl1-llvm$(EXEEXT)
348	$(MAKE) -f $(srcdir)/libraries/Makefile.inc $(LIBVHDL_FLAGS_TO_PASS) GHDL=$(PWD)/ghdl_llvm$(EXEEXT) GHDL_FLAGS="--GHDL1=$(PWD)/ghdl1-llvm$(EXEEXT) $(LIB_CFLAGS)" vhdl.libs.all libs.vhdl.standard
349
350libs.vhdl.debug-llvm: ghdl_llvm$(EXEEXT) ghdl1-debug$(EXEEXT)
351	$(MAKE) -f $(srcdir)/libraries/Makefile.inc $(LIBVHDL_FLAGS_TO_PASS) GHDL=$(PWD)/ghdl_llvm$(EXEEXT) GHDL_FLAGS="--GHDL1=$(PWD)/ghdl1-debug$(EXEEXT) $(LIB_CFLAGS)" vhdl.libs.all libs.vhdl.standard
352
353ghdl_llvm$(EXEEXT): version.ads $(GRT_SYNTH_OBJS) force
354	$(GNATMAKE) $(GHDL_LLVM_INCFLAGS) \
355         -aI$(srcdir)/src/ghdldrv $(GNATFLAGS) \
356	 ghdl_llvm $(GNAT_BARGS) \
357         -largs $(LDFLAGS) $(GRT_SYNTH_OBJS) $(GNAT_LARGS)
358
359ghdl1-llvm$(EXEEXT): version.ads force
360	$(MAKE) -f $(srcdir)/src/ortho/$(llvm_be)/Makefile \
361	 ortho_srcdir=$(srcdir)/src/ortho ortho_exec=$@ \
362	 GNATFLAGS="$(GHDL_LLVM_INCFLAGS) $(GNATFLAGS)" LDFLAGS="$(LDFLAGS)" \
363	 LLVM_CONFIG="$(LLVM_CONFIG)" CXX="$(CXX)" \
364	 CFLAGS="$(WARN_FLAGS) $(OPT_FLAGS)" \
365	 GNATMAKE="$(GNATMAKE)" all
366
367oread-llvm$(EXEEXT): force
368	$(MAKE) -f $(srcdir)/src/ortho/$(llvm_be)/Makefile \
369	 ortho_srcdir=$(srcdir)/src/ortho ortho_exec=$@ \
370	 GNATMAKE="$(GNATMAKE)" \
371	 GNATFLAGS="-aI$(srcdir)/src/ortho/oread $(GNATFLAGS)" \
372	 LLVM_CONFIG="$(LLVM_CONFIG)" CXX="$(CXX)"
373
374install.llvm.program: install.dirs ghdl1-llvm$(EXEEXT) ghdl_llvm$(EXEEXT)
375	$(INSTALL_PROGRAM) ghdl_llvm$(EXEEXT) $(DESTDIR)$(bindir)/ghdl$(EXEEXT)
376	$(INSTALL_PROGRAM) ghdl1-llvm$(EXEEXT) $(DESTDIR)$(bindir)/ghdl1-llvm$(EXEEXT)
377
378test.llvm: ghdl_llvm$(EXEEXT)
379	cd $(srcdir)/testsuite; GHDL=$(CURDIR)/ghdl_llvm$(EXEEXT) ./testsuite.sh
380
381uninstall.llvm.program:
382	$(RM) $(DESTDIR)$(bindir)/ghdl1-llvm$(EXEEXT)
383	$(RM) $(DESTDIR)$(bindir)/ghdl$(EXEEXT)
384
385install.llvm: install.llvm.program install.vhdllib install.grt install.vpi install.libghdl
386
387uninstall.llvm: uninstall.llvm.program uninstall.vhdllib uninstall.grt uninstall.vpi uninstall.libghdl
388
389################ For simul (no code generation, interpretation) ##########
390
391GHDL_SIMUL_INCFLAGS=$(GHDL_COMMON_INCFLAGS) -aI$(srcdir)/src/ghdldrv -aI$(srcdir)/src/vhdl/simulate -aI$(srcdir)/src/synth
392
393ghdl_simul$(EXEEXT): $(GRT_ADD_OBJS) $(GRT_SRC_DEPS) version.ads force
394	$(GNATMAKE) $(GHDL_SIMUL_INCFLAGS) $(GNATFLAGS) -gnat12 ghdl_simul $(GNAT_BARGS) -largs $(GNAT_LARGS) $(GRT_ADD_OBJS) $(subst @,$(GRTSRCDIR),$(GRT_EXTRA_LIB))
395
396libs.vhdl.simul: ghdl_simul$(EXEEXT)
397	$(MAKE) -f $(srcdir)/libraries/Makefile.inc $(LIBVHDL_FLAGS_TO_PASS) GHDL=$(PWD)/ghdl_simul$(EXEEXT) GHDL_FLAGS="" VHDLLIBS_COPY_OBJS=no vhdl.libs.all
398
399install.simul.program: install.dirs ghdl_simul$(EXEEXT)
400	$(INSTALL_PROGRAM) ghdl_simul$(EXEEXT) $(DESTDIR)$(bindir)/ghdl$(EXEEXT)
401
402uninstall.simul.program:
403	$(RM) $(DESTDIR)$(bindir)/ghdl$(EXEEXT)
404
405install.simul: install.simul.program install.vhdllib
406
407uninstall.simul: uninstall.simul.program uninstall.vhdllib
408
409
410################ libghdl (library for the vhdl part) ####################
411
412LIBGHDL_INCFLAGS=$(GHDL_COMMON_INCFLAGS) -aI$(srcdir)/src/synth -aI$(srcdir)/src/vhdl/libghdl -aI$(srcdir)/src/ghdldrv
413
414libghdl_name=libghdl-$(libghdl_version)$(SOEXT)
415
416LIBGHDL_GRT_OBJS= pic/grt-cstdio.o
417
418$(libghdl_name): $(GRT_SRC_DEPS) $(LIBGHDL_GRT_OBJS) version.ads force
419#	Use -g for gnatlink so that the binder file is not removed.  We need
420#	it for libghdl.a
421	$(GNATMAKE) -I- -aI. -D pic -z libghdl -o $@ -gnat12 $(GNATFLAGS) $(PIC_FLAGS) $(LIBGHDL_INCFLAGS) -bargs -shared -Llibghdl_ -largs -g -shared $(SHLIB_FLAGS) $(LIBGHDL_GRT_OBJS)
422#       On windows, gnatmake (via Osint.Executable_Name) always appends .exe
423#       Adjust.  (Other solution: use gnatmake for compilation and binding,
424#       then use gnatlink directly for linking).
425ifeq ($(SOEXT),.dll)
426	-mv $(libghdl_name).exe $(libghdl_name)
427endif
428
429libghdl.a: $(libghdl_name)
430#	Also create a static library
431	sed -e '1,/--  BEGIN/d' -e '/--  END/,$$d' -e 's/^   --   //' < b~libghdl.adb > libghdl.bind
432	$(RM) -f $@
433	ar rc $@ b~libghdl.o $(LIBGHDL_GRT_OBJS) `sed -e /^-/d < libghdl.bind`
434	grep adalib libghdl.bind | sed -e 's/^-L//' -e 's@adalib/@adalib/libgnat.a@' > libghdl.link
435
436$(srcdir)/src/synth/ghdlsynth_gates.h: $(srcdir)/src/synth/netlists.ads $(srcdir)/src/synth/netlists-gates.ads
437	echo "/* DO NOT MODIFY" > $@
438	echo "   This file is automatically generated by Makefile.  */" >> $@
439	echo "enum Module_Id {" >> $@
440	grep -h "constant Module_Id :=" $^ | sed -e '/constant Module_Id :=/s/:.*://' -e 's/;/,/' -e 's/ *--.*//' >> $@
441	echo "};" >> $@
442	echo "" >> $@
443	echo "enum Param_Type {" >> $@
444	grep '      Param_' $(srcdir)/src/synth/netlists.ads >> $@
445	echo "};" >> $@
446
447all.libghdl.true: $(libghdl_name) libghdl.a
448all.libghdl.false:
449all.libghdl: all.libghdl.$(enable_libghdl)
450
451install.libghdl.include: install.dirs $(srcdir)/src/synth/ghdlsynth_gates.h
452	$(INSTALL_DATA) -p $(srcdir)/src/synth/ghdlsynth.h $(DESTDIR)$(incdir)/
453	$(INSTALL_DATA) -p $(srcdir)/src/synth/ghdlsynth_gates.h $(DESTDIR)$(incdir)/
454
455install.libghdl.lib:
456	$(INSTALL_PROGRAM) -p $(libghdl_name) $(DESTDIR)$(libdir)/
457	$(INSTALL_PROGRAM) -p libghdl.a $(DESTDIR)$(libdir)/
458	$(INSTALL_DATA) -p libghdl.link $(DESTDIR)$(libdir)/
459
460install.libghdl.true: install.libghdl.lib install.libghdl.include
461
462install.libghdl.false:
463install.libghdl: install.libghdl.$(enable_libghdl)
464
465uninstall.libghdl:
466	$(RM) $(DESTDIR)$(libdir)/$(libghdl_name)
467
468libghdl-py.tgz:
469	[ -d pythonb ] || $(MKDIR) pythonb
470	$(CP) -r $(srcdir)/pyGHDL/libghdl $(srcdir)/setup.py pythonb
471	tar -zcvf $@ -C pythonb .
472
473################ ghwdump #################################################
474
475GHWDUMP_OBJS=ghwdump.o ghwlib.o
476
477ghwdump: $(GHWDUMP_OBJS)
478	$(CC) -o $@ $(GHWDUMP_OBJS)
479
480ghwdump.o: $(srcdir)/src/grt/ghwdump.c $(srcdir)/src/grt/ghwlib.h
481	$(CC) -c -o $@ $< $(OPT_FLAGS) $(WARN_CFLAGS)
482
483ghwlib.o: $(srcdir)/src/grt/ghwlib.c $(srcdir)/src/grt/ghwlib.h
484	$(CC) -c -o $@ $< $(OPT_FLAGS) $(WARN_CFLAGS)
485
486############### grt #####################################################
487
488install.grt: \
489  $(libdirsuffix)/libgrt.a \
490  $(libdirsuffix)/grt.lst \
491  $(libdirsuffix)/grt-exec.lst \
492  $(libdirsuffix)/grt-shared.lst \
493  install.dirs
494	$(INSTALL_DATA) $(libdirsuffix)/libgrt.a $(DESTDIR)$(VHDL_LIB_DIR)/libgrt.a
495	$(INSTALL_DATA) $(libdirsuffix)/grt.lst $(DESTDIR)$(VHDL_LIB_DIR)/grt.lst
496	$(INSTALL_DATA) $(libdirsuffix)/grt-exec.lst $(DESTDIR)$(VHDL_LIB_DIR)/grt-exec.lst
497	$(INSTALL_DATA) $(libdirsuffix)/grt-shared.lst $(DESTDIR)$(VHDL_LIB_DIR)/grt-shared.lst
498	$(INSTALL_DATA) $(GRTSRCDIR)/grt.ver $(DESTDIR)$(VHDL_LIB_DIR)/grt.ver
499	test "x$(LIBBACKTRACE)" = x || test "x$(backend)" = xgcc || \
500	  $(INSTALL_DATA) $(LIBBACKTRACE) $(DESTDIR)$(VHDL_LIB_DIR)/libbacktrace.a
501
502uninstall.grt:
503	$(RM) $(DESTDIR)$(VHDL_LIB_DIR)/libgrt.a
504	$(RM) $(DESTDIR)$(VHDL_LIB_DIR)/grt.lst
505	$(RM) $(DESTDIR)$(VHDL_LIB_DIR)/grt-exec.lst
506	$(RM) $(DESTDIR)$(VHDL_LIB_DIR)/grt-shared.lst
507	$(RM) $(DESTDIR)$(VHDL_LIB_DIR)/grt.ver
508	$(RM) $(DESTDIR)$(VHDL_LIB_DIR)/libbacktrace.a
509
510################ VPI #####################################################
511
512vpi_thunk.o: $(GRTSRCDIR)/vpi_thunk.c $(GRTSRCDIR)/vpi_thunk.h
513#	Do not use OPT_FLAGS (do not enable coverage)
514	$(CC) -c -o $@ $< $(PIC_FLAGS) -O $(WARN_CFLAGS)
515
516libghdlvpi$(SOEXT): vpi_thunk.o
517	$(CC) -o $@ $< -shared $(SHLIB_FLAGS)
518
519all.vpi: libghdlvpi$(SOEXT)
520
521install.vpi: all.vpi install.dirs
522	$(INSTALL_PROGRAM) -p libghdlvpi$(SOEXT) $(DESTDIR)$(libdir)/
523	$(INSTALL_DATA) -p $(GRTSRCDIR)/vpi_user.h $(DESTDIR)$(incdir)/
524
525uninstall.vpi:
526	$(RM) -f $(DESTDIR)$(libdir)/libghdlvpi$(SOEXT)
527	$(RM) -f $(DESTDIR)$(incdir)/vpi_user.h
528
529install.vpi.local: all.vpi
530	$(MKDIR) -p include lib
531	$(INSTALL_DATA) -p $(GRTSRCDIR)/vpi_user.h include/
532	$(INSTALL_PROGRAM) -p libghdlvpi$(SOEXT) lib/
533
534################ Libraries ###############################################
535
536VHDLLIB_SUBDIRS= \
537  ieee/v87 \
538  ieee/v93 \
539  ieee/v08 \
540  std/v87 \
541  std/v93 \
542  std/v08 \
543  src/ieee \
544  src/ieee/v87 \
545  src/ieee/v93 \
546  src/ieee2008 \
547  src/std \
548  src/std/v87 \
549  src/std/v93 \
550  src/std/v08 \
551  src/synopsys \
552  src/synopsys/v08 \
553  src/upf
554
555ifeq ($(enable_gplcompat),false)
556VHDLLIB_SUBDIRS+=src/vital95 src/vital2000
557endif
558
559install.dirs:
560#	Use -p to create parents and to avoid error if existing.
561	$(MKDIR) -p $(DESTDIR)$(prefix)
562	$(MKDIR) -p $(DESTDIR)$(bindir)
563	$(MKDIR) -p $(DESTDIR)$(libdir)
564	$(MKDIR) -p $(DESTDIR)$(prefix)/$(libdirsuffix)
565	$(MKDIR) -p $(DESTDIR)$(incdir)
566
567install.vhdllib: install.dirs
568#	Libraries (only if not empty)
569	for d in $(VHDLLIB_SUBDIRS); do \
570	  $(MKDIR) -p $(DESTDIR)$(VHDL_LIB_DIR)/$$d; \
571	  $(INSTALL_DATA) -p \
572	    $(LIBDST_DIR)/$$d/* $(DESTDIR)$(VHDL_LIB_DIR)/$$d; \
573	done
574#	ANSI color
575	$(INSTALL_DATA) -p \
576	    $(srcdir)/scripts/ansi_color.sh $(DESTDIR)$(VHDL_LIB_DIR)/;
577#	Vendors scripts
578	$(MKDIR) -p $(DESTDIR)$(VHDL_LIB_DIR)/vendors
579	$(INSTALL_DATA) -p \
580	    $(srcdir)/scripts/vendors/* $(DESTDIR)$(VHDL_LIB_DIR)/vendors/
581	$(INSTALL_PROGRAM) -p \
582	    $(srcdir)/scripts/vendors/*.sh $(DESTDIR)$(VHDL_LIB_DIR)/vendors/
583
584uninstall.vhdllib:
585	$(RM) -rf $(DESTDIR)$(VHDL_LIB_DIR)
586
587####################### clean ############################################
588
589clean: force
590	$(RM) -f *.o *.ali b~*.ad? *~ *.d b__*.ad? *.a *.so *.deps *.bexch version.* *.dll *.dylib
591	$(RM) -f ghdl_gcc$(EXEEXT) ghdl_mcode$(EXEEXT) ghdl$(EXEEXT) ghdl_llvm$(EXEEXT) ghdl_llvm_jit$(EXEEXT) ghdl_simul$(EXEEXT)
592	$(RM) -f ghdl1-gcc$(EXEEXT) ghdl1-llvm$(EXEEXT) ghdl1-debug$(EXEEXT)
593	$(RM) -f grt/run-bind.ad? grt.lst grt/grt-files grt/grt-files.in
594	$(RM) -f grt/*.o grt/*.ali
595	$(RM) -rf lib
596	$(MAKE) create-dirs
597
598distclean: clean
599	$(RM) -f default_paths.ads ortho_code-x86-flags.ads
600	$(RM) -f grt/grt-backtrace-impl.ads
601	$(RM) -f Makefile config.status ghdl.gpr
602
603clean-c: force
604	$(RM) -f memsegs_c.o chkstk.o jumps.o times.o
605	$(RM) -f grt-cstdio.o grt-cgnatrts.o grt-modules.o
606	$(RM) -f grt-cvpi.o grt-cdynload.o
607	$(RM) -f fstapi.o fastlz.o lz4.o
608	$(RM) -f pic/times.o pic/grt-cvpi.o pic/jumps.o
609	$(RM) -f pic/grt-cstdio.o pic/grt-cgnatrts.o pic/grt-modules.o
610	$(RM) -f pic/grt-cdynload.o
611
612create-dirs: force
613	for d in $(VHDLLIB_SUBDIRS); do \
614	  $(MKDIR) -p $(LIBDST_DIR)/$$d; \
615	done
616
617# Remove non GPL compatible source files
618clean-pure-gpl:
619#       Vital libraries aren't GPL compatible
620	$(RM) -rf libraries/vital95 libraries/vital2000
621#	The GNA testsuite contains open-source reproducer that may not be GPL.
622	$(RM) -rf testsuite/gna
623
624force:
625
626.PHONY: force clean distclean clean-c clean-pure-gpl
627
628# Most of the compilation is done through gnatmake, so using make -jX it not
629# very effective.
630# Hint: for parallel build use: make GNATMAKE="gnatmake -j8"
631# Parallel builds may fail with the llvm backend as it can start two gnatmake
632# in parallel: one for ghdl_llvm and the other for ghdl1-llvm. But they
633# share the same objects.
634# Any better fix is welcome!
635.NOTPARALLEL:
636