LIBNUCNET_VERSION=0.7
LIBNUCNET_URL=http://www.webnucleo.org/home/modules/libnucnet/downloads/libnucnet_$(LIBNUCNET_VERSION).tar.gz
WNMATRIX_VERSION=0.12
WNMATRIX_URL=http://www.webnucleo.org/home/modules/wn_matrix/downloads/wn_matrix_$(WNMATRIX_VERSION).tar.gz
GC=g++
CINCLUDE=`xml2-config --cflags` `gsl-config --cflags` -Iinclude
CLIBS=`xml2-config --libs` `gsl-config --libs` -Lbuild/lib -lwnmatrix -lnucnet
CLIBS_STATIC=`xml2-config --libs` `gsl-config --libs`
CFLAGS=-Wall
CC=$(GC) $(CFLAGS) $(CINCLUDE) $(CLIBS)
CC_STATIC=$(GC) $(CFLAGS) $(CINCLUDE) $(CLIBS_STATIC)

############################################################
# General build commands
############################################################

all: build
.PHONY: all

build: build/bin/reaclib2xml build/bin/partition2xml
.PHONY: build

build/bin/reaclib2xml: build/lib/libwnmatrix.so build/lib/libnucnet.so libnucnet_include reaclibReader
	mkdir -p build/bin
	$(CC) -o build/bin/reaclib2xml src/reaclibReader/*.o src/reaclib2xml.cpp
	$(CC_STATIC) -o build/bin/reaclib2xml_static src/reaclibReader/*.o vendor/libnucnet/$(LIBNUCNET_VERSION)/src/examples/tmp/*.o src/reaclib2xml.cpp

build/bin/partition2xml: build/lib/libwnmatrix.so build/lib/libnucnet.so libnucnet_include
	mkdir -p build/bin
	$(CC) -o build/bin/partition2xml src/partition2xml.cpp
	$(CC_STATIC) -o build/bin/partition2xml_static vendor/libnucnet/$(LIBNUCNET_VERSION)/src/examples/tmp/*.o src/partition2xml.cpp

test: build/bin/reaclib2xml
	build/bin/reaclib2xml_static test_data/nuclides.xml test_data/minimal_reaclib out.xml
.PHONY: test

test_full: build/bin/reaclib2xml
	build/bin/reaclib2xml_static test_data/nuclides.xml test_data/full_reaclib out.xml
.PHONY: test_full

test_partition: build/bin/partition2xml
	build/bin/partition2xml_static test_data/partition_v1.0 out.xml
.PHONY: test_partition

clean:
	rm -rf vendor/wn_matrix
	rm -rf vendor/libnucnet
	rm -rf build
	rm -rf include
	rm -f src/*.o
	make -C src/reaclibReader clean
.PHONY: clean

cleanall: clean
	rm -f vendor/wn_matrix.tar.gz
	rm -f vendor/libnucnet.tar.gz
.PHONY: cleanall


############################################################
# reaclibReader
############################################################

reaclibReader:
	make -C src/reaclibReader objs


############################################################
# Libnucnet and WnMatrix shared objects
############################################################

vendor/wn_matrix.tar.gz:
	mkdir -p vendor
	wget $(WNMATRIX_URL) -O vendor/wn_matrix.tar.gz

vendor/wn_matrix: vendor/wn_matrix.tar.gz
	tar xz -C vendor -f vendor/wn_matrix.tar.gz

vendor/libnucnet.tar.gz:
	mkdir -p vendor
	wget $(LIBNUCNET_URL) -O vendor/libnucnet.tar.gz

vendor/libnucnet: vendor/libnucnet.tar.gz
	tar xz -C vendor -f vendor/libnucnet.tar.gz

patch_libnucnet: vendor/libnucnet
	cat vendor/libnucnet/$(LIBNUCNET_VERSION)/src/examples/Makefile | sed 's/CFLAGS1= /CFLAGS1=-fPIC /' - | sed 's/GC=gcc/GC=g++/' - > lnn_mf
	mv lnn_mf vendor/libnucnet/$(LIBNUCNET_VERSION)/src/examples/Makefile
.PHONY: patch_libnucnet

build/lib/libwnmatrix.so: vendor/libnucnet vendor/wn_matrix patch_libnucnet
	mkdir -p vendor/libnucnet/$(LIBNUCNET_VERSION)/src/examples/tmp
	make -C vendor/libnucnet/$(LIBNUCNET_VERSION)/src/examples ./tmp/WnMatrix.o
	mkdir -p build/lib
	$(GC) -shared -W1,-soname,libwnmatrix.so -o build/lib/libwnmatrix.so vendor/libnucnet/$(LIBNUCNET_VERSION)/src/examples/tmp/WnMatrix.o

build/lib/libnucnet.so: vendor/libnucnet vendor/wn_matrix patch_libnucnet
	mkdir -p vendor/libnucnet/$(LIBNUCNET_VERSION)/src/examples/tmp
	make -C vendor/libnucnet/$(LIBNUCNET_VERSION)/src/examples ./tmp/Libnucnet.o ./tmp/Libnucnet__Nuc.o ./tmp/Libnucnet__Reac.o
	mkdir -p build/lib
	$(GC) -shared -W1,-soname,libnucnet.so -o build/lib/libnucnet.so vendor/libnucnet/$(LIBNUCNET_VERSION)/src/examples/tmp/Libnucnet*.o

libnucnet_include: vendor/libnucnet vendor/wn_matrix
	mkdir -p include
	cp vendor/wn_matrix/$(WNMATRIX_VERSION)/src/*.h include
	cp vendor/libnucnet/$(LIBNUCNET_VERSION)/src/*.h include

