#------------------------------->  Makefile  <--------------------------------#
#- Copyright (C) 199x by International Computer Science Institute            -#
#- This file is part of the GNU Sather package. It is free software; you may -#
#- redistribute  and/or modify it under the terms of the  GNU General Public -#
#- License (GPL)  as  published  by the  Free  Software  Foundation;  either -#
#- version 2 of the license, or (at your option) any later version.          -#
#- This  program  is distributed  in the  hope that it will  be  useful, but -#
#- WITHOUT ANY WARRANTY without even the implied warranty of MERCHANTABILITY -#
#- or FITNESS FOR A PARTICULAR PURPOSE. See Doc/GPL for more details.        -#
#- The license text is also available from:  Free Software Foundation, Inc., -#
#- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA                     -#
#------------->  Please email comments to <bug-sather@gnu.org>  <-------------#

# Platforms:
#
#  cygwin_smp_at
#  cygwin_tcp
#  hpux_hppa_smp_at
#  linux_smp_at		- pthread implementation
#  linux_lwp		- LWP-Thread simulation (non-preemptive)
#  osf_axp_smp_at
#  serial		- No concurrency
#  solaris_smp_at	- Threads, emulated clusters (Active Threads based)
#  solaris_smp		- Threads, emulated clusters (solaris)
#  solaris_tcp		- TCP/IP AM (solaris)

#  solaris_myrinet
#  solaris_myrinet_at

###################################

SATHER_HOME=$(shell cd ../..;pwd)

include $(SATHER_HOME)/config.default

ARCHITECTURES = cygwin_smp_at \
	        cygwin_tcp \
		hpux_hppa_smp_at \
		linux_smp_at \
		linux_lwp \
		osf_axp_smp_at \
		serial \
		solaris_smp_at \
		solaris_smp \
		solaris_tcp

HEADER = at_sync.h \
	 at_types.h \
	 brahma.h \
	 brahma2am.h \
	 solaris_sync.h \
	 solaris_types.h \
	 tcpam.h


###################################

default: beware brahma_$(ARCH).o

beware:
ifndef ARCH
	@echo ERROR: Variable ARCH has to be specified
	@exit 1
endif

install: beware brahma_$(ARCH).o
	[ -d ../lib ] || mkdir ../lib
	[ -d ../include ] || mkdir ../include
	cp -f $(HEADER) ../include
	cp -f brahma_$(ARCH).o ../lib
	cp -f arch_$(ARCH).h ../include

##################################

$(patsubst %,brahma_%.o,$(ARCHITECTURES)): brahma_%.o: arch_%.c arch_%.h brahma.h

brahma_solaris_smp.o \
brahma_solaris_tcp.o: solaris_sync.c solaris_sync.h

brahma_cygwin_tcp.o \
brahma_solaris_tcp.o: brahma2am.h barrier.c

brahma_cygwin_smp_at.o \
brahma_hpux_hppa_smp_at.o \
brahma_linux_smp_at.o \
brahma_osf_axp_smp_at.o \
brahma_solaris_smp_at.o: at_types.h at_sync.h at_sync.c

##################################

brahma_cygwin_tcp.o \
brahma_serial.o \
brahma_solaris_smp.o \
brahma_solaris_tcp.o \
brahma_linux_lwp.o \
brahma_cygwin_smp_at.o \
brahma_hpux_hppa_smp_at.o \
brahma_linux_smp_at.o \
brahma_osf_axp_smp_at.o \
brahma_solaris_smp_at.o:
	$(CC) $(CFLAGS) -I../include -c $< -o $@

#brahma_solaris_myrinet.a: FORCE
#	$(MAKE) -C arch_solaris_myrinet solaris_sparc INSTALL=brahma_solaris_myrinet.a \
#	        THREAD_FLAGS="-DBRAHMA_solaris_myrinet -DSOLARIS -DSOLARIS_THREADS -D_REENTRANT"

#brahma_solaris_myrinet_at.a: FORCE
#	$(MAKE) -C arch_solaris_myrinet_at solaris_smp_at \
#	        INSTALL=brahma_solaris_myrinet.a \
#		THREAD_FLAGS="-O4 -DSOLARIS -DAT_THREADS -DBRAHMA_solaris_myrinet_at -I../$(AT_INCLUDE_DIR)"

