#
#
# 86Box    A hypervisor and IBM PC system emulator that specializes in
#          running old operating systems and software designed for IBM
#          PC systems and compatibles from 1981 through fairly recent
#          system designs based on the PCI bus.
#
#          This file is part of the 86Box distribution.
#
#          Makefile for Win32 (MinGW32) environment.
#
# Authors: Miran Grca, <mgrca8@gmail.com>
#          Fred N. van Kempen, <decwiz@yahoo.com>
#

# Various compile-time options.
ifndef STUFF
 STUFF :=
endif

# Add feature selections here.
ifndef EXTRAS
 EXTRAS :=
endif

ifndef DEV_BUILD
 DEV_BUILD := n
endif

ifeq ($(DEV_BUILD), y)
 ifndef DEBUG
  DEBUG := y
 endif
 ifndef GDBSTUB
  GDBSTUB := n
 endif
 ifndef DEV_BRANCH
  DEV_BRANCH := y
 endif
 ifndef AMD_K5
  AMD_K5 := y
 endif
 ifndef AN430TX
  AN430TX := y
 endif
 ifndef CYRIX_6X86
  CYRIX_6X86 := y
 endif
 ifndef DESKPRO386
  DESKPRO386 := y
 endif
 ifndef GUSMAX
  GUSMAX := y
 endif
 ifndef ISAMEM_RAMPAGE
  ISAMEM_RAMPAGE := y
 endif
 ifndef ISAMEM_IAB
  ISAMEM_IAB := y
 endif
 ifndef ISAMEM_BRAT
  ISAMEM_BRAT := y
 endif
 ifndef LASERXT
  LASERXT := y
 endif
 ifndef OLIVETTI
  OLIVETTI := y
 endif
 ifndef OPEN_AT
  OPEN_AT := y
 endif
 ifndef OPL4ML
  OPL4ML := y
 endif
 ifndef PAS16
  PAS16 := y
 endif
 ifndef PCI_DUMMY
  PCI_DUMMY := y
 endif
 ifndef SIO_DETECT
  SIO_DETECT := y
 endif
 ifndef VGAWONDER
  VGAWONDER := y
 endif
 ifndef XL24
  XL24 := y
 endif
 ifndef NEW_KBC
  NEW_KBC := n
 endif
else
 ifndef DEBUG
  DEBUG := n
 endif
 ifndef GDBSTUB
  GDBSTUB := n
 endif
 ifndef DEV_BRANCH
  DEV_BRANCH := n
 endif
 ifndef AMD_K5
  AMD_K5 := n
 endif
 ifndef AN430TX
  AN430TX := n
 endif
 ifndef CYRIX_6X86
  CYRIX_6X86 := n
 endif
 ifndef DESKPRO386
  DESKPRO386 := n
 endif
 ifndef GUSMAX
  GUSMAX := n
 endif
 ifndef ISAMEM_RAMPAGE
  ISAMEM_RAMPAGE := n
 endif
 ifndef ISAMEM_IAB
  ISAMEM_IAB := n
 endif
 ifndef ISAMEM_BRAT
  ISAMEM_BRAT := n
 endif
 ifndef LASERXT
  LASERXT := n
 endif
 ifndef OLIVETTI
  OLIVETTI := n
 endif
 ifndef OPEN_AT
  OPEN_AT := n
 endif
 ifndef OPL4ML
  OPL4ML := n
 endif
 ifndef PAS16
  PAS16 := n
 endif
 ifndef PCI_DUMMY
  PCI_DUMMY := n
 endif
 ifndef SIO_DETECT
  SIO_DETECT := n
 endif
 ifndef VGAWONDER
  VGAWONDER := n
 endif
 ifndef XL24
  XL24 := n
 endif
 ifndef NEW_KBC
  NEW_KBC := n
 endif
endif

# Defaults for several build options (possibly defined in a chained file.)
ifndef AUTODEP
 AUTODEP := n
endif
ifndef OPTIM
 OPTIM := n
endif
ifndef RELEASE
 RELEASE := n
endif
ifndef X64
 X64 := n
endif
ifndef ARM
 ARM := n
endif
ifndef ARM64
 ARM64 := n
endif
ifndef DINPUT
 DINPUT := n
endif
ifndef FAUDIO
 FAUDIO := n
endif
ifndef OPENAL
 OPENAL := y
endif
ifndef FLUIDSYNTH
 FLUIDSYNTH := y
endif
ifndef MUNT
 MUNT := y
endif
ifndef VNC
 VNC := n
