all: sources library all_samples dcraw_binaries

PP=./internal/preprocess.pl

CC=gcc
CXX=g++
LDADD+=-lz

#CFLAGS=

# RawSpeed Support
# CFLAGS+=-DUSE_RAWSPEED -I../RawSpeed -I/opt/local/include/libxml2
# LDADD+=-L../RawSpeed/RawSpeed/release -lrawspeed -L/opt/local/include -ljpeg -lxml2
# RAWSPEED_DATA=../RawSpeed/data/cameras.xml

# DNG SDK Support
# CFLAGS+=-DUSE_DNGSDK -I../dng_sdk/source
# LDADDD+=-L../dng_sdk/release -ldng -ljpeg -lz


CC=gcc
CXX=g++
# CFLAGS+= -g -I. -pedantic  -Wno-long-long -Wno-overflow  -O4 -fopenmp
CFLAGS+= -g -I. -pedantic  -Wno-long-long -Wno-overflow  -O3


#CC=gcc
#CXX=g++
CFLAGS+= -g -I. -pedantic  -Wno-long-long -Wno-overflow  -O2
# Haswell:
#CFLAGS+=-march=core-avx2 -mtune=core-avx2 -mavx2


# LCMS support
# For lcms2 set -DUSE_LCMS2
CFLAGS+=-DUSE_LCMS2 -I/opt/local/include
LDADD+=-L/opt/local/lib -llcms

# Jasper support for RedCine
CFLAGS+=-DUSE_JASPER -I/opt/local/include
LDADD+=-L/opt/local/lib -ljasper

# JPEG support for DNG
CFLAGS+=-DUSE_JPEG -I/opt/local/include
LDADD+=-L/opt/local/lib -ljpeg

# LIBJPEG8:
CFLAGS+=-DUSE_JPEG8

# Demosaic Pack GPL2:
# DPCFLAGS+=-I../LibRaw-demosaic-pack-GPL2
# CFLAGS+=-DLIBRAW_DEMOSAIC_PACK_GPL2

# Demosaic Pack GPL3:
#DPCFLAGS+=-I../LibRaw-demosaic-pack-GPL3
#CFLAGS+=-DLIBRAW_DEMOSAIC_PACK_GPL3

DCRAW_GEN= internal/dcraw_common.cpp internal/dcraw_fileio.cpp
DCRAW_LIB_OBJECTS=object/dcraw_common.o object/libraw_cxx.o object/libraw_datastream.o object/libraw_c_api.o object/dcraw_fileio.o object/demosaic_packs.o
DCRAW_LIB_MT_OBJECTS=object/dcraw_common_mt.o object/libraw_cxx_mt.o object/libraw_datastream_mt.o object/libraw_c_api_mt.o object/dcraw_fileio_mt.o object/demosaic_packs_mt.o
LR_INCLUDES=libraw/libraw.h libraw/libraw_alloc.h libraw/libraw_const.h libraw/libraw_datastream.h libraw/libraw_internal.h libraw/libraw_types.h libraw/libraw_version.h

sources: ${DCRAW_GEN} Makefile.devel ${PP}
library: lib/libraw.a lib/libraw_r.a