#FORCE:

###################################

clean:
	rm -f *.a *.o
#	$(MAKE) -C arch_solaris_myrinet/src clean

#####################################

# Don't use -O3 to avoid interprocedual opts...
benchmark_smp: solaris_smp.a $(BENCHMARK_DIR)/benchmark.c
	gcc -O2 -DBR_SOLARIS_SMP -I. $(BENCHMARK_DIR)/benchmark.c lib/solaris_smp.a -o benchmark_smp

# Don't use -O3 to avoid interprocedual opts...
benchmark_solaris_smp_at: solaris_smp_at.a $(BENCHMARK_DIR)/benchmark.c
	gcc $(DEBUG_FLAG) -g -DBR_SOLARIS_SMP_AT $(SMP_AT_INC_DIR) $(BENCHMARK_DIR)/benchmark.c lib/solaris_smp_at.a -o benchmark_solaris_smp_at $(AT_LIB_DIR) $(AT_LIBS)

benchmark_tcp: solaris_tcp.a $(BENCHMARK_DIR)/benchmark.c
	gcc -O2 -DBR_SOLARIS_TCP -I. $(BENCHMARK_DIR)/benchmark.c solaris_tcp.a -o lib/benchmark_tcp

benchmark_myrinet: solaris_myrinet.a $(BENCHMARK_DIR)/benchmark.c
	gcc $(MYRI_FLAGS) -DSOLARIS_THREADS -DBR_MYRINET_SOLARIS $(MYRI_INC_DIRS) -I$(COMMON_DIR) $(BENCHMARK_DIR)/benchmark.c -o benchmark_myrinet $(MYRI_LIB_DIRS) lib/solaris_myrinet.a $(MYRI_LIBS)

benchmark_sparc_myrinet_at: solaris_sparc_myrinet_at.a $(BENCHMARK_DIR)/benchmark.c
	gcc -g -DAT_NO_INLINE -DAT_THREADS -DBR_MYRINET_SOLARIS_AT $(MYRI_INC_DIRS) $(AT_COMMON_INC_DIR) $(BENCHMARK_DIR)/benchmark.c -o benchmark_at_sparc_myrinet $(MYRI_LIB_DIRS) lib/solaris_at_sparc_myrinet.a $(MYRI_LIBS) $(AT_LIB_DIR) $(AT_LIBS) -lkstat -lposix4

###################################

test_threads_at: myrinet_solaris/tests/test_threads.c
	gcc -O $(DEBUG_FLAG) -DDEBUG -DAT_THREADS -DBR_MYRINET_SOLARIS_AT $(MYRI_INC_DIRS) $(AT_COMMON_INC_DIR) myrinet_solaris/tests/test_threads.c -o test_threads_at  $(MYRI_LIB_DIRS) lib/solaris_at_sparc_myrinet.a $(MYRI_LIBS) $(AT_LIB_DIR) $(AT_LIBS) -lkstat -lposix4

test_threads: myrinet_solaris/tests/test_threads.c
	gcc -O $(DEBUG_FLAG) -DDEBUG -DSOLARIS_THREADS -DBR_MYRINET_SOLARIS $(MYRI_INC_DIRS) myrinet_solaris/tests/test_threads.c -o test_threads  $(MYRI_LIB_DIRS) lib/solaris_myrinet.a $(MYRI_LIBS) $(AT_LIB_DIR) $(AT_LIBS)

test_short_at: myrinet_solaris/tests/test_short.c
	gcc -O $(DEBUG_FLAG) -DDEBUG -DAT_THREADS -DBR_MYRINET_SOLARIS_AT $(MYRI_INC_DIRS) $(AT_COMMON_INC_DIR) myrinet_solaris/tests/test_short.c -o test_short_at  $(MYRI_LIB_DIRS) lib/solaris_at_sparc_myrinet.a $(MYRI_LIBS) $(AT_LIB_DIR) $(AT_LIBS) -lkstat