endif
ifndef NEW_DYNAREC
 NEW_DYNAREC := n
endif
ifndef DYNAREC
 DYNAREC := y
endif
ifndef CPPTHREADS
 CPPTHREADS := y
endif
ifndef RTMIDI
 RTMIDI := y
endif
ifndef MINITRACE
 MINITRACE := n
endif
ifndef AVX
 AVX := n
endif
ifeq ($(DYNAREC), y)
 ifeq ($(ARM), y)
  ifeq ($(NEW_DYNAREC), n)
   DYNAREC := n
  endif
 endif
 ifeq ($(ARM64), y)
  ifeq ($(NEW_DYNAREC), n)
   DYNAREC := n
  endif
 endif
endif


# Path to the dynamic recompiler code.
ifeq ($(NEW_DYNAREC), y)
 CODEGEN := codegen_new
else
 CODEGEN := codegen
endif


# Name of the executable.
PROG := 86Box


#########################################################################
#              Nothing should need changing from here on..              #
#########################################################################
VPATH := $(EXPATH) . $(CODEGEN) minitrace cpu cpu/softfloat \
         cpu/808x cdrom chipset device disk disk/minivhd floppy \
         game machine mem printer \
         sio sound \
         sound/munt sound/munt/c_interface sound/munt/sha1 \
         sound/munt/srchelper sound/munt/srchelper/srctools/src \
         sound/resid-fp sound/ymfm \
         scsi video network win

WINDRES := windres
STRIP   := strip
ifeq ($(X64), y)
 TOOL_PREFIX := x86_64-w64-mingw32-
else
 ifeq ($(ARM64), y)
  TOOL_PREFIX := aarch64-w64-mingw32-
  WINDRES := ${TOOL_PREFIX}windres
  STRIP   := ${TOOL_PREFIX}strip
 endif
 ifeq ($(ARM), y)
  TOOL_PREFIX := armv7-w64-mingw32-
  WINDRES := ${TOOL_PREFIX}windres
  STRIP   := ${TOOL_PREFIX}strip
 endif
 TOOL_PREFIX := i686-w64-mingw32-
endif

ifeq ($(CLANG), y)
 CPP := clang++
 CC  := clang
else
 CPP := ${TOOL_PREFIX}g++
 CC  := ${TOOL_PREFIX}gcc
endif

DEPS     = -MMD -MF $*.d -c $<
DEPFILE := win/.depends

# Set up the correct toolchain flags.
OPTS := $(EXTRAS) $(STUFF)
OPTS += -Iinclude -Iinclude_make \
        -iquote $(CODEGEN) -iquote cpu
ifdef EXFLAGS
 OPTS += $(EXFLAGS)
endif
ifdef EXINC
 OPTS += -I$(EXINC)
endif
ifeq ($(OPTIM), y)
 DFLAGS := -march=native
else
 ifeq ($(X64), y)
  DFLAGS :=
 else
  DFLAGS := -march=i686
 endif
endif
ifeq ($(DEBUG), y)
 DFLAGS += -ggdb -DDEBUG
 AOPTIM :=
 ifndef COPTIM
  COPTIM := -Og
 endif
 ifndef CXXOPTIM
  ifeq ($(CLANG), y)
   CXXOPTIM := -Os
  else
   CXXOPTIM := -Og
  endif
 endif
else
 DFLAGS += -g0
 ifeq ($(OPTIM), y)
  AOPTIM := -mtune=native
  ifndef COPTIM
   CXXOPTIM := -O3 -ffp-contract=fast -flto
  endif
  ifndef CXXOPTIM
   ifeq ($(CLANG), y)
    CXXOPTIM := -Os -ffp-contract=fast -flto
   else
    CXXOPTIM := -O3 -ffp-contract=fast -flto
   endif
  endif
 else
  ifndef COPTIM
   COPTIM := -O3
  endif
  ifndef CXXOPTIM
   ifeq ($(CLANG), y)
    CXXOPTIM := -Os
   else
    CXXOPTIM := -O3
   endif
  endif
 endif
endif
ifeq ($(AVX), y)
 AFLAGS := -msse2 -msse3 -mssse3 -msse4 -msse4a -mavx -mavx2 -mfpmath=sse
else
 AFLAGS := -msse2 -mfpmath=sse
endif
ifeq ($(ARM), y)
 DFLAGS := -march=armv7-a
 AOPTIM :=
 AFLAGS := -mfloat-abi=hard
