#
# In most modules, we compile with -fPIC.  Turn it off for this
# module, because it interferes with checkpointing.
#

CC_PIC_FLAG =

XCOMM
XCOMM Set the following if you want a PVM ready checkpointing library
XCOMM compiled.  This will require that the PVM library be linked into
XCOMM the application.
XCOMM

PVM_CHECKPOINT = -DPVM_CHECKPOINTING

#ifdef WANT_NEST
NEST_CC_FLAGS = -DENABLE_NEST -I$(NEST_INC)
#endif

FILE_TABLE = -DFILE_TABLE -I$(ZLIB_INC) $(NEST_CC_FLAGS)
FILE_TABLE_OBJ = file_state.o condor_file.o condor_file_local.o condor_file_remote.o condor_file_special.o condor_file_agent.o condor_file_basic.o condor_file_buffer.o condor_file_fd.o condor_file_compress.o condor_file_append.o condor_file_nest.o file_table_interf.o

#if DOES_SAVE_SIGSTATE
SAVE_SIGSTATE = -DSAVE_SIGSTATE
SAVE_SIGSTATE_OBJ = signals_support.o signals_control.o

#if IS_DUX
SIG_EXTRACT = SIGACTION.o SIGPROCMASK.o SIGSUSPEND.o SIGNAL.o _SIGSUSPEND.o
#elif IS_SUN4X_SOLARIS
SIG_EXTRACT = SIGACTION.o _SIGACTION.o
#elif IS_LINUX
SIG_EXTRACT = SIGSUSPEND.o SIGACTION.o
#endif

#endif  /* ======= of if DOES_SAVE_SIGSTATE ==========*/

#if !IS_GLIBC25 && !IS_GLIBC27
NEED_SYSDEP = SYSDEP.o
#else
NEED_SYSDEP =
#endif

#if IS_LINUX
PLATFORM_EXTRACT = MMAP.o SYSCALL.o $(NEED_SYSDEP) PIPE.o
#elif IS_SOLARIS
PLATFORM_EXTRACT = MMAP.o SYSCALL.o PIPE.o 
#elif IS_ALPHA_DUX
PLATFORM_EXTRACT = MMAP.o SYSCALL.o PIPE.o
#elif IS_HPUX
PLATFORM_EXTRACT = SYSCALL.o __SYSCALL.o PIPE.o
#else 
PLATFORM_EXTRACT = PIPE.o
#endif

EXTRACT = $(SIG_EXTRACT) $(PLATFORM_EXTRACT)

#ifdef DOES_COMPRESS_CKPT
#  if IS_SUN4X_SOLARIS
#    if IS_SOLARIS29
/* _rem.o, _div.o, umultiply.o were consolidated into hwmuldiv.o in sol 2.9 */
       COMPRESS_OBJ = malloc-condor.o zimage.o hwmuldiv.o
#    else
       COMPRESS_OBJ = malloc-condor.o zimage.o _rem.o _div.o umultiply.o
#    endif
#  else /* not Solaris */
     COMPRESS_OBJ = malloc-condor.o zimage.o
#  endif
COMPRESS_FLAGS = -DCOMPRESS_CKPT -I $(ZLIB_INC)
#endif /* DOES_COMPRESS_CKPT */

C_PLUS_FLAGS = $(STD_C_PLUS_FLAGS) $(SAVE_SIGSTATE) \
	$(FILE_TABLE) $(PVM_CHECKPOINT) -DIN_CKPT_LIB $(DL_EXTRACT)
TOUPPER_C_PLUS_FLAGS = $(STD_C_PLUS_FLAGS) $(SAVE_SIGSTATE) \
	$(FILE_TABLE) $(PVM_CHECKPOINT) -DIN_CKPT_LIB $(DL_EXTRACT)

CFLAGS = $(STD_C_FLAGS) -DIN_CKPT_LIB $(DYNAMIC_FLAGS) $(DL_EXTRACT)

OS = OperatingSystem

CPP_UTIL_OBJ = condor_version.o subsystem_info.o

UTIL_OBJ =  dprintf_common.o mkargv.o

