# # Makefile for SIMH 3.8 # # Philipp Hachtmann # # 01-OCT-08 PH Added spaces after "-o" option to gcc # 19-SEP-08 PH Initial version # ################################################################################ # Find out something about the system we build for. # This process is ugly and should be revisited! BUILD=linux ifneq ($(WIN32),) BUILD=win32 endif ifneq (,$(findstring solaris,$(OSTYPE))) BUILD=solaris endif ifneq (,$(findstring darwin,$(OSTYPE))) BUILD=darwin endif ################################################################################ # Set build options according to what we found out about the build platform ifeq ($(BUILD),win32) CC = gcc LDFLAGS = -lm -lwsock32 -lwinmm CFLAGS=-std=c99 -U__STRICT_ANSI__ -O2 -I. -Wall EXEC_SUFFIX = .exe endif ifeq ($(BUILD),solaris) CC=gcc CFLAGS=-D_GNU_SOURCE LDFLAGS=-lm -lsocket -lnsl -lrt -lpthread endif ifeq ($(BUILD),darwin) CC=gcc CFLAGS = -D_GNU_SOURCE -O3 LDFLAGS= endif ifeq ($(BUILD),linux) CC=gcc CFLAGS = -D_GNU_SOURCE -O3 -std=c99 -U__STRICT_ANSI__ -g LDFLAGS+= -lrt -lm HAVE_READLINE=true READLINE_SAVED_HISTORY=true endif ################################################################################ # Add network definitions etc if desired ifneq ($(USE_NETWORK),) CFLAGS+=-DUSE_NETWORK LDFLAGS+=-lwpcap -lpacket endif ifneq ($(HAVE_READLINE),) READLINE_CFLAGS += -DHAVE_READLINE READLINE_LDFLAGS += -lreadline ifneq ($(READLINE_SAVED_HISTORY),) READLINE_CFLAGS += -DREADLINE_SAVED_HISTORY endif endif ################################################################################ # Other stuff to add to CFLAGS and LDFLAGS CFLAGS+=-I $(COMMON_DIR) LDFLAGS+= ################################################################################ # Target directory where the executables go to. # The directory is automatically created if it doesn't exist. TARGET_DIR=bin # This makes the target directory go away with "make clean": CLEANSTUFF+=$(TARGET_DIR) ################################################################################ ################################################################################ # This is the main section containing all the simulator dependent information. ################################################################################ # # Global stuff. # # The "normal" common modules SIM_NAMES+=COMMON COMMON_DIR=. COMMON_MODULES=scp sim_console sim_fio sim_timer sim_sock sim_tmxr\ sim_ether sim_tape sim_readline COMMON_CFLAGS+=$(READLINE_CFLAGS) LDFLAGS+=$(READLINE_LDFLAGS) # The common modules with -DUSE_INT64 SIM_NAMES+=COMMON_INT64 COMMON_INT64_SRC_DIR=$(COMMON_SRC_DIR) COMMON_INT64_OBJ_DIR=common_int64 COMMON_INT64_MODULES=$(COMMON_MODULES) COMMON_INT64_CFLAGS+=$(READLINE_CFLAGS) COMMON_INT64_CFLAGS+=-DUSE_INT64 # The common modules with -DUSE_INT64 and -DUSE_ADDR64 SIM_NAMES+=COMMON_INT64_ADDR64 COMMON_INT64_ADDR64_SRC_DIR=$(COMMON_SRC_DIR) COMMON_INT64_ADDR64_OBJ_DIR=common_int64_addr64 COMMON_INT64_ADDR64_MODULES=$(COMMON_MODULES) COMMON_INT64_ADDR64_CFLAGS+=$(READLINE_CFLAGS) COMMON_INT64_ADDR64_CFLAGS+=-DUSE_INT64 -DUSE_ADDR64 ################################################################################ # # Data General Nova # SIM_NAMES+=NOVA NOVA_DIR=NOVA NOVA_EXEC=nova NOVA_MODULES= nova_sys nova_cpu nova_dkp nova_dsk nova_lp nova_mta \ nova_plt nova_pt nova_clk nova_tt nova_tt1 nova_qty NOVA_EXTRA_OBJS+=$(COMMON_OBJS) NOVA_EXTRA_DEPS+=$(COMMON_SRC_DIR)/*.h ################################################################################ # # Data General Eclipse # # What happens: # # The Makefile uses all items in SIM_NAMES to call the OBJECT_COLLECT_TEMPLATE # sequentially. This macro uses the sim name (e.g. ECLIPSE) as prefix for # the variables it is working on. # It looks if there's a ..._SRC_DIR and ..._OBJ_DIR. # If not, it assigns both from ..._DIR. # So you can also specify a single source and object directory with ..._DIR. # # The template also builds a complete list of source files, ..._SOURCES. # # Then the OBJECT_RULE_TEMPLATE is expanded for all source files. # The current object file name is created from the source file name, # then added to the list of object files, ..._OBJS. # And, of course, the build rule for the object is output. # After the expansion of the OBJECT_RULE_TEMPLATE, the ..._EXTRA_OBJS # are added to the ..._OBJs list. # # There's another template, PROGRAM_TEMPLATE. It is called with all # SIM_NAMES as well. It generates the link rules for each application, # uses the ..._OBJS variable as input. # It also generates a "phony" target with the executable's stem, # to enable things like "make nova". # The application clean rules, like "novaclean", are also created by means # of this template. # This tells make to use the ECLIPSE_ variables. SIM_NAMES+=ECLIPSE # The program's source directory ECLIPSE_SRC_DIR=NOVA # Where the program's modules go to ECLIPSE_OBJ_DIR=eclipse # Because the OBJ_DIR is no SRC_DIR, we will add it to the list of items # to delete with "make clean". CLEANSTUFF+=$(ECLIPSE_OBJ_DIR) # The executable name. Can be left out if only rules for object files should # be generated. The common parts leave this blank. ECLIPSE_EXEC=eclipse # The source file names without extension relative to the SRC_DIR # Other sources (relative to the current directory) can be added by means # of the EXTRA_MODULES variable (see PDP10) ECLIPSE_MODULES=eclipse_cpu eclipse_tt nova_sys nova_dkp nova_dsk nova_lp \ nova_mta nova_plt nova_pt nova_clk nova_tt1 nova_qty # The C compiler flags used to build the MODULES' and EXTRA_MODULES' object # files. ECLIPSE_CFLAGS=-DECLIPSE -DUSE_INT64 # Objects that are defined in another program/collection. Must be the # object file names relative to the current directory, # for example "H316/h316_cpu.o". # Those object files are compiled by their own collection's rules! ECLIPSE_EXTRA_OBJS+=$(COMMON_INT64_OBJS) # Extra dependencies for the program's/collection's modules. ECLIPSE_EXTRA_DEPS+=$(COMMON_SRC_DIR)/*.h ################################################################################ # # DEC PDP-1 # SIM_NAMES+=PDP1 PDP1_DIR = PDP1 PDP1_EXEC = pdp1 PDP1_MODULES = pdp1_lp pdp1_cpu pdp1_stddev pdp1_sys pdp1_dt pdp1_drm \ pdp1_clk pdp1_dcs PDP1_EXTRA_OBJS+=$(COMMON_OBJS) PDP1__EXTRA_DEPS+=$(COMMON_SRC_DIR)/*.h ################################################################################ # # DEC PDP-4,7,9,15 # PDP18_MODULES = pdp18b_dt pdp18b_drm pdp18b_cpu\ pdp18b_lp pdp18b_mt pdp18b_rf\ pdp18b_rp pdp18b_stddev pdp18b_sys\ pdp18b_rb pdp18b_tt1 pdp18b_fpp SIM_NAMES+=PDP4 PDP4_SRC_DIR=PDP18B PDP4_OBJ_DIR=pdp4 PDP4_EXEC=pdp4 CLEANSTUFF+=$(PDP4_OBJ_DIR) PDP4_MODULES=$(PDP18_MODULES) PDP4_CFLAGS=-DPDP4 PDP4_EXTRA_OBJS+=$(COMMON_OBJS) PDP4_EXTRA_DEPS+=$(COMMON_SRC_DIR)/*.h SIM_NAMES+=PDP7 PDP7_SRC_DIR=PDP18B PDP7_OBJ_DIR=pdp7 PDP7_EXEC=pdp7 CLEANSTUFF+=$(PDP7_OBJ_DIR) PDP7_MODULES=$(PDP18_MODULES) PDP7_CFLAGS=-DPDP7 PDP7_EXTRA_OBJS+=$(COMMON_OBJS) PDP7_EXTRA_DEPS+=$(COMMON_SRC_DIR)/*.h SIM_NAMES+=PDP9 PDP9_SRC_DIR=PDP18B PDP9_OBJ_DIR=pdp9 PDP9_EXEC=pdp9 CLEANSTUFF+=$(PDP9_OBJ_DIR) PDP9_MODULES=$(PDP18_MODULES) PDP9_CFLAGS=-DPDP9 PDP9_EXTRA_OBJS+=$(COMMON_OBJS) PDP9_EXTRA_DEPS+=$(COMMON_SRC_DIR)/*.h SIM_NAMES+=PDP15 PDP15_SRC_DIR=PDP18B PDP15_OBJ_DIR=pdp15 PDP15_EXEC=pdp15 CLEANSTUFF+=$(PDP15_OBJ_DIR) PDP15_MODULES=$(PDP18_MODULES) PDP15_CFLAGS=-DPDP15 PDP15_EXTRA_OBJS+=$(COMMON_OBJS) PDP15_EXTRA_DEPS+=$(COMMON_SRC_DIR)/*.h ################################################################################ # # DEC PDP-8 # SIM_NAMES+=PDP8 PDP8_DIR=PDP8 PDP8_EXEC=pdp8 PDP8_MODULES=pdp8_cpu pdp8_clk pdp8_df \ pdp8_dt pdp8_lp pdp8_mt \ pdp8_pt pdp8_rf pdp8_rk \ pdp8_rx pdp8_sys pdp8_tt \ pdp8_ttx pdp8_rl pdp8_tsc \ pdp8_td pdp8_ct pdp8_fpp PDP8_EXTRA_OBJS+=$(COMMON_OBJS) PDP8_EXTRA_DEPS+=$(COMMON_SRC_DIR)/*.h ################################################################################ # # DEC PDP-10 # SIM_NAMES+=PDP10 PDP10_DIR=PDP10 PDP10_MODULES = pdp10_fe pdp10_cpu \ pdp10_ksio pdp10_lp20 pdp10_mdfp \ pdp10_pag pdp10_rp pdp10_sys \ pdp10_tim pdp10_tu pdp10_xtnd\ PDP10_EXTRA_MODULES=$(PDP11_DIR)/pdp11_dz $(PDP11_DIR)/pdp11_pt\ $(PDP11_DIR)/pdp11_ry $(PDP11_DIR)/pdp11_xu\ $(PDP11_DIR)/pdp11_cr PDP10_EXTRA_DEPS=$(PDP11_DIR)/*.h PDP10_EXEC=pdp10 PDP10_CFLAGS=-DVM_PDP10 -DUSE_INT64 -I $(PDP11_DIR) PDP10_EXTRA_OBJS+=$(COMMON_INT64_OBJS) PDP10_EXTRA_DEPS+=$(COMMON_INT64_SRC_DIR)/*.h ################################################################################ # # DEC PDP-11 # SIM_NAMES+=PDP11 PDP11_DIR=PDP11 PDP11_MODULES = pdp11_fp pdp11_cpu pdp11_dz \ pdp11_cis pdp11_lp pdp11_rk \ pdp11_rl pdp11_rp pdp11_rx \ pdp11_stddev pdp11_sys pdp11_tc \ pdp11_tm pdp11_ts pdp11_io \ pdp11_rq pdp11_tq pdp11_pclk \ pdp11_ry pdp11_pt pdp11_hk \ pdp11_xq pdp11_xu pdp11_vh \ pdp11_rh pdp11_tu pdp11_cpumod \ pdp11_cr pdp11_rf pdp11_dl \ pdp11_ta pdp11_rc pdp11_kg \ pdp11_ke pdp11_dc PDP11_EXEC=pdp11 PDP11_CFLAGS=-DVM_PDP11 PDP11_EXTRA_OBJS+=$(COMMON_OBJS) PDP11_EXTRA_DEPS+=$(COMMON_SRC_DIR)/*.h ################################################################################ # # DEC VAX # SIM_NAMES+=VAX VAX_DIR=VAX VAX_EXEC=vax VAX_MODULES=vax_cpu vax_cpu1 vax_fpa vax_io \ vax_cis vax_octa vax_cmode \ vax_mmu vax_stddev vax_sysdev \ vax_sys vax_syscm vax_syslist VAX_EXTRA_MODULES=$(PDP11_DIR)/pdp11_rl $(PDP11_DIR)/pdp11_rq $(PDP11_DIR)/pdp11_ts \ $(PDP11_DIR)/pdp11_dz $(PDP11_DIR)/pdp11_lp $(PDP11_DIR)/pdp11_tq \ $(PDP11_DIR)/pdp11_xq $(PDP11_DIR)/pdp11_ry \ $(PDP11_DIR)/pdp11_vh $(PDP11_DIR)/pdp11_cr VAX_EXTRA_DEPS=$(PDP11_DIR)/*.h VAX_CFLAGS=-DVM_VAX -DUSE_INT64 -DUSE_ADDR64 -I ${PDP11_DIR} VAX_EXTRA_OBJS+=$(COMMON_INT64_ADDR64_OBJS) VAX_EXTRA_DEPS+=$(COMMON_INT64_ADDR64_SRC_DIR)/*.h ################################################################################ # # DEC VAX780 # SIM_NAMES+=VAX780 VAX780_EXEC=vax780 VAX780_SRC_DIR=VAX VAX780_OBJ_DIR=vax780 VAX780_MODULES=vax_cpu vax_cpu1 vax_fpa \ vax_cis vax_octa vax_cmode \ vax_mmu vax_sys vax_syscm \ vax780_stddev vax780_sbi \ vax780_mem vax780_uba vax780_mba \ vax780_fload vax780_syslist \ VAX780_EXTRA_MODULES=${PDP11_DIR}/pdp11_rl ${PDP11_DIR}/pdp11_rq \ ${PDP11_DIR}/pdp11_ts ${PDP11_DIR}/pdp11_dz \ ${PDP11_DIR}/pdp11_lp ${PDP11_DIR}/pdp11_tq \ ${PDP11_DIR}/pdp11_xu ${PDP11_DIR}/pdp11_ry \ ${PDP11_DIR}/pdp11_cr ${PDP11_DIR}/pdp11_rp \ ${PDP11_DIR}/pdp11_tu ${PDP11_DIR}/pdp11_hk VAX780_CFLAGS=-DVM_VAX -DVAX_780 -DUSE_INT64 -DUSE_ADDR64 -I $(PDP11_DIR) VAX780_EXTRA_DEPS=$(PDP11_DIR)/*.h VAX780_EXTRA_OBJS+=$(COMMON_INT64_ADDR64_OBJS) VAX780_EXTRA_DEPS+=$(COMMON_INT64_ADDR64_SRC_DIR)/*.h ################################################################################ # # Honeywell DDP-516/H316 # SIM_NAMES+=H316 H316_DIR=H316 H316_EXEC=h316 H316_MODULES = h316_stddev h316_lp h316_cpu h316_sys h316_mt h316_fhd h316_dp H316_EXTRA_OBJS+=$(COMMON_OBJS) H316_EXTRA_DEPS+=$(COMMON_SRC_DIR)/*.h ################################################################################ # # Hewlett Packard 2100 # SIM_NAMES+=HP2100 HP2100_DIR=HP2100 HP2100_EXEC=hp2100 HP2100_MODULES = hp2100_stddev hp2100_dp hp2100_dq \ hp2100_dr hp2100_lps hp2100_ms \ hp2100_mt hp2100_mux hp2100_cpu \ hp2100_fp hp2100_sys hp2100_lpt \ hp2100_ipl hp2100_ds hp2100_cpu0 \ hp2100_cpu1 hp2100_cpu2 hp2100_cpu3 \ hp2100_cpu4 hp2100_cpu5 hp2100_cpu6 \ hp2100_cpu7 hp2100_fp1 hp2100_baci HP2100_CFLAGS = -DHAVE_INT64 HP2100_EXTRA_OBJS+=$(COMMON_OBJS) HP2100_EXTRA_DEPS+=$(COMMON_SRC_DIR)/*.h ################################################################################ # # IBM 1401 # SIM_NAMES+=I1401 I1401_DIR = I1401 I1401_EXEC= i1401 I1401_MODULES = i1401_lp i1401_cpu i1401_iq \ i1401_cd i1401_mt i1401_dp \ i1401_sys I1401_EXTRA_OBJS+=$(COMMON_OBJS) I1401_EXTRA_DEPS+=$(COMMON_SRC_DIR)/*.h ################################################################################ # # IBM 1620 # SIM_NAMES+=I1620 I1620_DIR = I1620 I1620_EXEC = i1620 I1620_MODULES = i1620_cd i1620_dp i1620_pt \ i1620_tty i1620_cpu i1620_lp \ i1620_fp i1620_sys I1620_EXTRA_OBJS+=$(COMMON_OBJS) I1620_EXTRA_DEPS+=$(COMMON_SRC_DIR)/*.h ################################################################################ # # IBM 7094/7094 # SIM_NAMES+=I7094 I7094_DIR = I7094 I7094_EXEC = i7094 I7094_MODULES = i7094_cpu i7094_cpu1 i7094_io \ i7094_cd i7094_clk i7094_com \ i7094_drm i7094_dsk i7094_sys \ i7094_lp i7094_mt i7094_binloader I7094_OPT = -DUSE_INT64 I7094_EXTRA_OBJS+=$(COMMON_INT64_OBJS) I7094_EXTRA_DEPS+=$(COMMON_INT64_SRC_DIR)/*.h ################################################################################ # # IBM 1130 # SIM_NAMES+=IBM1130 IBM1130_DIR = Ibm1130 IBM1130_EXEC = ibm1130 IBM1130_MODULES = ibm1130_cpu ibm1130_cr \ ibm1130_disk ibm1130_stddev \ ibm1130_sys ibm1130_gdu \ ibm1130_gui ibm1130_prt \ ibm1130_fmt ibm1130_ptrp \ ibm1130_plot ibm1130_sca \ ibm1130_t2741 IBM1130_EXTRA_OBJS+=$(COMMON_OBJS) IBM1130_EXTRA_DEPS+=$(COMMON_SRC_DIR)/*.h ################################################################################ # # IBM System 3 # SIM_NAMES+=S3 S3_EXEC=s3 S3_DIR = S3 S3_MODULES = s3_cd s3_cpu s3_disk s3_lp \ s3_pkb s3_sys S3_EXTRA_OBJS+=$(COMMON_OBJS) S3_EXTRA_DEPS+=$(COMMON_SRC_DIR)/*.h ################################################################################ # # Interdata 16b # SIM_NAMES+=ID16 ID16_DIR = Interdata ID16_EXEC= id16 ID16_MODULES = id16_cpu id16_sys id_dp \ id_fd id_fp id_idc id_io \ id_lp id_mt id_pas id_pt \ id_tt id_uvc id16_dboot id_ttp ID16_EXTRA_OBJS+=$(COMMON_OBJS) ID16_EXTRA_DEPS+=$(COMMON_SRC_DIR)/*.h ################################################################################ # # Interdata 32b # SIM_NAMES+=ID32 ID32_EXEC=id32 ID32_DIR = Interdata ID32_MODULES = id32_cpu id32_sys id32_dboot ID32_EXTRA_OBJS= $(foreach o, id_dp \ id_fd id_fp id_idc id_io \ id_lp id_mt id_pas id_pt \ id_tt id_uvc id_ttp, $(ID16_DIR)/$(o).o) ID32_EXTRA_OBJS+=$(COMMON_OBJS) ID32_EXTRA_DEPS+=$(COMMON_SRC_DIR)/*.h ################################################################################ # # MITS Altair # SIM_NAMES+=ALTAIR ALTAIR_DIR = ALTAIR ALTAIR_EXEC=altair ALTAIR_MODULES = altair_sio altair_cpu altair_dsk \ altair_sys ALTAIR_EXTRA_OBJS+=$(COMMON_OBJS) ALTAIR_EXTRA_DEPS+=$(COMMON_SRC_DIR)/*.h ################################################################################ # # MITS Altair Z80 # SIM_NAMES+=ALTAIRZ80 ALTAIRZ80_EXEC=altairz80 ALTAIRZ80_DIR = AltairZ80 ALTAIRZ80_MODULES = altairz80_cpu altairz80_cpu_nommu \ altairz80_dsk disasm \ altairz80_sio altairz80_sys \ altairz80_hdsk altairz80_net \ flashwriter2 i86_decode \ i86_ops i86_prim_ops \ i8272 insnsa insnsd \ mfdc n8vem vfdhd \ s100_disk1a s100_disk2 \ s100_fif s100_mdriveh \ s100_mdsad s100_selchan \ s100_ss1 s100_64fdc \ s100_scp300f sim_imd \ wd179x ALTAIRZ80_EXTRA_OBJS+=$(COMMON_OBJS) ALTAIRZ80_EXTRA_DEPS+=$(COMMON_SRC_DIR)/*.h ################################################################################ # # GRI-909 and GRI-99 # SIM_NAMES+=GRI GRI_EXEC=gri GRI_DIR = GRI GRI_MODULES = gri_cpu gri_stddev gri_sys GRI_EXTRA_OBJS+=$(COMMON_OBJS) GRI_EXTRA_DEPS+=$(COMMON_SRC_DIR)/*.h ################################################################################ # # Royal-Mcbee LGP-30, LGP-21 # SIM_NAMES+=LGP LGP_DIR = LGP LGP_EXEC=lgp LGP_MODULES = lgp_cpu lgp_stddev lgp_sys LGP_EXTRA_OBJS+=$(COMMON_OBJS) LGP_EXTRA_DEPS+=$(COMMON_SRC_DIR)/*.h ################################################################################ # # Scientific Data Systems SDS 940 # SIM_NAMES+=SDS SDS_EXEC=sds SDS_DIR = SDS SDS_MODULES = sds_cpu sds_drm sds_dsk sds_io \ sds_lp sds_mt sds_mux sds_rad \ sds_stddev sds_sys SDS_EXTRA_OBJS+=$(COMMON_OBJS) SDS_EXTRA_DEPS+=$(COMMON_SRC_DIR)/*.h ################################################################################ ################################################################################ # Here comes the generic stuff. Should be altered VERY carefully. # Default target default: all ################################# # # The object file build rule template # define OBJECT_RULE_TEMPLATE # Add the object file to the CLEANSTUFF list $(1)_OBJS+=$$(patsubst %.c,%.o, $$($(1)_OBJ_DIR)/$$(notdir $(2))) CLEANSTUFF+=$$(patsubst %.c,%.o, $$($(1)_OBJ_DIR)/$$(notdir $(2))) $$(patsubst %.c,%.o,$$($(1)_OBJ_DIR)/$$(notdir $(2))): $(2) $$($(1)_SRC_DIR)/*.h $$($(1)_EXTRA_DEPS) # Create output directory if it doesn't exist yet. @if [ ! -d $$($(1)_OBJ_DIR) ]; then echo "MKDIR $$($(1)_OBJ_DIR)";\ mkdir $$($(1)_OBJ_DIR) 2>/dev/null||true; fi ifneq (,$$(VERBOSE)) $$(CC) -c -o $$@ -I $$($(1)_SRC_DIR) $$(CFLAGS) $$($(1)_CFLAGS) $$< else @echo CC $$@ @$$(CC) -c -o $$@ -I $$($(1)_SRC_DIR) $$(CFLAGS) $$($(1)_CFLAGS) $$< endif endef ################################################################################ # # The object file collection template # define OBJECT_COLLECT_TEMPLATE # If no ..._OBJ_DIR is specified, use ..._DIR ifeq (,$$($(1)_OBJ_DIR)) $(1)_OBJ_DIR=$$($(1)_DIR) endif # If no ..._SRC_DIR is specified, use ..._DIR ifeq (,$$($(1)_SRC_DIR)) $(1)_SRC_DIR=$$($(1)_DIR) endif $(1)_SOURCES=$$(foreach mod, $$($(1)_MODULES), $$($(1)_SRC_DIR)/$$(mod).c) $(1)_SOURCES+=$$(foreach mod, $$($(1)_EXTRA_MODULES), $$(mod).c) # The build rules. # They are generated by an inner template. Needed for flexibility. $$(foreach src, $$($(1)_SOURCES), $$(eval $$(call OBJECT_RULE_TEMPLATE,$(1),$$(src)))) $(1)_OBJS+=$$($(1)_EXTRA_OBJS) endef ################################################################################ # # The executable file build rule template # define PROGRAM_TEMPLATE # All this is disabled if there's no executable to build. ifneq (,$$($(1)_EXEC)) # Add the executable to the CLEANSTUFF list CLEANSTUFF+=$$(TARGET_DIR)/$$($(1)_EXEC)$$(EXEC_SUFFIX) EXEC_TARGETS+=$$($(1)_EXEC) # Generate a phony target with the simulator's name. # Enables things like "make h316". # On Windows this WILL NOT be "make h316.exe". $$($(1)_EXEC): $$(TARGET_DIR)/$$($(1)_EXEC)$$(EXEC_SUFFIX) $$(TARGET_DIR)/$$($(1)_EXEC)$$(EXEC_SUFFIX): $$($(1)_OBJS) @if [ ! -d $$(TARGET_DIR) ]; then echo "MKDIR $$(TARGET_DIR)";\ mkdir $$(TARGET_DIR) 2>/dev/null||true;fi ifneq (,$$(VERBOSE)) $$(CC) -o $$@ $$(LDFLAGS) $$($(1)_LDFLAGS) $$^ else @echo LD $$@ @$$(CC) -o $$@ $$(LDFLAGS) $$($(1)_LDFLAGS) $$^ endif $$($(1)_EXEC)clean clean$$($(1)_EXEC): ifneq (,$$(VERBOSE)) rm -f $$(TARGET_DIR)/$$($(1)_EXEC)$$(EXEC_SUFFIX) rm -f $$($(1)_OBJS) else @echo CLEAN $$($(1)_EXEC) @rm -f $$(TARGET_DIR)/$$($(1)_EXEC)$$(EXEC_SUFFIX) @rm -f $$($(1)_OBJS) endif .PHONY: $$($(1)_EXEC) clean$$($(1)_EXEC) $$($(1)_EXEC)clean endif endef ################################################################################ ################################# # # Use the template with SIM_NAMES # This will generate all build rules for all object files and executables. # $(foreach sn, $(SIM_NAMES),$(eval $(call OBJECT_COLLECT_TEMPLATE,$(sn)))) $(foreach sn, $(SIM_NAMES),$(eval $(call PROGRAM_TEMPLATE,$(sn)))) ################################# # # The all target # all: $(EXEC_TARGETS) ################################# # # Output a little help # help: @echo Available targets: @echo @echo "all - Build all simulators" @echo "clean - Delete all generated files and directories" @echo @echo Simulators can explicitely built by the following targets: @echo @for n in $(EXEC_TARGETS); do echo " $$n" ; done @echo @echo The actual CC calls can be made visible with specifying VERBOSE=something. @echo ################################# # # The clean rule. # clean: @echo CLEAN @rm -rf $(CLEANSTUFF) ################################# # # Specify phony targets # .PHONY: clean help all default ################################################################################ # # This is the end of the game :-) # ################################################################################