endif
ifeq ($(ARM64), y)
 DFLAGS := -march=armv8-a
 AOPTIM :=
 AFLAGS := -mfloat-abi=hard
endif
RFLAGS := --input-format=rc -O coff -Iinclude -Iinclude_make
ifeq ($(RELEASE), y)
 OPTS   += -DRELEASE_BUILD
 RFLAGS += -DRELEASE_BUILD
endif


# Optional modules.
ifeq ($(DYNAREC), y)
 OPTS   += -DUSE_DYNAREC
 RFLAGS += -DUSE_DYNAREC

 ifeq ($(NEW_DYNAREC), y)
  OPTS   += -DUSE_NEW_DYNAREC
  RFLAGS += -DUSE_NEW_DYNAREC

  ifeq ($(X64), y)
   PLATCG := codegen_backend_x86-64.o codegen_backend_x86-64_ops.o codegen_backend_x86-64_ops_sse.o \
             codegen_backend_x86-64_uops.o
  else ifeq ($(ARM64), y)
   PLATCG := codegen_backend_arm64.o codegen_backend_arm64_ops.o codegen_backend_arm64_uops.o \
             codegen_backend_arm64_imm.o
  else ifeq ($(ARM), y)
   PLATCG := codegen_backend_arm.o codegen_backend_arm_ops.o codegen_backend_arm_uops.o
  else
   PLATCG := codegen_backend_x86.o codegen_backend_x86_ops.o codegen_backend_x86_ops_fpu.o \
             codegen_backend_x86_ops_sse.o codegen_backend_x86_uops.o
  endif

  DYNARECOBJ := codegen.o codegen_accumulate.o codegen_allocator.o codegen_block.o codegen_ir.o codegen_ops.o \
                codegen_ops_3dnow.o codegen_ops_branch.o codegen_ops_arith.o codegen_ops_fpu_arith.o \
                codegen_ops_fpu_constant.o codegen_ops_fpu_loadstore.o codegen_ops_fpu_misc.o codegen_ops_helpers.o \
                codegen_ops_jump.o codegen_ops_logic.o codegen_ops_misc.o codegen_ops_mmx_arith.o codegen_ops_mmx_cmp.o \
                codegen_ops_mmx_loadstore.o codegen_ops_mmx_logic.o codegen_ops_mmx_pack.o codegen_ops_mmx_shift.o \
                codegen_ops_mov.o codegen_ops_shift.o codegen_ops_stack.o codegen_reg.o $(PLATCG)
 else
  ifeq ($(X64), y)
   PLATCG := codegen_x86-64.o codegen_accumulate_x86-64.o
  else
   PLATCG := codegen_x86.o codegen_accumulate_x86.o
  endif

  DYNARECOBJ := codegen.o \
                codegen_ops.o $(PLATCG)
 endif

  CGTOBJ := codegen_timing_486.o \
            codegen_timing_686.o codegen_timing_common.o codegen_timing_k6.o codegen_timing_pentium.o \
            codegen_timing_p6.o codegen_timing_winchip.o codegen_timing_winchip2.o
else
 ifeq ($(NEW_DYNAREC), y)
  OPTS   += -DUSE_NEW_DYNAREC
  RFLAGS += -DUSE_NEW_DYNAREC
 endif
endif

ifeq ($(FLUIDSYNTH), y)
 OPTS      += -DUSE_FLUIDSYNTH
 FSYNTHOBJ := midi_fluidsynth.o
endif

ifeq ($(MUNT), y)
 OPTS    += -DUSE_MUNT
 MUNTOBJ := midi_mt32.o \
            Analog.o BReverbModel.o Display.o File.o FileStream.o LA32Ramp.o \
            LA32FloatWaveGenerator.o LA32WaveGenerator.o \
            MidiStreamParser.o Part.o Partial.o PartialManager.o \
            Poly.o ROMInfo.o SampleRateConverter.o \
            FIRResampler.o IIR2xResampler.o LinearResampler.o ResamplerModel.o \
            SincResampler.o InternalResampler.o \
            Synth.o Tables.o TVA.o TVF.o TVP.o sha1.o c_interface.o
endif

ifeq ($(CPPTHREADS), y)
 THREADOBJ := thread.o
else
 THREADOBJ := win_thread.o
endif

ifeq ($(VNC), y)
 OPTS   += -DUSE_VNC
 RFLAGS += -DUSE_VNC
 ifneq ($(VNC_PATH), )
  OPTS   += -I$(VNC_PATH)\INCLUDE
  VNCLIB := -L$(VNC_PATH)\LIB
 endif
 VNCLIB +=  -lvncserver.dll
 VNCOBJ := vnc.o vnc_keymap.o
