###############################################################################
#
# Makefile to build XZ Utils using EMX
#
# Author: Lasse Collin, Mikulas Patocka
#
# This file has been put into the public domain.
# You can do whatever you want with this file.
#
###############################################################################

prefix = e:/usr/local/xz

INCDIR = $(prefix)/include
LIBDIR = ${prefix}/lib
DLLDIR = ${prefix}/bin
BINDIR = ${prefix}/bin
MANDIR = ${prefix}/man

# For debugging, set comment "#define NDEBUG 1" from config.h to enable
# the assert() macro, set STRIP=rem to disable stripping, and finally
# e.g. CFLAGS="-g -O0".
CC = gcc
STRIP = emxbind -s
CPPFLAGS =
THREADING = -Zmt
CFLAGS = -Wall -Wextra -Wfatal-errors -O3 $(THREADING)
LDFLAGS = -Zcrtdll $(THREADING)

# NOTE: -fgnu89-inline is needed on DJGPP 2.04 beta and GCC >= 4.3.0
# because time.h uses GNU-style "extern inline".
ALL_CFLAGS = -std=gnu99

ALL_CPPFLAGS = \
	-I. \
	-I../lib \
	-I../src/common \
	-I../src/liblzma/api \
	-I../src/liblzma/common \
	-I../src/liblzma/check \
	-I../src/liblzma/rangecoder \
	-I../src/liblzma/lz \
	-I../src/liblzma/lzma \
	-I../src/liblzma/delta \
	-I../src/liblzma/simple \
	-DHAVE_CONFIG_H

ALL_CPPFLAGS += $(CPPFLAGS)
ALL_CFLAGS += $(CFLAGS)

.PHONY: all
all: xz.exe xzdec.exe lzmainfo.exe lzma_s.a lzma_s.lib lzma.a lzma.lib lzma.dll

SRCS_LIB_C = \
	../src/common/tuklib_physmem.c \
	../src/liblzma/check/check.c \
	../src/liblzma/check/crc32_table.c \
	../src/liblzma/check/crc64_table.c \
	../src/liblzma/check/sha256.c \
	../src/liblzma/common/alone_decoder.c \
	../src/liblzma/common/alone_encoder.c \
	../src/liblzma/common/auto_decoder.c \
	../src/liblzma/common/block_buffer_decoder.c \
	../src/liblzma/common/block_buffer_encoder.c \
	../src/liblzma/common/block_decoder.c \
	../src/liblzma/common/block_encoder.c \
	../src/liblzma/common/block_header_decoder.c \
	../src/liblzma/common/block_header_encoder.c \
	../src/liblzma/common/block_util.c \
	../src/liblzma/common/common.c \
	../src/liblzma/common/easy_buffer_encoder.c \
	../src/liblzma/common/easy_decoder_memusage.c \
	../src/liblzma/common/easy_encoder_memusage.c \
	../src/liblzma/common/easy_encoder.c \
	../src/liblzma/common/easy_preset.c \
	../src/liblzma/common/filter_buffer_decoder.c \
	../src/liblzma/common/filter_buffer_encoder.c \
	../src/liblzma/common/filter_common.c \
	../src/liblzma/common/filter_decoder.c \
	../src/liblzma/common/filter_encoder.c \
	../src/liblzma/common/filter_flags_decoder.c \
	../src/liblzma/common/filter_flags_encoder.c \
	../src/liblzma/common/hardware_physmem.c \
	../src/liblzma/common/index.c \
	../src/liblzma/common/index_decoder.c \
	../src/liblzma/common/index_encoder.c \
	../src/liblzma/common/index_hash.c \
	../src/liblzma/common/stream_buffer_decoder.c \
	../src/liblzma/common/stream_buffer_encoder.c \
	../src/liblzma/common/stream_decoder.c \
	../src/liblzma/common/stream_encoder.c \
	../src/liblzma/common/stream_flags_common.c \
	../src/liblzma/common/stream_flags_decoder.c \
	../src/liblzma/common/stream_flags_encoder.c \
	../src/liblzma/common/vli_decoder.c \
	../src/liblzma/common/vli_encoder.c \
	../src/liblzma/common/vli_size.c \
	../src/liblzma/delta/delta_common.c \
	../src/liblzma/delta/delta_decoder.c \
	../src/liblzma/delta/delta_encoder.c \
	../src/liblzma/lz/lz_decoder.c \
	../src/liblzma/lz/lz_encoder.c \
	../src/liblzma/lz/lz_encoder_mf.c \
	../src/liblzma/lzma/fastpos_table.c \
	../src/liblzma/lzma/lzma2_decoder.c \
	../src/liblzma/lzma/lzma2_encoder.c \
	../src/liblzma/lzma/lzma_decoder.c \
	../src/liblzma/lzma/lzma_encoder.c \
	../src/liblzma/lzma/lzma_encoder_optimum_fast.c \
	../src/liblzma/lzma/lzma_encoder_optimum_normal.c \
	../src/liblzma/lzma/lzma_encoder_presets.c \
	../src/liblzma/rangecoder/price_table.c \
	../src/liblzma/simple/arm.c \
	../src/liblzma/simple/armthumb.c \
	../src/liblzma/simple/ia64.c \
	../src/liblzma/simple/powerpc.c \
	../src/liblzma/simple/simple_coder.c \
	../src/liblzma/simple/simple_decoder.c \
	../src/liblzma/simple/simple_encoder.c \
	../src/liblzma/simple/sparc.c \
	../src/liblzma/simple/x86.c

