First Commit of my working state
[simh.git] / Makefile
CommitLineData
196ba1fc
PH
1#
2# Makefile for SIMH 3.8
3#
4# Philipp Hachtmann
5#
6
7# 01-OCT-08 PH Added spaces after "-o" option to gcc
8# 19-SEP-08 PH Initial version
9#
10
11################################################################################
12
13# Find out something about the system we build for.
14# This process is ugly and should be revisited!
15
16BUILD=linux
17
18ifneq ($(WIN32),)
19 BUILD=win32
20endif
21
22ifneq (,$(findstring solaris,$(OSTYPE)))
23 BUILD=solaris
24endif
25
26ifneq (,$(findstring darwin,$(OSTYPE)))
27 BUILD=darwin
28endif
29
30
31################################################################################
32
33# Set build options according to what we found out about the build platform
34
35ifeq ($(BUILD),win32)
36 CC = gcc
37 LDFLAGS = -lm -lwsock32 -lwinmm
38 CFLAGS=-std=c99 -U__STRICT_ANSI__ -O2 -I. -Wall
39 EXEC_SUFFIX = .exe
40endif
41
42ifeq ($(BUILD),solaris)
43 CC=gcc
44 CFLAGS=-D_GNU_SOURCE
45 LDFLAGS=-lm -lsocket -lnsl -lrt -lpthread
46endif
47
48ifeq ($(BUILD),darwin)
49 CC=gcc
50 CFLAGS = -D_GNU_SOURCE -O3
51 LDFLAGS=
52endif
53
54ifeq ($(BUILD),linux)
55 CC=gcc
56 CFLAGS = -D_GNU_SOURCE -O3 -std=c99 -U__STRICT_ANSI__ -g
57 LDFLAGS+= -lrt -lm
58 HAVE_READLINE=true
59 READLINE_SAVED_HISTORY=true
60endif
61
62
63################################################################################
64
65# Add network definitions etc if desired
66
67ifneq ($(USE_NETWORK),)
68 CFLAGS+=-DUSE_NETWORK
69 LDFLAGS+=-lwpcap -lpacket
70endif
71
72ifneq ($(HAVE_READLINE),)
73 READLINE_CFLAGS += -DHAVE_READLINE
74 READLINE_LDFLAGS += -lreadline
75 ifneq ($(READLINE_SAVED_HISTORY),)
76 READLINE_CFLAGS += -DREADLINE_SAVED_HISTORY
77 endif
78endif
79
80################################################################################
81
82# Other stuff to add to CFLAGS and LDFLAGS
83
84CFLAGS+=-I $(COMMON_DIR)
85LDFLAGS+=
86
87
88################################################################################
89
90# Target directory where the executables go to.
91# The directory is automatically created if it doesn't exist.
92TARGET_DIR=bin
93
94# This makes the target directory go away with "make clean":
95CLEANSTUFF+=$(TARGET_DIR)
96
97
98################################################################################
99################################################################################
100
101# This is the main section containing all the simulator dependent information.
102
103
104
105################################################################################
106#
107# Global stuff.
108#
109
110# The "normal" common modules
111SIM_NAMES+=COMMON
112COMMON_DIR=.
113COMMON_MODULES=scp sim_console sim_fio sim_timer sim_sock sim_tmxr\
114 sim_ether sim_tape sim_readline
115COMMON_CFLAGS+=$(READLINE_CFLAGS)
116LDFLAGS+=$(READLINE_LDFLAGS)
117
118# The common modules with -DUSE_INT64
119SIM_NAMES+=COMMON_INT64
120COMMON_INT64_SRC_DIR=$(COMMON_SRC_DIR)
121COMMON_INT64_OBJ_DIR=common_int64
122COMMON_INT64_MODULES=$(COMMON_MODULES)
123COMMON_INT64_CFLAGS+=$(READLINE_CFLAGS)
124COMMON_INT64_CFLAGS+=-DUSE_INT64
125
126# The common modules with -DUSE_INT64 and -DUSE_ADDR64
127SIM_NAMES+=COMMON_INT64_ADDR64
128COMMON_INT64_ADDR64_SRC_DIR=$(COMMON_SRC_DIR)
129COMMON_INT64_ADDR64_OBJ_DIR=common_int64_addr64
130COMMON_INT64_ADDR64_MODULES=$(COMMON_MODULES)
131COMMON_INT64_ADDR64_CFLAGS+=$(READLINE_CFLAGS)
132COMMON_INT64_ADDR64_CFLAGS+=-DUSE_INT64 -DUSE_ADDR64
133
134
135################################################################################
136#
137# Data General Nova
138#
139
140SIM_NAMES+=NOVA
141NOVA_DIR=NOVA
142NOVA_EXEC=nova
143NOVA_MODULES= nova_sys nova_cpu nova_dkp nova_dsk nova_lp nova_mta \
144 nova_plt nova_pt nova_clk nova_tt nova_tt1 nova_qty
145NOVA_EXTRA_OBJS+=$(COMMON_OBJS)
146NOVA_EXTRA_DEPS+=$(COMMON_SRC_DIR)/*.h
147
148
149
150################################################################################
151#
152# Data General Eclipse
153#
154
155# What happens:
156#
157# The Makefile uses all items in SIM_NAMES to call the OBJECT_COLLECT_TEMPLATE
158# sequentially. This macro uses the sim name (e.g. ECLIPSE) as prefix for
159# the variables it is working on.
160# It looks if there's a ..._SRC_DIR and ..._OBJ_DIR.
161# If not, it assigns both from ..._DIR.
162# So you can also specify a single source and object directory with ..._DIR.
163#
164# The template also builds a complete list of source files, ..._SOURCES.
165#
166# Then the OBJECT_RULE_TEMPLATE is expanded for all source files.
167# The current object file name is created from the source file name,
168# then added to the list of object files, ..._OBJS.
169# And, of course, the build rule for the object is output.
170# After the expansion of the OBJECT_RULE_TEMPLATE, the ..._EXTRA_OBJS
171# are added to the ..._OBJs list.
172#
173# There's another template, PROGRAM_TEMPLATE. It is called with all
174# SIM_NAMES as well. It generates the link rules for each application,
175# uses the ..._OBJS variable as input.
176# It also generates a "phony" target with the executable's stem,
177# to enable things like "make nova".
178# The application clean rules, like "novaclean", are also created by means
179# of this template.
180
181
182# This tells make to use the ECLIPSE_ variables.
183SIM_NAMES+=ECLIPSE
184
185# The program's source directory
186ECLIPSE_SRC_DIR=NOVA
187
188# Where the program's modules go to
189ECLIPSE_OBJ_DIR=eclipse
190
191# Because the OBJ_DIR is no SRC_DIR, we will add it to the list of items
192# to delete with "make clean".
193CLEANSTUFF+=$(ECLIPSE_OBJ_DIR)
194
195# The executable name. Can be left out if only rules for object files should
196# be generated. The common parts leave this blank.
197ECLIPSE_EXEC=eclipse
198
199# The source file names without extension relative to the SRC_DIR
200# Other sources (relative to the current directory) can be added by means
201# of the EXTRA_MODULES variable (see PDP10)
202ECLIPSE_MODULES=eclipse_cpu eclipse_tt nova_sys nova_dkp nova_dsk nova_lp \
203 nova_mta nova_plt nova_pt nova_clk nova_tt1 nova_qty
204
205# The C compiler flags used to build the MODULES' and EXTRA_MODULES' object
206# files.
207ECLIPSE_CFLAGS=-DECLIPSE -DUSE_INT64
208
209# Objects that are defined in another program/collection. Must be the
210# object file names relative to the current directory,
211# for example "H316/h316_cpu.o".
212# Those object files are compiled by their own collection's rules!
213ECLIPSE_EXTRA_OBJS+=$(COMMON_INT64_OBJS)
214
215# Extra dependencies for the program's/collection's modules.
216ECLIPSE_EXTRA_DEPS+=$(COMMON_SRC_DIR)/*.h
217
218
219
220################################################################################
221#
222# DEC PDP-1
223#
224
225SIM_NAMES+=PDP1
226PDP1_DIR = PDP1
227PDP1_EXEC = pdp1
228PDP1_MODULES = pdp1_lp pdp1_cpu pdp1_stddev pdp1_sys pdp1_dt pdp1_drm \
229 pdp1_clk pdp1_dcs
230PDP1_EXTRA_OBJS+=$(COMMON_OBJS)
231PDP1__EXTRA_DEPS+=$(COMMON_SRC_DIR)/*.h
232
233
234
235################################################################################
236#
237# DEC PDP-4,7,9,15
238#
239
240PDP18_MODULES = pdp18b_dt pdp18b_drm pdp18b_cpu\
241 pdp18b_lp pdp18b_mt pdp18b_rf\
242 pdp18b_rp pdp18b_stddev pdp18b_sys\
243 pdp18b_rb pdp18b_tt1 pdp18b_fpp
244
245SIM_NAMES+=PDP4
246PDP4_SRC_DIR=PDP18B
247PDP4_OBJ_DIR=pdp4
248PDP4_EXEC=pdp4
249CLEANSTUFF+=$(PDP4_OBJ_DIR)
250PDP4_MODULES=$(PDP18_MODULES)
251PDP4_CFLAGS=-DPDP4
252PDP4_EXTRA_OBJS+=$(COMMON_OBJS)
253PDP4_EXTRA_DEPS+=$(COMMON_SRC_DIR)/*.h
254
255SIM_NAMES+=PDP7
256PDP7_SRC_DIR=PDP18B
257PDP7_OBJ_DIR=pdp7
258PDP7_EXEC=pdp7
259CLEANSTUFF+=$(PDP7_OBJ_DIR)
260PDP7_MODULES=$(PDP18_MODULES)
261PDP7_CFLAGS=-DPDP7
262PDP7_EXTRA_OBJS+=$(COMMON_OBJS)
263PDP7_EXTRA_DEPS+=$(COMMON_SRC_DIR)/*.h
264
265SIM_NAMES+=PDP9
266PDP9_SRC_DIR=PDP18B
267PDP9_OBJ_DIR=pdp9
268PDP9_EXEC=pdp9
269CLEANSTUFF+=$(PDP9_OBJ_DIR)
270PDP9_MODULES=$(PDP18_MODULES)
271PDP9_CFLAGS=-DPDP9
272PDP9_EXTRA_OBJS+=$(COMMON_OBJS)
273PDP9_EXTRA_DEPS+=$(COMMON_SRC_DIR)/*.h
274
275SIM_NAMES+=PDP15
276PDP15_SRC_DIR=PDP18B
277PDP15_OBJ_DIR=pdp15
278PDP15_EXEC=pdp15
279CLEANSTUFF+=$(PDP15_OBJ_DIR)
280PDP15_MODULES=$(PDP18_MODULES)
281PDP15_CFLAGS=-DPDP15
282PDP15_EXTRA_OBJS+=$(COMMON_OBJS)
283PDP15_EXTRA_DEPS+=$(COMMON_SRC_DIR)/*.h
284
285
286
287################################################################################
288#
289# DEC PDP-8
290#
291
292SIM_NAMES+=PDP8
293PDP8_DIR=PDP8
294PDP8_EXEC=pdp8
295PDP8_MODULES=pdp8_cpu pdp8_clk pdp8_df \
296 pdp8_dt pdp8_lp pdp8_mt \
297 pdp8_pt pdp8_rf pdp8_rk \
298 pdp8_rx pdp8_sys pdp8_tt \
299 pdp8_ttx pdp8_rl pdp8_tsc \
300 pdp8_td pdp8_ct pdp8_fpp
301PDP8_EXTRA_OBJS+=$(COMMON_OBJS)
302PDP8_EXTRA_DEPS+=$(COMMON_SRC_DIR)/*.h
303
304
305
306################################################################################
307#
308# DEC PDP-10
309#
310
311SIM_NAMES+=PDP10
312PDP10_DIR=PDP10
313PDP10_MODULES = pdp10_fe pdp10_cpu \
314 pdp10_ksio pdp10_lp20 pdp10_mdfp \
315 pdp10_pag pdp10_rp pdp10_sys \
316 pdp10_tim pdp10_tu pdp10_xtnd\
317
318PDP10_EXTRA_MODULES=$(PDP11_DIR)/pdp11_dz $(PDP11_DIR)/pdp11_pt\
319 $(PDP11_DIR)/pdp11_ry $(PDP11_DIR)/pdp11_xu\
320 $(PDP11_DIR)/pdp11_cr
321
322PDP10_EXTRA_DEPS=$(PDP11_DIR)/*.h
323PDP10_EXEC=pdp10
324PDP10_CFLAGS=-DVM_PDP10 -DUSE_INT64 -I $(PDP11_DIR)
325PDP10_EXTRA_OBJS+=$(COMMON_INT64_OBJS)
326PDP10_EXTRA_DEPS+=$(COMMON_INT64_SRC_DIR)/*.h
327
328
329
330################################################################################
331#
332# DEC PDP-11
333#
334
335SIM_NAMES+=PDP11
336PDP11_DIR=PDP11
337PDP11_MODULES = pdp11_fp pdp11_cpu pdp11_dz \
338 pdp11_cis pdp11_lp pdp11_rk \
339 pdp11_rl pdp11_rp pdp11_rx \
340 pdp11_stddev pdp11_sys pdp11_tc \
341 pdp11_tm pdp11_ts pdp11_io \
342 pdp11_rq pdp11_tq pdp11_pclk \
343 pdp11_ry pdp11_pt pdp11_hk \
344 pdp11_xq pdp11_xu pdp11_vh \
345 pdp11_rh pdp11_tu pdp11_cpumod \
346 pdp11_cr pdp11_rf pdp11_dl \
347 pdp11_ta pdp11_rc pdp11_kg \
348 pdp11_ke pdp11_dc
349
350PDP11_EXEC=pdp11
351PDP11_CFLAGS=-DVM_PDP11
352PDP11_EXTRA_OBJS+=$(COMMON_OBJS)
353PDP11_EXTRA_DEPS+=$(COMMON_SRC_DIR)/*.h
354
355
356
357################################################################################
358#
359# DEC VAX
360#
361
362SIM_NAMES+=VAX
363VAX_DIR=VAX
364VAX_EXEC=vax
365VAX_MODULES=vax_cpu vax_cpu1 vax_fpa vax_io \
366 vax_cis vax_octa vax_cmode \
367 vax_mmu vax_stddev vax_sysdev \
368 vax_sys vax_syscm vax_syslist
369
370VAX_EXTRA_MODULES=$(PDP11_DIR)/pdp11_rl $(PDP11_DIR)/pdp11_rq $(PDP11_DIR)/pdp11_ts \
371 $(PDP11_DIR)/pdp11_dz $(PDP11_DIR)/pdp11_lp $(PDP11_DIR)/pdp11_tq \
372 $(PDP11_DIR)/pdp11_xq $(PDP11_DIR)/pdp11_ry \
373 $(PDP11_DIR)/pdp11_vh $(PDP11_DIR)/pdp11_cr
374
375VAX_EXTRA_DEPS=$(PDP11_DIR)/*.h
376VAX_CFLAGS=-DVM_VAX -DUSE_INT64 -DUSE_ADDR64 -I ${PDP11_DIR}
377VAX_EXTRA_OBJS+=$(COMMON_INT64_ADDR64_OBJS)
378VAX_EXTRA_DEPS+=$(COMMON_INT64_ADDR64_SRC_DIR)/*.h
379
380
381
382################################################################################
383#
384# DEC VAX780
385#
386
387SIM_NAMES+=VAX780
388VAX780_EXEC=vax780
389VAX780_SRC_DIR=VAX
390VAX780_OBJ_DIR=vax780
391VAX780_MODULES=vax_cpu vax_cpu1 vax_fpa \
392 vax_cis vax_octa vax_cmode \
393 vax_mmu vax_sys vax_syscm \
394 vax780_stddev vax780_sbi \
395 vax780_mem vax780_uba vax780_mba \
396 vax780_fload vax780_syslist \
397
398VAX780_EXTRA_MODULES=${PDP11_DIR}/pdp11_rl ${PDP11_DIR}/pdp11_rq \
399 ${PDP11_DIR}/pdp11_ts ${PDP11_DIR}/pdp11_dz \
400 ${PDP11_DIR}/pdp11_lp ${PDP11_DIR}/pdp11_tq \
401 ${PDP11_DIR}/pdp11_xu ${PDP11_DIR}/pdp11_ry \
402 ${PDP11_DIR}/pdp11_cr ${PDP11_DIR}/pdp11_rp \
403 ${PDP11_DIR}/pdp11_tu ${PDP11_DIR}/pdp11_hk
404
405VAX780_CFLAGS=-DVM_VAX -DVAX_780 -DUSE_INT64 -DUSE_ADDR64 -I $(PDP11_DIR)
406VAX780_EXTRA_DEPS=$(PDP11_DIR)/*.h
407VAX780_EXTRA_OBJS+=$(COMMON_INT64_ADDR64_OBJS)
408VAX780_EXTRA_DEPS+=$(COMMON_INT64_ADDR64_SRC_DIR)/*.h
409
410
411
412################################################################################
413#
414# Honeywell DDP-516/H316
415#
416
417SIM_NAMES+=H316
418H316_DIR=H316
419H316_EXEC=h316
420H316_MODULES = h316_stddev h316_lp h316_cpu h316_sys h316_mt h316_fhd h316_dp
421H316_EXTRA_OBJS+=$(COMMON_OBJS)
422H316_EXTRA_DEPS+=$(COMMON_SRC_DIR)/*.h
423
424
425
426################################################################################
427#
428# Hewlett Packard 2100
429#
430
431SIM_NAMES+=HP2100
432HP2100_DIR=HP2100
433HP2100_EXEC=hp2100
434HP2100_MODULES = hp2100_stddev hp2100_dp hp2100_dq \
435 hp2100_dr hp2100_lps hp2100_ms \
436 hp2100_mt hp2100_mux hp2100_cpu \
437 hp2100_fp hp2100_sys hp2100_lpt \
438 hp2100_ipl hp2100_ds hp2100_cpu0 \
439 hp2100_cpu1 hp2100_cpu2 hp2100_cpu3 \
440 hp2100_cpu4 hp2100_cpu5 hp2100_cpu6 \
441 hp2100_cpu7 hp2100_fp1 hp2100_baci
442HP2100_CFLAGS = -DHAVE_INT64
443HP2100_EXTRA_OBJS+=$(COMMON_OBJS)
444HP2100_EXTRA_DEPS+=$(COMMON_SRC_DIR)/*.h
445
446
447
448################################################################################
449#
450# IBM 1401
451#
452
453SIM_NAMES+=I1401
454I1401_DIR = I1401
455I1401_EXEC= i1401
456I1401_MODULES = i1401_lp i1401_cpu i1401_iq \
457 i1401_cd i1401_mt i1401_dp \
458 i1401_sys
459I1401_EXTRA_OBJS+=$(COMMON_OBJS)
460I1401_EXTRA_DEPS+=$(COMMON_SRC_DIR)/*.h
461
462
463
464################################################################################
465#
466# IBM 1620
467#
468
469SIM_NAMES+=I1620
470I1620_DIR = I1620
471I1620_EXEC = i1620
472I1620_MODULES = i1620_cd i1620_dp i1620_pt \
473 i1620_tty i1620_cpu i1620_lp \
474 i1620_fp i1620_sys
475I1620_EXTRA_OBJS+=$(COMMON_OBJS)
476I1620_EXTRA_DEPS+=$(COMMON_SRC_DIR)/*.h
477
478
479
480################################################################################
481#
482# IBM 7094/7094
483#
484
485SIM_NAMES+=I7094
486I7094_DIR = I7094
487I7094_EXEC = i7094
488I7094_MODULES = i7094_cpu i7094_cpu1 i7094_io \
489 i7094_cd i7094_clk i7094_com \
490 i7094_drm i7094_dsk i7094_sys \
491 i7094_lp i7094_mt i7094_binloader
492I7094_OPT = -DUSE_INT64
493I7094_EXTRA_OBJS+=$(COMMON_INT64_OBJS)
494I7094_EXTRA_DEPS+=$(COMMON_INT64_SRC_DIR)/*.h
495
496
497
498################################################################################
499#
500# IBM 1130
501#
502
503SIM_NAMES+=IBM1130
504IBM1130_DIR = Ibm1130
505IBM1130_EXEC = ibm1130
506IBM1130_MODULES = ibm1130_cpu ibm1130_cr \
507 ibm1130_disk ibm1130_stddev \
508 ibm1130_sys ibm1130_gdu \
509 ibm1130_gui ibm1130_prt \
510 ibm1130_fmt ibm1130_ptrp \
511 ibm1130_plot ibm1130_sca \
512 ibm1130_t2741
513IBM1130_EXTRA_OBJS+=$(COMMON_OBJS)
514IBM1130_EXTRA_DEPS+=$(COMMON_SRC_DIR)/*.h
515
516
517
518################################################################################
519#
520# IBM System 3
521#
522
523SIM_NAMES+=S3
524S3_EXEC=s3
525S3_DIR = S3
526S3_MODULES = s3_cd s3_cpu s3_disk s3_lp \
527 s3_pkb s3_sys
528S3_EXTRA_OBJS+=$(COMMON_OBJS)
529S3_EXTRA_DEPS+=$(COMMON_SRC_DIR)/*.h
530
531
532
533################################################################################
534#
535# Interdata 16b
536#
537
538SIM_NAMES+=ID16
539ID16_DIR = Interdata
540ID16_EXEC= id16
541ID16_MODULES = id16_cpu id16_sys id_dp \
542 id_fd id_fp id_idc id_io \
543 id_lp id_mt id_pas id_pt \
544 id_tt id_uvc id16_dboot id_ttp
545ID16_EXTRA_OBJS+=$(COMMON_OBJS)
546ID16_EXTRA_DEPS+=$(COMMON_SRC_DIR)/*.h
547
548
549
550################################################################################
551#
552# Interdata 32b
553#
554
555SIM_NAMES+=ID32
556ID32_EXEC=id32
557ID32_DIR = Interdata
558ID32_MODULES = id32_cpu id32_sys id32_dboot
559ID32_EXTRA_OBJS= $(foreach o, id_dp \
560 id_fd id_fp id_idc id_io \
561 id_lp id_mt id_pas id_pt \
562 id_tt id_uvc id_ttp, $(ID16_DIR)/$(o).o)
563ID32_EXTRA_OBJS+=$(COMMON_OBJS)
564ID32_EXTRA_DEPS+=$(COMMON_SRC_DIR)/*.h
565
566
567
568################################################################################
569#
570# MITS Altair
571#
572
573SIM_NAMES+=ALTAIR
574ALTAIR_DIR = ALTAIR
575ALTAIR_EXEC=altair
576ALTAIR_MODULES = altair_sio altair_cpu altair_dsk \
577 altair_sys
578ALTAIR_EXTRA_OBJS+=$(COMMON_OBJS)
579ALTAIR_EXTRA_DEPS+=$(COMMON_SRC_DIR)/*.h
580
581
582
583################################################################################
584#
585# MITS Altair Z80
586#
587
588SIM_NAMES+=ALTAIRZ80
589ALTAIRZ80_EXEC=altairz80
590ALTAIRZ80_DIR = AltairZ80
591ALTAIRZ80_MODULES = altairz80_cpu altairz80_cpu_nommu \
592 altairz80_dsk disasm \
593 altairz80_sio altairz80_sys \
594 altairz80_hdsk altairz80_net \
595 flashwriter2 i86_decode \
596 i86_ops i86_prim_ops \
597 i8272 insnsa insnsd \
598 mfdc n8vem vfdhd \
599 s100_disk1a s100_disk2 \
600 s100_fif s100_mdriveh \
601 s100_mdsad s100_selchan \
602 s100_ss1 s100_64fdc \
603 s100_scp300f sim_imd \
604 wd179x
605ALTAIRZ80_EXTRA_OBJS+=$(COMMON_OBJS)
606ALTAIRZ80_EXTRA_DEPS+=$(COMMON_SRC_DIR)/*.h
607
608
609
610################################################################################
611#
612# GRI-909 and GRI-99
613#
614
615SIM_NAMES+=GRI
616GRI_EXEC=gri
617GRI_DIR = GRI
618GRI_MODULES = gri_cpu gri_stddev gri_sys
619GRI_EXTRA_OBJS+=$(COMMON_OBJS)
620GRI_EXTRA_DEPS+=$(COMMON_SRC_DIR)/*.h
621
622
623
624################################################################################
625#
626# Royal-Mcbee LGP-30, LGP-21
627#
628
629SIM_NAMES+=LGP
630LGP_DIR = LGP
631LGP_EXEC=lgp
632LGP_MODULES = lgp_cpu lgp_stddev lgp_sys
633LGP_EXTRA_OBJS+=$(COMMON_OBJS)
634LGP_EXTRA_DEPS+=$(COMMON_SRC_DIR)/*.h
635
636
637
638################################################################################
639#
640# Scientific Data Systems SDS 940
641#
642
643SIM_NAMES+=SDS
644SDS_EXEC=sds
645SDS_DIR = SDS
646SDS_MODULES = sds_cpu sds_drm sds_dsk sds_io \
647 sds_lp sds_mt sds_mux sds_rad \
648 sds_stddev sds_sys
649SDS_EXTRA_OBJS+=$(COMMON_OBJS)
650SDS_EXTRA_DEPS+=$(COMMON_SRC_DIR)/*.h
651
652
653
654################################################################################
655################################################################################
656
657# Here comes the generic stuff. Should be altered VERY carefully.
658
659# Default target
660default: all
661
662#################################
663#
664# The object file build rule template
665#
666
667define OBJECT_RULE_TEMPLATE
668
669# Add the object file to the CLEANSTUFF list
670$(1)_OBJS+=$$(patsubst %.c,%.o, $$($(1)_OBJ_DIR)/$$(notdir $(2)))
671
672CLEANSTUFF+=$$(patsubst %.c,%.o, $$($(1)_OBJ_DIR)/$$(notdir $(2)))
673
674$$(patsubst %.c,%.o,$$($(1)_OBJ_DIR)/$$(notdir $(2))): $(2) $$($(1)_SRC_DIR)/*.h $$($(1)_EXTRA_DEPS)
675
676# Create output directory if it doesn't exist yet.
677 @if [ ! -d $$($(1)_OBJ_DIR) ]; then echo "MKDIR $$($(1)_OBJ_DIR)";\
678 mkdir $$($(1)_OBJ_DIR) 2>/dev/null||true; fi
679
680ifneq (,$$(VERBOSE))
681 $$(CC) -c -o $$@ -I $$($(1)_SRC_DIR) $$(CFLAGS) $$($(1)_CFLAGS) $$<
682else
683 @echo CC $$@
684 @$$(CC) -c -o $$@ -I $$($(1)_SRC_DIR) $$(CFLAGS) $$($(1)_CFLAGS) $$<
685endif
686
687endef
688
689
690################################################################################
691#
692# The object file collection template
693#
694
695define OBJECT_COLLECT_TEMPLATE
696
697# If no ..._OBJ_DIR is specified, use ..._DIR
698ifeq (,$$($(1)_OBJ_DIR))
699$(1)_OBJ_DIR=$$($(1)_DIR)
700endif
701
702# If no ..._SRC_DIR is specified, use ..._DIR
703ifeq (,$$($(1)_SRC_DIR))
704 $(1)_SRC_DIR=$$($(1)_DIR)
705endif
706
707$(1)_SOURCES=$$(foreach mod, $$($(1)_MODULES), $$($(1)_SRC_DIR)/$$(mod).c)
708$(1)_SOURCES+=$$(foreach mod, $$($(1)_EXTRA_MODULES), $$(mod).c)
709
710# The build rules.
711# They are generated by an inner template. Needed for flexibility.
712
713$$(foreach src, $$($(1)_SOURCES), $$(eval $$(call OBJECT_RULE_TEMPLATE,$(1),$$(src))))
714
715$(1)_OBJS+=$$($(1)_EXTRA_OBJS)
716
717endef
718
719
720################################################################################
721#
722# The executable file build rule template
723#
724
725define PROGRAM_TEMPLATE
726
727# All this is disabled if there's no executable to build.
728
729ifneq (,$$($(1)_EXEC))
730
731# Add the executable to the CLEANSTUFF list
732
733CLEANSTUFF+=$$(TARGET_DIR)/$$($(1)_EXEC)$$(EXEC_SUFFIX)
734
735EXEC_TARGETS+=$$($(1)_EXEC)
736
737# Generate a phony target with the simulator's name.
738# Enables things like "make h316".
739# On Windows this WILL NOT be "make h316.exe".
740$$($(1)_EXEC): $$(TARGET_DIR)/$$($(1)_EXEC)$$(EXEC_SUFFIX)
741
742
743$$(TARGET_DIR)/$$($(1)_EXEC)$$(EXEC_SUFFIX): $$($(1)_OBJS)
744 @if [ ! -d $$(TARGET_DIR) ]; then echo "MKDIR $$(TARGET_DIR)";\
745 mkdir $$(TARGET_DIR) 2>/dev/null||true;fi
746
747ifneq (,$$(VERBOSE))
748 $$(CC) -o $$@ $$(LDFLAGS) $$($(1)_LDFLAGS) $$^
749else
750 @echo LD $$@
751 @$$(CC) -o $$@ $$(LDFLAGS) $$($(1)_LDFLAGS) $$^
752endif
753
754
755$$($(1)_EXEC)clean clean$$($(1)_EXEC):
756ifneq (,$$(VERBOSE))
757 rm -f $$(TARGET_DIR)/$$($(1)_EXEC)$$(EXEC_SUFFIX)
758 rm -f $$($(1)_OBJS)
759else
760 @echo CLEAN $$($(1)_EXEC)
761 @rm -f $$(TARGET_DIR)/$$($(1)_EXEC)$$(EXEC_SUFFIX)
762 @rm -f $$($(1)_OBJS)
763endif
764
765
766.PHONY: $$($(1)_EXEC) clean$$($(1)_EXEC) $$($(1)_EXEC)clean
767
768
769endif
770
771endef
772################################################################################
773
774#################################
775#
776# Use the template with SIM_NAMES
777# This will generate all build rules for all object files and executables.
778#
779$(foreach sn, $(SIM_NAMES),$(eval $(call OBJECT_COLLECT_TEMPLATE,$(sn))))
780$(foreach sn, $(SIM_NAMES),$(eval $(call PROGRAM_TEMPLATE,$(sn))))
781
782
783#################################
784#
785# The all target
786#
787all: $(EXEC_TARGETS)
788
789
790#################################
791#
792# Output a little help
793#
794help:
795 @echo Available targets:
796 @echo
797 @echo "all - Build all simulators"
798 @echo "clean - Delete all generated files and directories"
799 @echo
800 @echo Simulators can explicitely built by the following targets:
801 @echo
802 @for n in $(EXEC_TARGETS); do echo " $$n" ; done
803 @echo
804 @echo The actual CC calls can be made visible with specifying VERBOSE=something.
805 @echo
806
807
808#################################
809#
810# The clean rule.
811#
812
813clean:
814 @echo CLEAN
815 @rm -rf $(CLEANSTUFF)
816
817
818
819#################################
820#
821# Specify phony targets
822#
823
824.PHONY: clean help all default
825
826
827################################################################################
828#
829# This is the end of the game :-)
830#
831################################################################################
832
833
834