endif

ifeq ($(MINITRACE), y)
 OPTS         += -DMTR_ENABLED
 RFLAGS       += -DMTR_ENABLED
 MINITRACEOBJ := minitrace.o
endif

ifeq ($(FAUDIO), y)
 OPTS += -DUSE_FAUDIO
endif

# Options for the DEV branch.
ifeq ($(DEV_BRANCH), y)
 OPTS     += -DDEV_BRANCH
 RFLAGS   += -DDEV_BRANCH
 DEVBROBJ :=

 ifeq ($(AMD_K5), y)
  OPTS += -DUSE_AMD_K5
 endif

 ifeq ($(AN430TX), y)
  OPTS += -DUSE_AN430TX
 endif

 ifeq ($(CYRIX_6X86), y)
  OPTS += -DUSE_CYRIX_6X86
 endif

 ifeq ($(DESKPRO386), y)
  OPTS += -DUSE_DESKPRO386
 endif

 ifeq ($(GUSMAX), y)
  OPTS += -DUSE_GUSMAX
 endif

 ifeq ($(ISAMEM_RAMPAGE), y)
  OPTS += -DUSE_ISAMEM_RAMPAGE
 endif

 ifeq ($(ISAMEM_IAB), y)
  OPTS += -DUSE_ISAMEM_IAB
 endif

 ifeq ($(ISAMEM_BRAT), y)
  OPTS += -DUSE_ISAMEM_BRAT
 endif

 ifeq ($(LASERXT), y)
  OPTS     += -DUSE_LASERXT
  DEVBROBJ += m_xt_laserxt.o
 endif

 ifeq ($(OPEN_AT), y)
  OPTS += -DUSE_OPEN_AT
 endif

 ifeq ($(OPL4ML), y)
  OPTS     += -DUSE_OPL4ML
  DEVBROBJ += midi_opl4.o midi_opl4_yrw801.o
 endif

 ifeq ($(PAS16), y)
  OPTS     += -DUSE_PAS16
  DEVBROBJ += snd_pas16.o
 endif

 ifeq ($(PCI_DUMMY), y)
  OPTS     += -DUSE_PCI_DUMMY
  DEVBROBJ += pci_dummy.o
 endif

 ifeq ($(SIO_DETECT), y)
  OPTS     += -DUSE_SIO_DETECT
  DEVBROBJ += sio_detect.o
 endif

 ifeq ($(VGAWONDER), y)
  OPTS += -DUSE_VGAWONDER
 endif

 ifeq ($(XL24), y)
  OPTS += -DUSE_XL24
 endif

 ifeq ($(OLIVETTI), y)
  OPTS     += -DUSE_OLIVETTI
  DEVBROBJ += olivetti_eva.o
 endif

 ifeq ($(GDBSTUB), y)
  OPTS     += -DUSE_GDBSTUB
  DEVBROBJ += gdbstub.o
 endif
endif

ifeq ($(RTMIDI), y)
 OPTS += -DUSE_RTMIDI
endif


# Final versions of the toolchain flags.
CFLAGS := $(OPTS) $(DFLAGS) $(COPTIM) $(AOPTIM) \
          $(AFLAGS) -fomit-frame-pointer -mstackrealign -Wall \
          -fno-strict-aliasing

# Add freetyp2 references through pkgconfig
CFLAGS := $(CFLAGS)  `pkg-config --cflags freetype2`

CXXFLAGS := $(OPTS) $(DFLAGS) $(CXXOPTIM) $(AOPTIM) \
            $(AFLAGS) -fomit-frame-pointer -mstackrealign -Wall \
            -fno-strict-aliasing

CFLAGS += -Werror=implicit-int -Werror=implicit-function-declaration \
          -Werror=int-conversion -Werror=strict-prototypes -Werror=old-style-definition


#########################################################################
#             Create the (final) list of objects to build.              #
#########################################################################
MAINOBJ := 86box.o config.o log.o random.o timer.o io.o acpi.o apm.o dma.o ddma.o \
           nmi.o pic.o pit.o pit_fast.o port_6x.o port_92.o ppi.o pci.o mca.o fifo.o \
           fifo8.o usb.o device.o nvr.o nvr_at.o nvr_ps2.o machine_status.o ini.o \
           $(VNCOBJ)

MEMOBJ := catalyst_flash.o i2c_eeprom.o intel_flash.o mem.o mmu_2386.o rom.o row.o \
          smram.o spd.o sst_flash.o