SRCS_LIB_ASM = \
	../src/liblzma/check/crc32_x86.S \
	../src/liblzma/check/crc64_x86.S

SRCS_XZ_C = \
	../lib/getopt.c \
	../lib/getopt1.c \
	../src/common/tuklib_cpucores.c \
	../src/common/tuklib_exit.c \
	../src/common/tuklib_mbstr_fw.c \
	../src/common/tuklib_mbstr_width.c \
	../src/common/tuklib_open_stdxxx.c \
	../src/common/tuklib_progname.c \
	../src/xz/args.c \
	../src/xz/coder.c \
	../src/xz/file_io.c \
	../src/xz/hardware.c \
	../src/xz/list.c \
	../src/xz/main.c \
	../src/xz/message.c \
	../src/xz/options.c \
	../src/xz/signals.c \
	../src/xz/suffix.c \
	../src/xz/util.c

SRCS_XZDEC_C = \
	../lib/getopt.c \
	../lib/getopt1.c \
	../src/common/tuklib_exit.c \
	../src/common/tuklib_progname.c \
	../src/xzdec/xzdec.c

SRCS_LZMAINFO_C = \
	../lib/getopt.c \
	../lib/getopt1.c \
	../src/common/tuklib_exit.c \
	../src/common/tuklib_progname.c \
	../src/lzmainfo/lzmainfo.c

OBJS_LIB_C = $(SRCS_LIB_C:.c=.o)
OBJS_LIB_ASM = $(SRCS_LIB_ASM:.S=.o)
OBJS_LIB = $(OBJS_LIB_C) $(OBJS_LIB_ASM)
OBJS_XZ_C = $(SRCS_XZ_C:.c=.o)
OBJS_XZDEC_C = $(SRCS_XZDEC_C:.c=.o)
OBJS_LZMAINFO_C = $(SRCS_LZMAINFO_C:.c=.o)

%.o: %.c
	$(CC) $(ALL_CPPFLAGS) $(ALL_CFLAGS) -c -o $@ $<

%.o: %.S
	$(CC) $(ALL_CPPFLAGS) $(ALL_CFLAGS) -c -o $@ $<

$(OBJS_C): getopt.h

lzma_s.a : $(OBJS_LIB)
	-del lzma_s.a
	ar cqs lzma_s.a $(OBJS_LIB)

lzma_s.lib : lzma_s.a
	emxomf -o lzma_s.lib lzma_s.a

lzma.def1 : lzma_s.lib
	emxexp lzma_s.lib >lzma.def1

lzma.def : lzma.def0 lzma.def1
	copy lzma.def0+lzma.def1 lzma.def

lzma.a : lzma.def
	emximp -o lzma.a lzma.def

lzma.lib : lzma.def
	emximp -o lzma.lib lzma.def

lzma.dll : $(OBJS_LIB) lzma.def
	emxomf $(OBJS_LIB)
	$(CC) $(ALL_CFLAGS) $(LDFLAGS) -Zdll -o lzma.dll $(OBJS_LIB:.o=.obj) lzma.def -Zomf

xz.exe: $(OBJS_XZ_C) lzma.a
	$(CC) $(ALL_CFLAGS) $(OBJS_XZ_C) -L. -llzma $(LDFLAGS) -o $@
	$(STRIP) $@

xzdec.exe: $(OBJS_XZDEC_C) lzma.a
	$(CC) $(ALL_CFLAGS) $(OBJS_XZDEC_C) -L. -llzma $(LDFLAGS) -o $@
	$(STRIP) $@

lzmainfo.exe: $(OBJS_LZMAINFO_C) lzma.a
	$(CC) $(ALL_CFLAGS) $(OBJS_LZMAINFO_C) -L. -llzma $(LDFLAGS) -o $@
	$(STRIP) $@

clean:
	-find .. -name "*.o" | xargs rm -f
	-find .. -name "*.obj" | xargs rm -f
	-rm -f *.exe *.a *.lib *.dll lzma.def lzma.def1

install: all
	@install -d $(INCDIR)
	@install -d $(INCDIR)/lzma
	@install -d $(LIBDIR)
	@install -d $(DLLDIR)
	@install -d $(BINDIR)
	@install -d $(MANDIR)/man1
	install -c ../src/liblzma/api/lzma.h $(INCDIR)
	install -c ../src/liblzma/api/lzma/*.h $(INCDIR)/lzma
	install -c lzma.a lzma_s.a lzma.lib lzma_s.lib $(LIBDIR)
	install -c lzma.dll $(DLLDIR)
	install -c xz.exe xzdec.exe lzmainfo.exe $(BINDIR)
	install -c ../src/lzmainfo/lzmainfo.1 $(MANDIR)/man1
	install -c ../src/xz/xz.1 $(MANDIR)/man1
	install -c ../src/xzdec/xzdec.1 $(MANDIR)/man1
