# New Makefile for SIMH 3.8 # Philipp Hachtmann # ################################################################################ # 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. 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 LDFLAGS= endif ifeq ($(BUILD),linux) CC=gcc CFLAGS = -D_GNU_SOURCE -std=c99 -U__STRICT_ANSI__ -g LDFLAGS= -lrt -lm endif ################################################################################ # Add network definitions if desired ifneq ($(USE_NETWORK),) CFLAGS+=-DUSE_NETWORK LDFLAGS+=-lwpcap -lpacket endif ################################################################################ # Other stuff to add to CFLAGS and LDFLAGS CFLAGS+=-I common 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 special executable "nothing" will not be built. # SIM_NAMES+=COMMON COMMON_DIR=common COMMON_MODULES=scp sim_console sim_fio sim_timer sim_sock sim_tmxr sim_ether sim_tape COMMON_CFLAGS= COMMON_EXEC=nothing ################################################################################ # # 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 ################################################################################ # # Data General Eclipse # # Note: Here you see we define a ..._SRC_DIR and ..._OBJ_DIR. This is # done because Nova and Eclipse have the same modules compiled # with different CFLAGS. # This is handled automatically by the generic rule template for # object files. But if the OBJ_DIR should be deleted # by "make clean", it must be added manually to the CLEANSTUFF list. SIM_NAMES+=ECLIPSE ECLIPSE_SRC_DIR=nova ECLIPSE_OBJ_DIR=eclipse CLEANSTUFF+=$(ECLIPSE_OBJ_DIR) ECLIPSE_EXEC=eclipse 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 ECLIPSE_CFLAGS=-DECLIPSE -DUSE_INT64 ################################################################################ # # 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 ################################################################################ # # 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 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 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 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 ################################################################################ # # 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 ################################################################################ # # DEC PDP-10 # SIM_NAMES+=PDP10 PDP10_OBJ_DIR=pdp10 PDP10_SRC_DIR=pdp10 PDP10_MODULES = pdp10_fe pdp11_dz pdp10_cpu \ pdp10_ksio pdp10_lp20 pdp10_mdfp \ pdp10_pag pdp10_rp pdp10_sys \ pdp10_tim pdp10_tu pdp10_xtnd ../$(PDP11_DIR)/pdp11_pt\ ../$(PDP11_DIR)/pdp11_ry ../$(PDP11_DIR)/pdp11_xu PDP10_EXEC=pdp10 PDP10_CFLAGS=-DVM_PDP10 -DUSE_INT64 -I $(PDP11_DIR) ################################################################################ # # Honeywell DDP-516/H316 # H316_DIR=h316 H316_EXEC=h316 H316_MODULES = h316_stddev h316_lp h316_cpu h316_sys h316_mt h316_fhd h316_dp PDP1_DIR = pdp1 PDP1_EXEC = pdp1 PDP1_MODULES = pdp1_lp pdp1_cpu pdp1_stddev pdp1_sys pdp1_dt pdp1_drm \ pdp1_clk pdp1_dcs ################################################################################ ################################################################################ # Here comes the weird generic stuff. Should be altered VERY carefully only. # Default target default: all ################################# # # The object file build rule template # define OBJECT_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 # Generate object file names with path (for example h316/h316_cpu.o) $(1)_OBJS=$$(foreach obj, $$($(1)_MODULES), $$($(1)_OBJ_DIR)/$$(obj).o) # Add the object files to the CLEANSTUFF list CLEANSTUFF+=$$($(1)_OBJS) # The build rule. # At the moment, header file changes might cause too many files to be rebuilt. But # that seems to be acceptable for the moment. $$($(1)_OBJS) : $$($(1)_OBJ_DIR)/%.o : $$($(1)_SRC_DIR)/%.c $$($(1)_SRC_DIR)/*.h $$(COMMON_DIR)/*.h # Create output directory if it doesn't exist yet. @if [ ! -d $$($(1)_OBJ_DIR) ]; then echo "MKDIR $$($(1)_OBJ_DIR)"; mkdir $$($(1)_OBJ_DIR); fi ifneq (,$$(VERBOSE)) $$(CC) -c -o $$@ -I $$($(1)_DIR) $$(CFLAGS) $$($(1)_CFLAGS) $$< else @echo CC $$@ @$$(CC) -c -o $$@ -I $$($(1)_DIR) $$(CFLAGS) $$($(1)_CFLAGS) $$< endif endef ################################# # # The executable file build rule template # define PROGRAM_TEMPLATE # Add the executable to the CLEANSTUFF list CLEANSTUFF+=$$(TARGET_DIR)/$$($(1)_EXEC)$$(EXEC_SUFFIX) # We won't build or mention the executable named "noting"! ifneq (nothing,$$($(1)_EXEC)) EXEC_TARGETS+=$$($(1)_EXEC) endif # 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) .PHONY: $$($(1)_EXEC) $$(TARGET_DIR)/$$($(1)_EXEC)$$(EXEC_SUFFIX): $$($(1)_OBJS) $$(COMMON_OBJS) @if [ ! -d $$(TARGET_DIR) ]; then echo "MKDIR $$(TARGET_DIR)";mkdir $$(TARGET_DIR);fi ifneq (,$$(VERBOSE)) $$(CC) -o$$@ $$(LDFLAGS) $$($(1)_LDFLAGS) $$^ else @echo LD $$@ @$$(CC) -o$$@ $$(LDFLAGS) $$($(1)_LDFLAGS) $$^ endif endef ################################# # # Use the template with SIM_NAMES # $(foreach sn, $(SIM_NAMES),$(eval $(call OBJECT_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 @echo $(EXEC_TARGETS) @echo @echo $(CLEANSTUFF) @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 :-) # ################################################################################