CPUOBJ := $(DYNARECOBJ) \
          $(CGTOBJ) \
          cpu.o cpu_table.o fpu.o x86.o \
          8080.o 808x.o 386.o 386_common.o 386_dynarec.o 386_dynarec_ops.o \
          x86_ops_mmx.o x86seg_common.o x86seg_2386.o x86seg.o x87.o x87_timings.o \
	  f2xm1.o fpatan.o fprem.o fsincos.o fyl2x.o softfloat_poly.o softfloat.o softfloat16.o \
	  softfloat-muladd.o softfloat-round-pack.o softfloat-specialize.o softfloatx80.o

CHIPSETOBJ := 82c100.o acc2168.o \
              compaq_386.o \
              contaq_82c59x.o \
              cs4031.o cs8230.o \
              ali1429.o ali1435.o ali1489.o ali1531.o ali1541.o ali1543.o ali1621.o ali6117.o \
              gc100.o headland.o \
              ims8848.o intel_82335.o intel_420ex.o intel_4x0.o intel_i450kx.o intel_sio.o intel_piix.o \
              ioapic.o \
              neat.o \
              opti283.o opti291.o opti391.o opti495.o opti602.o opti822.o opti895.o opti5x7.o \
              scamp.o scat.o \
              stpc.o \
              wd76c10.o vl82c480.o \
              umc_8886.o umc_hb4.o \
              via_vt82c49x.o via_vt82c505.o via_apollo.o via_pipc.o \
              sis_85c310.o sis_85c4xx.o sis_85c496.o sis_85c50x.o sis_5511.o sis_5571.o

MCHOBJ := machine.o machine_table.o \
          m_xt.o m_xt_compaq.o \
          m_xt_philips.o \
          m_xt_t1000.o m_xt_t1000_vid.o \
          m_xt_xi8088.o m_xt_zenith.o \
          m_pcjr.o \
          m_amstrad.o m_europc.o \
          m_elt.o \
          m_xt_olivetti.o m_tandy.o m_v86p.o \
          m_at.o m_at_commodore.o \
          m_at_t3100e.o m_at_t3100e_vid.o \
          m_ps1.o m_ps1_hdc.o \
          m_ps2_isa.o m_ps2_mca.o \
          m_at_compaq.o \
          m_at_286_386sx.o m_at_386dx_486.o \
          m_at_socket4.o m_at_socket5.o m_at_socket7_3v.o m_at_socket7.o m_at_sockets7.o \
          m_at_socket8.o m_at_slot1.o m_at_slot2.o m_at_socket370.o \
          m_at_misc.o

KBCOBJ := kbc_at.o kbc_at_dev.o \
          keyboard_at.o

DEVOBJ := bugger.o cartridge.o cassette.o hasp.o hwm.o hwm_lm75.o hwm_lm78.o hwm_gl518sm.o hwm_vt82c686.o \
          ibm_5161.o isamem.o isartc.o lpt.o pci_bridge.o postcard.o serial.o \
          clock_ics9xxx.o isapnp.o \
          i2c.o i2c_gpio.o smbus_ali7101.o smbus_piix4.o \
          keyboard.o \
          keyboard_xt.o $(KBCOBJ) \
          mouse.o \
          mouse_bus.o \
          mouse_serial.o mouse_ps2.o \
          mouse_wacom_tablet.o \
          nec_mate_unk.o phoenix_486_jumper.o \
          serial_passthrough.o \
          unittester.o

SIOOBJ := sio_acc3221.o sio_ali5123.o \
          sio_f82c710.o sio_82091aa.o sio_fdc37c6xx.o \
          sio_fdc37c67x.o sio_fdc37c669.o sio_fdc37c93x.o sio_fdc37m60x.o \
          sio_it86x1f.o \
          sio_pc87306.o sio_pc87307.o sio_pc87309.o sio_pc87310.o sio_pc87311.o sio_pc87332.o \
          sio_prime3b.o sio_prime3c.o \
          sio_w83787f.o \
          sio_w83877f.o sio_w83977f.o \
          sio_um8669f.o \
          sio_vt82c686.o

FDDOBJ := fdd.o fdc.o fdc_magitronic.o fdc_monster.o fdc_pii15xb.o \
          fdi2raw.o \
          fdd_common.o fdd_86f.o \
          fdd_fdi.o fdd_imd.o fdd_img.o fdd_json.o \
          fdd_mfm.o fdd_td0.o

