#
# Makefile for EDGE/Linux
#
# (Note: requires GNU make)

# --- variables that can be overridden ---

# compiler
CC=gcc

# assembler (for the .asm files)
AS=nasm -f coff

# optimisation
#OPTIM=-O3
OPTIM=-O -g

# Assembly options: N Y
ASSEM=N

DEBUG=1
#PROFILE=1
#RELEASE=1

# Video options: ALLEG
VIDEO=ALLEG

# Sound options: ALLEG
SOUND=ALLEG

# --- internal stuff from here on ---

DJ_DIR=.
MAIN_DIR=..
OBJ_DIR=obj
LZO_DIR=$(MAIN_DIR)/lzo
GLBSP_DIR=$(MAIN_DIR)/glbsp

V_ALLEG_NAME=edge.exe
V_ALLEG_FLAGS=
V_ALLEG_LDFLAGS=
V_ALLEG_OBJS=$(DJ_DIR)/i_video.o
V_ALLEG_LIBS=-lalleg

S_ALLEG_FLAGS=
S_ALLEG_LDFLAGS=
S_ALLEG_OBJS=$(DJ_DIR)/i_sound.o
S_ALLEG_LIBS=

ASM_N_DIR=$(MAIN_DIR)/noasm
ASM_N_FLAGS=
ASM_N_OBJS=$(ASM_NULL_OBJS)

ASM_Y_DIR=$(MAIN_DIR)/i386
ASM_Y_FLAGS=-DASM_NEED_UNDERSCORES
ASM_Y_OBJS=$(ASM_I386_OBJS)

# --- putting it all together ---

PROGNAME=$(V_$(VIDEO)_NAME)

ASM_DIR=$(ASM_$(ASSEM)_DIR)

CPPFLAGS=-I$(DJ_DIR) -I$(MAIN_DIR) -I$(LZO_DIR)

CFLAGS=-Wall $(OPTIM) -DDEVELOPERS  \
       $(ASM_$(ASSEM)_FLAGS) $(V_$(VIDEO)_FLAGS)  \
       $(S_$(SOUND)_FLAGS)

CFLAGS_LZO=-Wall -O2 -I- -I$(LZO_DIR)

LDFLAGS=-Xlinker $(V_$(VIDEO)_LDFLAGS)  \
        $(S_$(SOUND)_LDFLAGS)

LIBS=-lm $(V_$(VIDEO)_LIBS) $(S_$(SOUND)_LIBS)


# ----- OBJECTS --------------------------------------------------------

OBJS=$(COMMON_OBJS) $(SYSTEM_OBJS) $(ASM_$(ASSEM)_OBJS)  \
     $(V_$(VIDEO)_OBJS) $(S_$(SOUND)_OBJS) $(LZO_OBJS)  \
     $(GLBSP_OBJS)

SYSTEM_OBJS= \
        $(DJ_DIR)/i_main.o  $(DJ_DIR)/i_music.o  \
        $(DJ_DIR)/i_net.o   $(DJ_DIR)/i_mus.o    \
        $(DJ_DIR)/i_ctrl.o  $(DJ_DIR)/i_compen.o \
        $(DJ_DIR)/i_system.o $(DJ_DIR)/i_cd.o