format:  dcraw/dcraw.c ${LR_INCLUDES} src/libraw_cxx.cpp
	clang-format-devel -i -style=file src/*.cpp dcraw/dcraw.c libraw/*.h samples/*.cpp samples/*.c

all_samples: bin/raw-identify bin/simple_dcraw  bin/dcraw_emu bin/dcraw_half bin/half_mt bin/mem_image \
        bin/unprocessed_raw bin/4channels bin/multirender_test bin/postprocessing_benchmark

## RawSpeed xml file

RawSpeed/rawspeed_xmldata.cpp: ${RAWSPEED_DATA}
	./rsxml2c.sh ${RAWSPEED_DATA} > RawSpeed/rawspeed_xmldata.cpp

## Demosaic Pack(s)

object/demosaic_packs.o: internal/demosaic_packs.cpp ${LR_INCLUDES}
	$(CXX) -w -c -DLIBRAW_NOTHREADS ${CFLAGS} ${DPCFLAGS} -o object/demosaic_packs.o internal/demosaic_packs.cpp

object/demosaic_packs_mt.o: internal/demosaic_packs.cpp ${LR_INCLUDES}
	$(CXX) -w -c -pthread ${CFLAGS} ${DPCFLAGS} -o object/demosaic_packs_mt.o internal/demosaic_packs.cpp

## Samples ##
bin/raw-identify: lib/libraw.a samples/raw-identify.cpp
	$(CXX) ${CFLAGS} -o bin/raw-identify samples/raw-identify.cpp -L./lib -lraw  -lm  ${LDADD}

bin/simple_dcraw: lib/libraw.a samples/simple_dcraw.cpp
	$(CXX) -DLIBRAW_NOTHREADS ${CFLAGS} -o bin/simple_dcraw samples/simple_dcraw.cpp -L./lib -lraw  -lm  ${LDADD}

bin/multirender_test: lib/libraw.a samples/multirender_test.cpp
	$(CXX) -DLIBRAW_NOTHREADS ${CFLAGS} -o bin/multirender_test samples/multirender_test.cpp -L./lib -lraw  -lm  ${LDADD}

bin/postprocessing_benchmark: lib/libraw.a samples/postprocessing_benchmark.cpp
	$(CXX) -DLIBRAW_NOTHREADS ${CFLAGS} -o bin/postprocessing_benchmark samples/postprocessing_benchmark.cpp -L./lib -lraw  -lm  ${LDADD}

bin/unprocessed_raw: lib/libraw.a samples/unprocessed_raw.cpp
	$(CXX) -DLIBRAW_NOTHREADS ${CFLAGS} -o bin/unprocessed_raw samples/unprocessed_raw.cpp -L./lib -lraw  -lm  ${LDADD}

bin/4channels: lib/libraw.a samples/4channels.cpp
	$(CXX) -DLIBRAW_NOTHREADS ${CFLAGS} -o bin/4channels samples/4channels.cpp -L./lib -lraw  -lm  ${LDADD}

bin/mem_image: lib/libraw.a samples/mem_image.cpp
	$(CXX) ${CFLAGS} -o bin/mem_image samples/mem_image.cpp -L./lib -lraw  -lm  ${LDADD}

bin/dcraw_half: lib/libraw.a samples/dcraw_half.c
	$(CC) ${CFLAGS} -o bin/dcraw_half samples/dcraw_half.c -L./lib -lraw  -lm -lstdc++  ${LDADD}

bin/half_mt: lib/libraw_r.a samples/half_mt.c
	$(CC) -pthread ${CFLAGS} -o bin/half_mt samples/half_mt.c -L./lib -lraw_r  -lm -lstdc++  ${LDADD}

bin/dcraw_emu: lib/libraw.a samples/dcraw_emu.cpp
	$(CXX) ${CFLAGS} -o bin/dcraw_emu samples/dcraw_emu.cpp -L./lib -lraw_r  -lm ${LDADD}

dcraw_binaries: bin/dcraw_dist

bin/dcraw_dist: dcraw/dcraw.c Makefile.devel
	$(CXX) -w -O3 -DLIBRAW_NOTHREADS -DNO_LCMS -DNO_JASPER -I/opt/local/include -o bin/dcraw_dist dcraw/dcraw.c -lm -L/opt/local/lib -ljpeg

regenerate:
	${PP} -N -DDEFINES dcraw/dcraw.c  >internal/defines.h
	${PP} -N -DCOMMON dcraw/dcraw.c >internal/dcraw_common.cpp
	${PP} -N -DFILEIO dcraw/dcraw.c >internal/dcraw_fileio.cpp

internal/defines.h: dcraw/dcraw.c  ${PP}
	${PP} -N -DDEFINES dcraw/dcraw.c  >internal/defines.h

internal/dcraw_common.cpp: dcraw/dcraw.c internal/defines.h  ${PP} Makefile.devel
	${PP} -N -DCOMMON dcraw/dcraw.c >internal/dcraw_common.cpp

internal/dcraw_fileio.cpp: dcraw/dcraw.c internal/defines.h  ${PP} Makefile.devel
	${PP} -N -DFILEIO dcraw/dcraw.c >internal/dcraw_fileio.cpp

object/dcraw_common.o: internal/dcraw_common.cpp ${LR_INCLUDES}
	$(CXX) -c -DLIBRAW_NOTHREADS ${CFLAGS} ${LCMS_DEF} -o object/dcraw_common.o internal/dcraw_common.cpp

object/dcraw_fileio.o: internal/dcraw_fileio.cpp ${LR_INCLUDES}
	$(CXX) -c -DLIBRAW_NOTHREADS ${CFLAGS} ${LCMS_DEF} -o object/dcraw_fileio.o internal/dcraw_fileio.cpp

object/libraw_cxx.o: src/libraw_cxx.cpp ${LR_INCLUDES} RawSpeed/rawspeed_xmldata.cpp src/libraw_xtrans_compressed.cpp
	$(CXX) -c -DLIBRAW_NOTHREADS ${LCMS_DEF} ${CFLAGS} -o object/libraw_cxx.o src/libraw_cxx.cpp

object/libraw_datastream.o: src/libraw_datastream.cpp ${LR_INCLUDES}
	$(CXX) -c -DLIBRAW_NOTHREADS ${LCMS_DEF} ${CFLAGS} -o object/libraw_datastream.o src/libraw_datastream.cpp

object/libraw_c_api.o: src/libraw_c_api.cpp ${LR_INCLUDES}
	$(CXX) -c -DLIBRAW_NOTHREADS ${LCMS_DEF}  ${CFLAGS} -o object/libraw_c_api.o src/libraw_c_api.cpp

lib/libraw.a: ${DCRAW_LIB_OBJECTS}
	rm -f lib/libraw.a
	ar crv lib/libraw.a ${DCRAW_LIB_OBJECTS}
	ranlib lib/libraw.a

lib/libraw_r.a: ${DCRAW_LIB_MT_OBJECTS}
	rm -f lib/libraw_r.a
	ar crv lib/libraw_r.a ${DCRAW_LIB_MT_OBJECTS}
	ranlib lib/libraw_r.a

object/dcraw_common_mt.o: internal/dcraw_common.cpp ${LR_INCLUDES}
	$(CXX) -c -pthread ${LCMS_DEF} ${CFLAGS} -o object/dcraw_common_mt.o internal/dcraw_common.cpp

object/dcraw_fileio_mt.o: internal/dcraw_fileio.cpp ${LR_INCLUDES}
	$(CXX)  -c -pthread ${LCMS_DEF} ${CFLAGS} -o object/dcraw_fileio_mt.o internal/dcraw_fileio.cpp

object/libraw_cxx_mt.o: src/libraw_cxx.cpp ${LR_INCLUDES} src/libraw_xtrans_compressed.cpp
	$(CXX) -c ${LCMS_DEF} -pthread ${CFLAGS} -o object/libraw_cxx_mt.o src/libraw_cxx.cpp

object/libraw_datastream_mt.o: src/libraw_datastream.cpp ${LR_INCLUDES}
	$(CXX) -c ${LCMS_DEF} -pthread ${CFLAGS} -o object/libraw_datastream_mt.o src/libraw_datastream.cpp

object/libraw_c_api_mt.o: src/libraw_c_api.cpp ${LR_INCLUDES}
	$(CXX) -c ${LCMS_DEF} -pthread ${CFLAGS} -o object/libraw_c_api_mt.o src/libraw_c_api.cpp

clean:
	rm -fr bin/*.dSYM
	rm -f *.o *~ src/*~ samples/*~ internal/*~ libraw/*~ lib/lib*.a bin/[4a-z]* object/*o dcraw/*~ doc/*~ bin/*~

fullclean: clean
	rm -f ${DCRAW_GEN}