GAMEOBJ := gameport.o \
           joystick_standard.o joystick_ch_flightstick_pro.o \
           joystick_sw_pad.o joystick_tm_fcs.o

HDDOBJ := hdd.o \
          hdd_image.o hdd_table.o \
          hdc.o \
          hdc_st506_xt.o hdc_st506_at.o \
          hdc_xta.o \
          hdc_esdi_at.o hdc_esdi_mca.o \
          hdc_xtide.o hdc_ide.o \
          hdc_ide_ali5213.o \
          hdc_ide_opti611.o \
          hdc_ide_cmd640.o hdc_ide_cmd646.o \
          hdc_ide_sff8038i.o

MINIVHDOBJ  := cwalk.o xml2_encoding.o convert.o \
               create.o minivhd_io.o manage.o struct_rw.o minivhd_util.o

CDROMOBJ := cdrom.o \
            cdrom_image_backend.o cdrom_image_viso.o cdrom_image.o cdrom_mitsumi.o

ZIPOBJ := zip.o

MOOBJ := mo.o

SCSIOBJ := scsi.o scsi_device.o \
           scsi_cdrom.o scsi_disk.o \
           scsi_x54x.o \
           scsi_aha154x.o scsi_buslogic.o \
           scsi_ncr5380.o scsi_ncr53c8xx.o \
           scsi_pcscsi.o scsi_spock.o

NETOBJ := network.o \
          net_pcap.o \
          net_slirp.o \
          net_dp8390.o net_3c501.o \
          net_3c503.o net_ne2000.o \
          net_pcnet.o net_wd8003.o \
          net_plip.o net_event.o \
          net_null.o \
          net_eeprom_nmc93cxx.o \
          net_tulip.o \
          net_rtl8139.o \
          net_l80225.o

PRINTOBJ := png.o prt_cpmap.o \
            prt_escp.o prt_text.o prt_ps.o

SNDOBJ := sound.o \
          snd_opl.o snd_opl_nuked.o snd_opl_ymfm.o \
          ymfm_adpcm.o ymfm_misc.o ymfm_opl.o ymfm_opm.o \
          ymfm_opn.o ymfm_opq.o ymfm_opz.o ymfm_pcm.o ymfm_ssg.o \
          snd_resid.o \
          convolve.o convolve-sse.o envelope.o extfilt.o \
          filter.o pot.o sid.o voice.o wave6581__ST.o \
          wave6581_P_T.o wave6581_PS_.o wave6581_PST.o \
          wave8580__ST.o wave8580_P_T.o wave8580_PS_.o \
          wave8580_PST.o wave.o \
          midi.o \
          snd_speaker.o \
          snd_pssj.o \
          snd_ps1.o \
          snd_lpt_dac.o snd_lpt_dss.o \
          snd_adlib.o snd_adlibgold.o snd_ad1848.o snd_audiopci.o \
          snd_ac97_codec.o snd_ac97_via.o \
          snd_azt2316a.o snd_cs423x.o \
          snd_optimc.o snd_cmi8x38.o \
          snd_cms.o \
          snd_gus.o \
          snd_sb.o snd_sb_dsp.o \
          snd_emu8k.o snd_mpu401.o \
          snd_sn76489.o snd_ssi2001.o \
          snd_wss.o \
          snd_ym7128.o

VIDOBJ := agpgart.o video.o \
          vid_table.o \
          vid_cga.o vid_cga_comp.o \
          vid_compaq_cga.o \
          vid_mda.o \
          vid_hercules.o vid_herculesplus.o vid_incolor.o \
          vid_colorplus.o \
          vid_genius.o \
          vid_pgc.o vid_im1024.o \
          vid_sigma.o \
          vid_wy700.o \
          vid_ega.o vid_ega_render.o \
          vid_svga.o vid_svga_render.o \
          vid_8514a.o \
          vid_ddc.o \
          vid_vga.o \
          vid_ati_eeprom.o \
          vid_ati18800.o vid_ati28800.o \
          vid_ati_mach8.o \
          vid_ati68875_ramdac.o \
          vid_ati_mach64.o vid_ati68860_ramdac.o \
          vid_bt48x_ramdac.o \
          vid_chips_69000.o \
          vid_av9194.o vid_icd2061.o vid_ics2494.o vid_ics2595.o \
          vid_cl54xx.o \
          vid_et3000.o \
          vid_et4000.o vid_sc1148x_ramdac.o \
          vid_sc1502x_ramdac.o \
          vid_et4000w32.o vid_stg_ramdac.o \
          vid_ht216.o \
          vid_oak_oti.o \
          vid_paradise.o \
          vid_rtg310x.o \
          vid_ti_cf62011.o \
          vid_f82c425.o \
          vid_tvga.o \
          vid_tgui9440.o vid_tkd8001_ramdac.o \
          vid_att20c49x_ramdac.o \
          vid_att2xc498_ramdac.o \
          vid_s3.o vid_s3_virge.o \
          vid_ibm_rgb528_ramdac.o vid_sdac_ramdac.o \
          vid_ogc.o \
          vid_mga.o \
          vid_nga.o \
          vid_tvp3026_ramdac.o \
          vid_xga.o