#ifdef DOES_CHECKPOINTING
OBJ =	image.o machdep.$(OS).o tmp_stack.o syscall_mode.o \
	fake_remote_syscall.o fake_hooks.o condor_error.o \
	$(SAVE_SIGSTATE_OBJ) fake_util_lib.o eprintf.o $(EXTRACT) \
	$(ASSEMBLER_OBJ) $(CPP_UTIL_OBJ) $(UTIL_OBJ) $(FILE_TABLE_OBJ) \
	$(COMPRESS_OBJ) shared_utils.o malloc-user.o gtodc.o maps.o

#else /* !DOES_CHECKPOINTING */

#if IS_AIX5
SHARED_OBJ =
#else
SHARED_OBJ = shared_utils.o
#endif
OBJ = signals_control.o syscall_mode.o $(SHARED_OBJ) maps.o

#endif /* !DOES_CHECKPOINTING */

/* Figure out what should be in the libc++support library, if anything */
#ifdef DOES_CHECKPOINTING

#if IS_C_COMP_MAJOR_GCC_3 || IS_C_COMP_MAJOR_GCC_4
# define NEEDS_CPP_SUPPORT_LIB 0
  CPP_SUPPORT_LIB =
#else /* non gcc 3.x */
#  if IS_C_COMP_KIND_EGCS || IS_C_COMP_MINOR_GCC_2_95 
     CPP_FRAME_OBJ = frame.o
#  elif IS_C_COMP_MINOR_GCC_2_96
     CPP_FRAME_OBJ = frame-dwarf2.o
#  else
#    error Checkpoint library not compatible with compiler!
#  endif /* egcs, gcc 2.95 and gcc 2.96 */
# define NEEDS_CPP_SUPPORT_LIB 1
  CPP_SUPPORT_EXTRACT_OBJ = _eh.o tinfo.o tinfo2.o $(CPP_FRAME_OBJ) \
			    exception.o  __dummy.o _pure.o 
  CPP_SUPPORT_OBJ = c_plus_alloc.o $(CPP_SUPPORT_EXTRACT_OBJ)
  CPP_SUPPORT_LIB = libcondorc++support.a
#endif /* gcc 3.x or not */

all_target(tmp_dir ToUpper $(CPP_SUPPORT_LIB) condor_rt0.o $(OBJ) $(COMPRESS_LIB) $(RELEASE_OBJ))
release:: all
stripped:: all
static:: all

#if NEEDS_CPP_SUPPORT_LIB
library_target(libcondorc++support.a,$(CPP_SUPPORT_OBJ))
public_library(libcondorc++support.a,lib)
#endif /* NEEDS_CPP_SUPPORT_LIB */

#else /* Not DOES_CHECKPOINTING */

all_target(tmp_dir $(OBJ) ToUpper)
release:: all
stripped:: all
static:: all

#endif /* DOES_CHECKPOINTING or not */ 

TMP_DIR = tmp_dir
tmp_dir:
	mkdir tmp_dir; chmod 755 tmp_dir
clean::
	/bin/rm -rf tmp_dir

#if IS_HPUX
SIGNAL.o :  $(SIMPLE_LIBC)  ToUpper
	ar x    $(SIMPLE_LIBC)      signal.o      ; mv  signal.o  $(TMP_DIR)
	./ToUpper $(TMP_DIR)/signal.o   SIGNAL.o   signal   SIGNAL
	rm -f $(TMP_DIR)/signal.o
	mv SIGNAL.o tmp1
	./ToUpper tmp1 SIGNAL.o _SIGNALvector _signalvector
	rm -f tmp1
#else
uppercase_target($(SIMPLE_LIBC),signal.o,SIGNAL.o,signal,SIGNAL)
#endif

uppercase_target($(SIMPLE_LIBC),sigvec.o,SIGVEC.o,sigvec,SIGVEC)
uppercase_target($(SIMPLE_LIBC),_sigvec.o,_SIGVEC.o,_sigvec,_SIGVEC)

#if IS_ALPHA_DUX
uppercase_target($(SIMPLE_LIBC),mmap.o,MMAP.o,mmap,MMAP)
#else
uppercase_target($(SIMPLE_LIBC),sigaction.o,SIGACTION.o,sigaction,SIGACTION)
#endif