test_migration: myrinet_solaris/tests/test_migration.c myrinet_solaris/src/migration.c
	gcc $(DEBUG_FLAG) -g -DAT_NO_INLINE -DDEBUG -DAT_THREADS -DBR_MYRINET_SOLARIS_AT $(MYRI_INC_DIRS) $(AT_COMMON_INC_DIR) myrinet_solaris/tests/test_migration.c myrinet_solaris/src/migration.c -o test_migration  $(MYRI_LIB_DIRS) lib/solaris_at_sparc_myrinet.a $(MYRI_LIBS) $(AT_LIB_DIR) $(AT_LIBS) -lkstat
#	gcc $(DEBUG_FLAG) -O4 -DAT_THREADS -DBR_MYRINET_SOLARIS_AT $(MYRI_INC_DIRS) $(AT_COMMON_INC_DIR) myrinet_solaris/tests/test_migration.c myrinet_solaris/src/migration.c -o test_migration  $(MYRI_LIB_DIRS) lib/solaris_at_sparc_myrinet.a $(MYRI_LIBS) $(AT_LIB_DIR) $(AT_LIBS) -lkstat

qsort: myrinet_solaris/tests/qsort.c myrinet_solaris/src/migration.c
#	gcc $(DEBUG_FLAG) -g -O -DAT_NO_INLINE -DDEBUG -DAT_THREADS -DBR_MYRINET_SOLARIS_AT $(MYRI_INC_DIRS) $(AT_COMMON_INC_DIR) myrinet_solaris/tests/qsort.c myrinet_solaris/src/migration.c -o qsort  $(MYRI_LIB_DIRS) lib/solaris_at_sparc_myrinet.a $(MYRI_LIBS) $(AT_LIB_DIR) $(AT_LIBS) -lkstat
	gcc $(DEBUG_FLAG) -O4 -DAT_THREADS -DBR_MYRINET_SOLARIS_AT $(MYRI_INC_DIRS) $(AT_COMMON_INC_DIR) myrinet_solaris/tests/qsort.c myrinet_solaris/src/migration.c -o qsort  $(MYRI_LIB_DIRS) lib/solaris_at_sparc_myrinet.a $(MYRI_LIBS) $(AT_LIB_DIR) $(AT_LIBS) -lkstat

test_store: myrinet_solaris/tests/test_store.c
	gcc -O4 $(DEBUG_FLAG) -DAT_THREADS -DBR_MYRINET_SOLARIS_AT $(MYRI_INC_DIRS) $(AT_COMMON_INC_DIR) myrinet_solaris/tests/test_store.c myrinet_solaris/src/migration.c  -o test_store  $(MYRI_LIB_DIRS) lib/solaris_at_sparc_myrinet.a $(MYRI_LIBS) $(AT_LIB_DIR) $(AT_LIBS) -lkstat

test_short: myrinet_solaris/tests/test_short.c
	gcc -O $(DEBUG_FLAG) -DDEBUG -DSOLARIS_THREADS -DBR_MYRINET_SOLARIS $(MYRI_INC_DIRS) myrinet_solaris/tests/test_short.c -o test_short  $(MYRI_LIB_DIRS) lib/solaris_myrinet.a $(MYRI_LIBS) $(AT_LIB_DIR) $(AT_LIBS)

###################################

t1:	t1.c brahma.h solaris_tcp.a
	gcc $(DEBUG_FLAG) -c -DBR_SOLARIS_TCP t1.c
	gcc $(DEBUG_FLAG) t1.o solaris_tcp.a -o t1

t2:	t2.c br_barrier.c brahma.h solaris_tcp.a
	gcc -c -DBR_SOLARIS_TCP t2.c
	gcc $(DEBUG_FLAG) br_barrier.o t2.o solaris_tcp.a -o t2

###################################

btest: solaris_smp.a $(TEST_DIR)/btest.c
	gcc -O2 -DBR_SOLARIS_SMP -I. $(TEST_DIR)/btest.c solaris_smp.a -o btest

###################################

debug:
	gmake solaris_sparc_myrinet_at.a
	gmake test_migration ARCH=sparc-solaris