VOODOOOBJ := vid_voodoo.o vid_voodoo_banshee.o \
             vid_voodoo_banshee_blitter.o \
             vid_voodoo_blitter.o \
             vid_voodoo_display.o vid_voodoo_fb.o \
             vid_voodoo_fifo.o vid_voodoo_reg.o \
             vid_voodoo_render.o vid_voodoo_setup.o \
             vid_voodoo_texture.o

PLATOBJ := win.o \
           win_dynld.o \
           win_cdrom.o win_keyboard.o \
           win_mouse.o win_serial_passthrough.o

UIOBJ := win_ui.o win_icon.o win_stbar.o discord.o \
         win_sdl.o win_opengl.o win_opengl_glslp.o glad.o \
         win_dialog.o win_about.o \
         win_settings.o win_devconf.o win_snd_gain.o win_specify_dim.o win_preferences.o \
         win_new_floppy.o win_jsconf.o \
         win_media_menu.o win_toolbar.o

ifeq ($(DINPUT), y)
 PLATOBJ += win_joystick.o
else
 PLATOBJ += win_joystick_rawinput.o
endif

ifeq ($(OPENAL), y)
 SNDOBJ += openal.o
else
 SNDOBJ += xaudio2.o
endif

ifeq ($(RTMIDI), y)
 SNDOBJ += midi_rtmidi.o
endif

OBJ := $(MAINOBJ) $(CPUOBJ) $(CHIPSETOBJ) $(MCHOBJ) $(DEVOBJ) $(MEMOBJ) \
       $(FDDOBJ) $(GAMEOBJ) $(CDROMOBJ) $(ZIPOBJ) $(MOOBJ) $(HDDOBJ) $(MINIVHDOBJ) \
       $(NETOBJ) $(PRINTOBJ) $(SCSIOBJ) $(SIOOBJ) $(SNDOBJ) $(VIDOBJ) $(VOODOOOBJ) \
       $(PLATOBJ) $(UIOBJ) $(FSYNTHOBJ) $(MUNTOBJ) $(DEVBROBJ) $(MINITRACEOBJ) $(THREADOBJ)
ifdef EXOBJ
 OBJ += $(EXOBJ)
endif

ifeq ($(LOG), y)
 MWIN := -lcomdlg32
else
 MWIN := -mwindows
endif

LIBS := -lfreetype -lfluidsynth -lslirp -lbz2 -lharfbuzz -lgraphite2 -lbrotlidec \
        -lbrotlicommon -lusp10 -lrpcrt4 -lgomp -lsndfile -lflac -lmp3lame -lmpg123 \
        -lopus -lvorbis -lvorbisenc -logg -ldsound -lshlwapi -lksuser -lreadline \
        -ltermcap -lportaudio -lgmodule-2.0 -lglib-2.0 -lintl -liconv

ifeq ($(OPENAL), y)
 LIBS += $(MWIN) -lopenal -lcomctl32 -lSDL2 -limagehlp -ldinput8 -ldxguid -ldxerr8 \
         -luser32 -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 -lshell32 -lversion \
         -luuid -lws2_32
else
 ifeq ($(FAUDIO), y)
  LIBS += $(MWIN) -lfaudio -lcomctl32 -lSDL2 -limagehlp -ldinput8 -ldxguid -ldxerr8 \
          -luser32 -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 -lshell32 -lversion \
          -luuid -lws2_32
 else
  LIBS += $(MWIN) -lcomctl32 -lSDL2 -limagehlp -ldinput8 -ldxguid -ldxerr8 -luser32 \
          -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 -lshell32 -lversion -luuid \
          -lws2_32
 endif
endif

ifeq ($(RTMIDI), y)
 ifeq ($(CLANG), y)
  LIBS +=  -lrtmidi.dll -lwinmm
 else
  LIBS +=  -lrtmidi -lwinmm
 endif
endif