#if IS_SOLARIS
uppercase_target($(SIMPLE_LIBC),mmap.o,MMAP.o,mmap,MMAP)
uppercase_target($(SIMPLE_LIBC),syscall.o,SYSCALL.o,syscall,SYSCALL)
uppercase_target($(SIMPLE_LIBC),_sigaction.o,_SIGACTION.o,sigaction,SIGACTION)
#endif

uppercase_target($(SIMPLE_LIBC),sigprocmask.o,SIGPROCMASK.o,sigprocmask,SIGPROCMASK)

#if IS_ALPHA_DUX
SIGSUSPEND.o :  $(SIMPLE_LIBC)  ToUpper
	ar x    $(SIMPLE_LIBC)      sigsuspend.o 	  ; mv  sigsuspend.o  $(TMP_DIR)
	./ToUpper $(TMP_DIR)/sigsuspend.o   $(TMP_DIR)/SIGSUSPEND.o   sigsuspend   SIGSUSPEND
	./ToUpper $(TMP_DIR)/SIGSUSPEND.o SIGSUSPEND.o __SIGSUSPEND_nc __sigsuspend_nc
	rm -f $(TMP_DIR)/sigsuspend.o $(TMP_DIR)/SIGSUSPEND.o

_SIGSUSPEND.o : $(SIMPLE_LIBC) ToUpper
	ar x $(SIMPLE_LIBC) _sigsuspend.o ; mv _sigsuspend.o $(TMP_DIR)
	./ToUpper $(TMP_DIR)/_sigsuspend.o _SIGSUSPEND.o sigsuspend SIGSUSPEND
	rm -f $(TMP_DIR)/_sigsuspend.o

SIGACTION.o : $(SIMPLE_LIBC) ToUpper
	ar x $(SIMPLE_LIBC) sigaction.o; mv sigaction.o $(TMP_DIR)
	./ToUpper $(TMP_DIR)/sigaction.o $(TMP_DIR)/SIGACTION.o sigaction SIGACTION
	./ToUpper $(TMP_DIR)/SIGACTION.o SIGACTION.o _sigtramp _SIGTRAMP
	rm -f $(TMP_DIR)/sigaction.o $(TMP_DIR)/SIGACTION.o

#else
uppercase_target($(SIMPLE_LIBC),sigsuspend.o,SIGSUSPEND.o,sigsuspend,SIGSUSPEND)
#endif

#if IS_LINUX
uppercase_target($(SIMPLE_LIBC),mmap.o,MMAP.o,mmap,MMAP)
#endif

#if defined(DOES_CHECKPOINTING) && NEEDS_CPP_SUPPORT_LIB
obj_extract($(GCC_LIBC),$(CPP_SUPPORT_EXTRACT_OBJ))
#endif

#if IS_LINUX && IS_GLIBC
uppercase_target($(SIMPLE_LIBC),sysdep.o,SYSDEP_TMP.o,__syscall_error,__SYSCALL_ERROR)
uppercase_target($(SIMPLE_LIBC),syscall.o,SYSCALL_TMP.o,syscall,SYSCALL)

SYSCALL.o: SYSCALL_TMP.o ToUpper
	./ToUpper SYSCALL_TMP.o SYSCALL.o __SYSCALL_error __syscall_error

/* Under RHEL5 (GLIBC25,27), this dependency is not used */
SYSDEP.o: SYSDEP_TMP.o ToUpper
	./ToUpper SYSDEP_TMP.o SYSDEP_TMP2.o errno ERRNO
	./ToUpper SYSDEP_TMP2.o SYSDEP.o _ERRNO_location _errno_location

clean::
	rm -f SYSCALL_TMP.o
#elif IS_DUX || IS_HPUX
uppercase_target($(SIMPLE_LIBC),syscall.o,SYSCALL.o,syscall,SYSCALL)
uppercase_target($(SIMPLE_LIBC),__syscall.o,__SYSCALL.o,__syscall,__SYSCALL)
#endif

uppercase_target($(SIMPLE_LIBC),pipe.o,PIPE.o,pipe,PIPE)
uppercase_target($(SIMPLE_LIBC),__pipe.o,__PIPE.o,__pipe,__PIPE)

