#
# Makefile for EDGE/Linux
#

CC=gcc
AS=nasm -f elf

DEBUG=1
#PROFILE=1
#RELEASE=1

LX_DIR=.
MAIN_DIR=..
LZO_DIR=$(MAIN_DIR)/lzo

X_NAME=lxedge
X_FLAGS=
X_LDFLAGS=-L/usr/X11R6/lib
X_OBJS=$(LX_DIR)/iv_x.o
X_LIBS=-lX11 -lXext

GGI_NAME=ggiedge
GGI_FLAGS=-DUSE_WMH
GGI_LDFLAGS=
GGI_OBJS=$(LX_DIR)/iv_ggi.o
GGI_LIBS=-lggi -lggiwmh

GL_NAME=gledge
GL_FLAGS=-DUSE_GL -DINIT_GLUT
GL_LDFLAGS=-L/usr/X11R6/lib
GL_OBJS=$(LX_DIR)/iv_gl.o
GL_LIBS=-lGL -lGLU -lglut  -lX11 -lXext -lXmu -lXt -lXi -lSM -lICE

SDL_NAME=sdledge
SDL_FLAGS=-I/usr/local/include/SDL
SDL_LDFLAGS=-L/usr/X11R6/lib
SDL_OBJS=$(LX_DIR)/iv_sdl.o
SDL_LIBS=-lpthread -lSDL

# --- select assembly here ---
ASM_DIR=$(MAIN_DIR)/noasm
ASM_FLAGS=
ASM_OBJS=$(ASM_NULL_OBJS)
#ASM_DIR=$(MAIN_DIR)/i386
#ASM_FLAGS=-DASM_NEED_UNDERSCORES
#ASM_OBJS=$(ASM_I386_OBJS)

# --- select graphic target here ---
PROGNAME=$(X_NAME)
VIDEO_LIBS=$(X_LIBS)
VIDEO_OBJS=$(X_OBJS)
VIDEO_FLAGS=$(X_FLAGS)
VIDEO_LDFLAGS=$(X_ldFLAGS)

# -- select optimisation here ---
OPT_CFLAGS=-O3
#OPT_CFLAGS=-O -g

CPPFLAGS=-I- -I$(LX_DIR) -I$(MAIN_DIR)
CFLAGS=-Wall $(OPT_CFLAGS) -DLINUX -DDEVELOPERS $(ASM_FLAGS) $(VIDEO_FLAGS)
LDFLAGS=-Xlinker --warn-common $(VIDEO_LDFLAGS)
LIBS=-lm $(VIDEO_LIBS)

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

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

#obJS=$(COMMON_OBJS) $(ASM_OBJS) $(SYSTEM_OBJS) $(VIDEO_OBJS) $(LZO_OBJS)
OBJS=$(COMMON_OBJS) $(ASM_OBJS) $(SYSTEM_OBJS) $(VIDEO_OBJS)

SYSTEM_OBJS= \
        $(LX_DIR)/i_main.o  $(LX_DIR)/i_music.o  \
        $(LX_DIR)/i_net.o   $(LX_DIR)/i_sound.o  \
        $(LX_DIR)/i_ctrl.o  $(LX_DIR)/i_compen.o \
        $(LX_DIR)/i_system.o $(LX_DIR)/i_cd.o    \
        $(LX_DIR)/i_mussrv.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_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)/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_mobj.o                         \
        $(MAIN_DIR)/p_plane.o $(MAIN_DIR)/p_bot.o    \
        $(MAIN_DIR)/p_weapon.o $(MAIN_DIR)/p_saveg.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_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_gl.o $(MAIN_DIR)/r2_poly.o    \
        $(MAIN_DIR)/r2_util.o                        \
        \
        $(MAIN_DIR)/rad_act.o $(MAIN_DIR)/rad_pars.o  \
        $(MAIN_DIR)/rad_trig.o $(MAIN_DIR)/s_util.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)/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

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

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

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

all:    $(MAIN_DIR)/$(PROGNAME)

clean:
	rm -f $(MAIN_DIR)/$(PROGNAME) $(LX_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

# ----- INTERNAL RELEASES --------------------------------------------

BIN_FILES=djgpp/edge.* win32/[eE]dge.*

SRC_FILES=*.[ch] djgpp/*.[ch] djgpp/*.bat win32/*.[ch] win32/*.bat  \
          win32/Debug win32/Release win32/*.bcc linux/*.[ch]  \
          linux/Makefile linux/README null/*.[ch]  \
          noasm/*.[ch] i386/*.[ch]  \
          lzo/COPYING lzo/README* lzo/*.[ch]  \
          i386/*.asm contrib/* docs/* log/*  \
          djgpp/obj djgpp/obj/i386 win32/obj

tarball:
	cd ../..; make -f edge/linux/Makefile do_good_tarball

zipball:
	cd ..; make -f linux/Makefile do_zipball

do_tarball:
	rm -f /tmp/edge.zip
	-zip -0 /tmp/edge.zip $(BIN_FILES)
	zip -0 -l /tmp/edge.zip $(SRC_FILES)
	mkdir /tmp/edge_temp
	cd /tmp/edge_temp; unzip /tmp/edge.zip
	cd /tmp/edge_temp; tar cf /tmp/edge.tar .
	bzip2 /tmp/edge.tar

do_good_tarball:
	rm -f /tmp/edge.tgz
	tar czf /tmp/edge.tgz  \
        $(patsubst %,edge/%,$(BIN_FILES) $(SRC_FILES))

do_zipball:
	rm -f /tmp/edge.zip
	-zip /tmp/edge.zip $(BIN_FILES)
	zip -l /tmp/edge.zip $(SRC_FILES)

.PHONY: tarball do_tarball do_good_tarball zipball do_zipball