ifeq ($(VNC), y)
 LIBS += $(VNCLIB) -lws2_32
endif
ifeq ($(CLANG), y)
 LIBS += -lpng -lz -lwsock32 -liphlpapi -lpsapi -lhid -lsetupapi -luxtheme -static -lstdc++.dll
else
 LIBS += -lpng -lz -lwsock32 -liphlpapi -lpsapi -lhid -lsetupapi -luxtheme -static -lstdc++
endif
ifneq ($(X64), y)
 ifneq ($(ARM64), y)
  LIBS += -Wl,--large-address-aware
 endif
endif
ifeq ($(ARM64), y)
 LIBS += -lgcc
endif
ifeq ($(DINPUT), y)
 LIBS += -ldinput8
endif

LIBS += -static

# Build module rules.
ifeq ($(AUTODEP), y)
%.o: %.c
	@echo $<
	@$(CC) $(CFLAGS) $(DEPS) -c $<

%.o: %.cc
	@echo $<
	@$(CPP) $(CXXFLAGS) $(DEPS) -c $<

%.o: %.cpp
	@echo $<
	@$(CPP) $(CXXFLAGS) $(DEPS) -c $<
else
%.o: %.c
	@echo $<
	@$(CC) $(CFLAGS) -c $<

%.o: %.cc
	@echo $<
	@$(CPP) $(CXXFLAGS) -c $<

%.o: %.cpp
	@echo $<
	@$(CPP) $(CXXFLAGS) -c $<

%.d: %.c $(wildcard $*.d)
	@echo $<
	@$(CC) $(CFLAGS) $(DEPS) -E $< >/dev/null

%.d: %.cc $(wildcard $*.d)
	@echo $<
	@$(CPP) $(CXXFLAGS) $(DEPS) -E $< >/dev/null

%.d: %.cpp $(wildcard $*.d)
	@echo $<
	@$(CPP) $(CXXFLAGS) $(DEPS) -E $< >/dev/null
endif

# Suppress false positive warnings in vid_voodoo_codegen_x86[-64].h
# that cause ~3000 lines to be output into the logs each time.
ifneq ($(CLANG), y)
 $(VOODOOOBJ): CFLAGS += -Wstringop-overflow=0
endif

all: $(PROG).exe


86Box.res: 86Box.rc
	@echo Processing $<
	@$(WINDRES) -v $(RFLAGS) $(EXTRAS) -i $< -o 86Box.res

$(PROG).exe: $(OBJ) 86Box.res
	@echo Linking $(PROG).exe ..
	@$(CC) $(LDFLAGS) -o $(PROG).exe $(OBJ) 86Box.res $(LIBS) -pipe
ifneq ($(DEBUG), y)
	@$(STRIP) $(PROG).exe
endif

pcap_if.res: pcap_if.rc
	@echo Processing $<
	@$(WINDRES) $(RFLAGS) -i $< -o pcap_if.res

pcap_if.exe: pcap_if.o win_dynld.o pcap_if.res
	@echo Linking pcap_if.exe ..
	@$(CC) $(LDFLAGS) -o pcap_if.exe pcap_if.o win_dynld.o pcap_if.res
ifneq ($(DEBUG), y)
	@$(STRIP) pcap_if.exe
endif

hello.exe: hello.o
	$(CXX) $(LDFLAGS) -o hello.exe hello.o $(LIBS)
ifneq ($(DEBUG), y)
	@$(STRIP) hello.exe
endif


clean:
	@echo Cleaning objects..
	@-rm -f *.o 2>/dev/null
	@-rm -f *.res 2>/dev/null

clobber: clean
	@echo Cleaning executables..
	@-rm -f *.d 2>/dev/null
	@-rm -f *.exe 2>/dev/null
#	@-rm -f $(DEPFILE) 2>/dev/null

ifneq ($(AUTODEP), y)
depclean:
	@-rm -f $(DEPFILE) 2>/dev/null
	@echo Creating dependencies..
	@echo # Run "make depends" to re-create this file. >$(DEPFILE)

depends: DEPOBJ=$(OBJ:%.o=%.d)
depends: depclean $(OBJ:%.o=%.d)
	@-cat $(DEPOBJ) >>$(DEPFILE)
	@-rm -f $(DEPOBJ)

$(DEPFILE):
endif


# Module dependencies.
ifeq ($(AUTODEP), y)
#-include $(OBJ:%.o=%.d)  (better, but sloooowwwww)
-include *.d
else
include $(wildcard $(DEPFILE))
endif


# End of Makefile.mingw.