COMMON_OBJS= \
        $(MAIN_DIR)/am_map.o $(MAIN_DIR)/con_main.o   \
        $(MAIN_DIR)/con_cvar.o $(MAIN_DIR)/con_con.o  \
        $(MAIN_DIR)/e_main.o $(MAIN_DIR)/e_net.o      \
        \
        $(MAIN_DIR)/ddf_anim.o $(MAIN_DIR)/ddf_atk.o  \
        $(MAIN_DIR)/ddf_boom.o $(MAIN_DIR)/ddf_colm.o \
        $(MAIN_DIR)/ddf_game.o $(MAIN_DIR)/ddf_lang.o \
        $(MAIN_DIR)/ddf_levl.o $(MAIN_DIR)/ddf_line.o \
        $(MAIN_DIR)/ddf_main.o $(MAIN_DIR)/ddf_mobj.o \
        $(MAIN_DIR)/ddf_mus.o  $(MAIN_DIR)/ddf_stat.o \
        $(MAIN_DIR)/ddf_sect.o $(MAIN_DIR)/ddf_sfx.o  \
        $(MAIN_DIR)/ddf_swth.o $(MAIN_DIR)/ddf_weap.o \
        \
        $(MAIN_DIR)/dm_defs.o  $(MAIN_DIR)/dm_state.o \
        $(MAIN_DIR)/f_finale.o $(MAIN_DIR)/g_game.o   \
        $(MAIN_DIR)/gui_main.o $(MAIN_DIR)/gui_ctls.o \
        $(MAIN_DIR)/hu_lib.o $(MAIN_DIR)/hu_stuff.o   \
        $(MAIN_DIR)/lu_math.o  $(MAIN_DIR)/lu_gamma.o \
        $(MAIN_DIR)/l_glbsp.o                         \
        $(MAIN_DIR)/m_argv.o                          \
        $(MAIN_DIR)/m_bbox.o $(MAIN_DIR)/m_cheat.o    \
        $(MAIN_DIR)/m_fixed.o $(MAIN_DIR)/m_menu.o    \
        $(MAIN_DIR)/m_misc.o $(MAIN_DIR)/m_option.o   \
        $(MAIN_DIR)/m_math.o $(MAIN_DIR)/m_crc32.o    \
        $(MAIN_DIR)/m_random.o                        \
        \
        $(MAIN_DIR)/p_action.o $(MAIN_DIR)/p_enemy.o \
        $(MAIN_DIR)/p_inter.o $(MAIN_DIR)/p_lights.o \
        $(MAIN_DIR)/p_map.o   $(MAIN_DIR)/p_maputl.o \
        $(MAIN_DIR)/p_bot.o   $(MAIN_DIR)/p_mobj.o   \
        $(MAIN_DIR)/p_plane.o $(MAIN_DIR)/p_weapon.o \
        $(MAIN_DIR)/p_setup.o $(MAIN_DIR)/p_sight.o  \
        $(MAIN_DIR)/p_spec.o $(MAIN_DIR)/p_switch.o  \
        $(MAIN_DIR)/p_tick.o $(MAIN_DIR)/p_user.o    \
        \
        $(MAIN_DIR)/r_bsp.o $(MAIN_DIR)/r_data.o     \
        $(MAIN_DIR)/r_draw1.o $(MAIN_DIR)/r_draw2.o  \
        $(MAIN_DIR)/r_main.o $(MAIN_DIR)/r_plane.o   \
        $(MAIN_DIR)/r_segs.o $(MAIN_DIR)/r_layers.o  \
        $(MAIN_DIR)/r_sky.o  $(MAIN_DIR)/r_things.o  \
        $(MAIN_DIR)/r_view.o $(MAIN_DIR)/r_vbinit.o  \
        $(MAIN_DIR)/r2_bsp.o $(MAIN_DIR)/r2_draw.o   \
        $(MAIN_DIR)/r2_util.o  \
        $(MAIN_DIR)/rgl_bsp.o $(MAIN_DIR)/rgl_main.o \
        $(MAIN_DIR)/rgl_tex.o                        \
        \
        $(MAIN_DIR)/rad_act.o $(MAIN_DIR)/rad_pars.o  \
        $(MAIN_DIR)/rad_trig.o $(MAIN_DIR)/sv_chunk.o \
        $(MAIN_DIR)/sv_dump.o  $(MAIN_DIR)/sv_glob.o  \
        $(MAIN_DIR)/sv_main.o  $(MAIN_DIR)/sv_mobj.o  \
        $(MAIN_DIR)/sv_load.o  $(MAIN_DIR)/sv_save.o  \
        $(MAIN_DIR)/sv_level.o $(MAIN_DIR)/sv_misc.o  \
        $(MAIN_DIR)/sv_play.o  \
        $(MAIN_DIR)/s_sound.o $(MAIN_DIR)/s_music.o   \
        $(MAIN_DIR)/st_lib.o  $(MAIN_DIR)/st_stuff.o  \
        $(MAIN_DIR)/v_func.o  $(MAIN_DIR)/v_screen.o  \
        $(MAIN_DIR)/v_res.o $(MAIN_DIR)/v_colour.o    \
        $(MAIN_DIR)/v_video1.o $(MAIN_DIR)/v_video2.o \
        $(MAIN_DIR)/v_toplev.o $(MAIN_DIR)/w_image.o  \
        $(MAIN_DIR)/w_wad.o $(MAIN_DIR)/wi_stuff.o    \
        $(MAIN_DIR)/wp_main.o $(MAIN_DIR)/wp_wipe.o   \
        $(MAIN_DIR)/w_textur.o $(MAIN_DIR)/z_zone.o


ASM_NULL_OBJS= \
        $(MAIN_DIR)/noasm/i_asm.o 

ASM_I386_OBJS= \
        $(MAIN_DIR)/i386/i_asm.o    $(MAIN_DIR)/i386/i_cpu.o    \
        $(MAIN_DIR)/i386/r_column.o $(MAIN_DIR)/i386/r_resize.o \
        $(MAIN_DIR)/i386/r_span.o

LZO_OBJS= \
        $(LZO_DIR)/minilzo.o

GLBSP_OBJS=$(GLBSP_DIR)/plugin/libglbsp.a


# ----- RULES --------------------------------------------------------

%.o: %.asm
	$(AS) $< -o $@


# ----- TARGETS ------------------------------------------------------

all:    $(MAIN_DIR)/$(PROGNAME)

clean:
	rm -f $(MAIN_DIR)/$(PROGNAME) $(DJ_DIR)/*.o \
        $(MAIN_DIR)/*.o $(ASM_DIR)/*.o

renderclean:
	rm -f $(MAIN_DIR)/$(PROGNAME) $(MAIN_DIR)/r*.o

$(MAIN_DIR)/$(PROGNAME): $(OBJS)
	$(CC) $(CFLAGS) $(LDFLAGS) $(OBJS) -o $(MAIN_DIR)/$(PROGNAME) $(LIBS)

$(LZO_DIR)/minilzo.o: $(LZO_DIR)/*.[ch]
	$(CC) $(CFLAGS_LZO) -c $(LZO_DIR)/minilzo.c -o $@

.PHONY: all clean renderclean