#if IS_SOLARIS
program_target(machdep_test,machdep_test.o machdep.$(OS).o tmp_stack.o $(ASSEMBLER_OBJ) MMAP.o SYSCALL.o fake_util_lib.o,$(NULL))
#else
program_target(machdep_test,machdep_test.o machdep.$(OS).o tmp_stack.o $(ASSEMBLER_OBJ) fake_util_lib.o,$(NULL))
#endif

ToUpper.o: ToUpper.c
	gcc $(C_FLAGS) -c ToUpper.c

program_target_complex(ToUpper,ToUpper.o,$(NULL),$(NULL),$(NULL))

clean::
	rm -f ToUpper ToUpper.o

#ifdef DOES_COMPRESS_CKPT
malloc-condor.o : malloc-condor.c malloc.c
	$(CC) -O2 -g -DMORECORE=condor_morecore -DHAVE_MMAP=0 -Dmalloc_getpagesize=8192 -c malloc-condor.c
zimage.o : image.cpp
	$(CPlusPlus) $(C_PLUS_FLAGS) $(COMPRESS_FLAGS) -o zimage.o -c image.cpp
#if IS_SUN4X_SOLARIS
#if IS_SOLARIS29
/* hwmuldiv.o replaces _rem.o, _div.o, and umultiply.o in solaris 2.9 */
hwmuldiv.o : $(SIMPLE_LIBC)
	ar x $(SIMPLE_LIBC) hwmuldiv.o
#else /* pre-2.9 Solaris */
_rem.o : $(SIMPLE_LIBC)
	ar x $(SIMPLE_LIBC) _rem.o
_div.o : $(SIMPLE_LIBC)
	ar x $(SIMPLE_LIBC) _div.o
umultiply.o : $(SIMPLE_LIBC)
	ar x $(SIMPLE_LIBC) umultiply.o
#endif /* Solaris 2.9 */
#endif /* Solaris */
$(COMPRESS_LIB): libcondorckpt.a $(COMPRESS_OBJ)
	cp libcondorckpt.a $(COMPRESS_LIB)
	ar -d $(COMPRESS_LIB) image.o
	ar -r $(COMPRESS_LIB) $(COMPRESS_OBJ)
clean::
	rm -f $(COMPRESS_LIB) $(COMPRESS_OBJ)
#endif /* DOES_COMPRESS_CKPT */

XCOMM
XCOMM Create a replacement for crt0.o to be linked with condor programs.
XCOMM N.B. This is done differently than other objects in that we start out
XCOMM with a copy of crt0.o, and change the name of "main" to "MAIN".
XCOMM
#if IS_HPUX
condor_rt0.o: $(CRT_BEGIN) ToUpper
	./ToUpper $(CRT_BEGIN) tmp1 _start _START 
	./ToUpper tmp1 tmp2 _data_START _data_start
	./ToUpper tmp2 condor_rt0.o _text_START _text_start
	rm -f tmp1 tmp2
clean::
	rm -f condor_rt0.o
#elif IS_SUN4X_SOLARIS
condor_rt0.o: $(CRT_BEGIN) ToUpper
	./ToUpper $(CRT_BEGIN) condor_rt0.o main  MAIN
clean::
	rm -f condor_rt0.o
#elif IS_GLIBC22 || IS_GLIBC23 || IS_GLIBC24 || IS_GLIBC25 || IS_GLIBC27
condor_rt0.o: $(CRT_BEGIN) ToUpper
	./ToUpper $(CRT_BEGIN) tmp1 main  MAIN
	./ToUpper tmp1 condor_rt0.o __libc_start_MAIN __libc_start_main
clean::
	rm -f condor_rt0.o
#else
condor_rt0.o: $(CRT_BEGIN) ToUpper
	./ToUpper $(CRT_BEGIN) condor_rt0.o main  MAIN
clean::
	rm -f condor_rt0.o
#endif

clean::
	rm -f *.o

html:

IMPORT_LINKS = ../../config/import_links
import_objs(../condor_c++_util,$(CPP_UTIL_OBJ))
import_objs(../condor_util_lib,$(UTIL_OBJ))

testbin:: all
