NAME = perl
PERL_VERSION = 5
PERL_NAME = $(NAME)$(PERL_VERSION)
DYLIB_VERSION = A
CURRENT_VERSION = 5.4.1

PLATFORM_OS = NEXTSTEP
COMMON_MAKEFILE_DIR = $(NEXT_ROOT)/System/Developer/Makefiles/pb_makefiles
include $(COMMON_MAKEFILE_DIR)/commands-$(PLATFORM_OS).make

CURRENT_PERL = perl5.004_01
ARCHIVE      = $(CURRENT_PERL).tar.gz
PERLDIR      = Perl
OTHERSRCS    = Makefile
CONFIG_SH    = config.sh
CONFIGURE    = $(SHELL) ./Configure

OBJROOT = STD_OBJS
SYMROOT = STD_SYMS

CLONED_PERL = .cloned_perl

DST_BINDIR = $(DSTROOT)/usr/bin
DST_FRAMEWORK = $(DSTROOT)/System/Library/Frameworks/Perl.framework
DST_LIBDIR = $(DSTROOT)/System/Library/Frameworks/Perl.framework/Versions/$(DYLIB_VERSION)
DST_LIBCORE = $(DST_LIBDIR)
DST_GNUSOURCE = $(DSTROOT)/System/Developer/Source/Commands/perl
DST_MAN = $(DSTROOT)/usr/share/man/man1
DST_HTML = $(DSTROOT)/System/Documentation/Commands/perl

INSTALL = /usr/bin/install
BASIC_INSTALL = $(INSTALL) -c -o root -g wheel
EXEC_INSTALL  = $(BASIC_INSTALL) -m 755
# BIN_INSTALL   = $(BASIC_INSTALL) -m 755 -sS
BIN_INSTALL   = $(BASIC_INSTALL) -m 755
FILE_INSTALL  = $(BASIC_INSTALL) -m 444

DITTO = ditto

SCRIPTS = \
	utils/c2ph \
	utils/h2ph \
	utils/h2xs \
	utils/perlbug \
	utils/perldoc \
	utils/pl2pm \
	utils/pstruct \
	utils/splain \
	x2p/a2p \
	x2p/s2p \
	x2p/find2perl

#
# clone_dir - expects shell vars
#	'clone_type' is 'ln -s' or 'cp', 
#	'clone_dest' destination directory absolute path
#	'clone_src ' source directory absolute path
#	'clone_files' a source of file names to clone
# stdin is then output of a find
#
clone_dir = \
	( \
	    cd $$clone_src; \
	    eval $$clone_files | $(SED) 's|^\./||' \
	    | while read filepath; do \
		if [ -f $$filepath ]; then \
		    dirpath="expr '$$filepath' : '\(.*\)/.*' '|' ' '"; \
		    dirpath=`eval $$dirpath`; \
		    src_filepath=$$clone_src/$$filepath; \
		    dest_filepath=$$clone_dest/$$filepath; \
		    dest_dirpath=$$clone_dest/$$dirpath; \
		    if [ -d $$dest_dirpath ]; then \
			$(RM) -f $$dest_filepath; \
		    else \
			$(ECHO) -n " $$dirpath"; \
			$(MKDIRS) -m 755 $$dest_dirpath; \
		    fi; \
		    eval $$clone_type $$src_filepath $$dest_filepath; \
		fi; \
	    done; $(ECHO); \
	)

#
# tar_dir - expects shell vars
#	'tar_dest' destination directory absolute path
#	'tar_src ' source directory absolute path
#	'tar_files' a source of file names to clone
# stdin is then output of a find
#
tar_dir = \
	eval "( cd $$tar_src; $(TAR) -cf - $$tar_files)" \
	    | eval "( cd $$tar_dst; $(TAR) -xf -)"

all:: $(OBJROOT)/perl doc

symbol:: all $(SYMROOT)/filelist cleanup_clone

install:: symbol install_hdrs install_bin install_scripts install_lib install_links install_doc strip_dstroot $(DST_GNUSOURCE)

perl:  $(OBJROOT)/perl

$(OBJROOT)/perl: $(OBJROOT)/Makefile
	cd $(OBJROOT); DYLD_LIBRARY_PATH=`pwd` $(MAKE)

doc:
	cd $(OBJROOT)/pod; $(MAKE) HTMLROOT=/System/Documentation/Commands/perl

configperl: $(OBJROOT)/Makefile

$(OBJROOT)/Makefile:: $(OBJROOT)/$(CLONED_PERL)
	@( \
	    : Establishing absolute path names;\
	    abs_perldir=`(cd $(PERLDIR); pwd)`; \
	    :; \
	    cd $(OBJROOT); \
	    $(ECHO) Changing default build architectures to $(RC_CFLAGS); \
	    $(RM) -f $(CONFIG_SH); \
	    $(SED) \
		-e "s|^ccflags='\(.*\)'|ccflags='\1 $(RC_CFLAGS)'|" \
		-e "s|^ldflags='\(.*\)'|ldflags='\1 $(RC_CFLAGS)'|" \
		-e "s|^lddlflags='\(.*\)'|lddlflags='\1 $(RC_CFLAGS)'|" \
		-e "s|^dylib_version='\(.*\)'|dylib_version='$(DYLIB_VERSION)'|" \
		-e "s|^current_version='\(.*\)'|current_version='$(CURRENT_VERSION)'|" \
		$$abs_perldir/$(CONFIG_SH) > $(CONFIG_SH); \
	    $(CONFIGURE) -S < /dev/null; \
	)

cloneperl: $(OBJROOT)/$(CLONED_PERL)

$(OBJROOT)/$(CLONED_PERL)::
	@( \
	    $(MKDIRS) $(OBJROOT) $(SYMROOT)/lib; \
	    : Establishing absolute path names;\
	    abs_symroot=`(cd $(SYMROOT); pwd) | sed 's|^/private||'`; \
	    abs_objroot=`(cd $(OBJROOT); pwd) | sed 's|^/private||'`; \
	    clone_list=$$abs_objroot/$(CLONED_PERL); \
	    cd $(PERLDIR); \
	    :; \
	    $(ECHO) Extracting list of files from $(PERLDIR); \
	    find . -type f -print | grep -v './lib' > $$clone_list; \
	    :; \
	    $(ECHO) Copying $(PERLDIR) Directory to $(OBJROOT); \
	    $(DITTO) . $$abs_objroot; \
	    :; \
	    $(ECHO) Copying Perl/lib to $(SYMROOT)/lib; \
	    $(DITTO) lib $$abs_symroot/lib; \
	)
	$(TOUCH) $(OBJROOT)/$(CLONED_PERL)

syms:: $(SYMROOT)/filelist

$(SYMROOT)/filelist::
	@( \
	    abs_symroot=`(cd $(SYMROOT); pwd | sed 's|^/private||' )`; \
	    filelist=$$abs_symroot/filelist; \
	    :; \
	    cd $(OBJROOT); \
	    find ./lib -name '*.pm' -exec touch {} \; ; \
	    $(ECHO) Making $$filelist; \
	    ( \
		include="-newer $(CLONED_PERL) -type f"; \
		eval "find . $$include ! -name '*.o' -print"; \
		/bin/ls ./*.h; \
	    ) | sort -u > $$filelist; \
	    :; \
	    $(ECHO) Moving files listed in filelist to $(SYMROOT); \
	    tar_src='.'; tar_dst=$$abs_symroot; \
	    tar_files="-T $$filelist"; $(tar_dir); \
	    $(CAT) $$filelist | xargs $(RM) -f; \
	)

cleanup_clone::
	@cd $(OBJROOT); \
	$(ECHO) Cleaning out cloned files from $(OBJROOT); \
	( \
	    $(ECHO) $(CLONED_PERL); \
	    find . -type f ! -newer $(CLONED_PERL) -print; \
	) | sort -u | xargs $(RM) -f

install_bin:: $(DST_BINDIR)
	$(BIN_INSTALL) $(SYMROOT)/perl     $(DST_BINDIR)/$(PERL_NAME)
	$(BIN_INSTALL) $(SYMROOT)/miniperl $(DST_BINDIR)/mini$(PERL_NAME)
	$(BIN_INSTALL) $(SYMROOT)/x2p/a2p  $(DST_BINDIR)/a2p
	$(RM) -f $(DST_BINDIR)/perl
	$(SYMLINK)     $(PERL_NAME)        $(DST_BINDIR)/perl
	$(RM) -f $(DST_BINDIR)/miniperl
	$(SYMLINK)     mini$(PERL_NAME)    $(DST_BINDIR)/miniperl

install_scripts:: $(DST_BINDIR)
	@( \
	    for scriptname in $(SCRIPTS); do \
		echo $(EXEC_INSTALL) $(SYMROOT)/$$scriptname $(DST_BINDIR); \
		$(EXEC_INSTALL) $(SYMROOT)/$$scriptname $(DST_BINDIR); \
	    done; \
	    $(RM) -f $(DST_BINDIR)/pstruct; \
	    echo $(SYMLINK) c2ph $(DST_BINDIR)/pstruct; \
	    $(SYMLINK) c2ph $(DST_BINDIR)/pstruct; \
	)

install_hdrs:: $(DST_LIBDIR)
	@( \
	    abs_symroot=`(cd $(SYMROOT); pwd | sed 's|^/private||' )`; \
	    abs_dstcore=`(cd $(DST_LIBCORE); pwd | sed 's|^/private||' )`; \
	    abs_dstlib=`(cd $(DST_LIBDIR); pwd | sed 's|^/private||' )`; \
	    :; \
	    cd $$abs_dstlib; \
	    :; \
	    $(ECHO) Copying headers to $(DST_LIBDIR)/Headers; \
	    clone_files='(cd $$abs_symroot; /bin/ls *.h)'; \
	    clone_src=$$abs_symroot; clone_dest=$$abs_dstcore/Headers; \
	    clone_type="$(CP)"; $(clone_dir); \
	)

install_lib:: $(DST_LIBDIR)
	@( \
	    abs_symroot=`(cd $(SYMROOT); pwd | sed 's|^/private||' )`; \
	    abs_symlib=`(cd $(SYMROOT)/lib; pwd | sed 's|^/private||' )`; \
	    abs_dstcore=`(cd $(DST_LIBCORE); pwd | sed 's|^/private||' )`; \
	    abs_dstlib=`(cd $(DST_LIBDIR); pwd | sed 's|^/private||' )`; \
	    :; \
	    cd $$abs_dstlib; \
	    :; \
	    $(ECHO) -n Copying the lib directory to $(DST_LIBDIR)/Modules:; \
	    clone_files="find . ! -type d -print"; \
	    clone_src=$$abs_symlib; clone_dest=$$abs_dstlib/Modules; \
	    clone_type="$(CP)"; $(clone_dir); \
	    $(SYMLINK) ../Headers $$abs_dstlib/Modules/Headers; \
	    :; \
	    $(ECHO) Copying the CORE directory to $(DST_LIBDIR); \
	    clone_files='(cd $$abs_symroot; /bin/ls Perl)'; \
	    clone_src=$$abs_symroot; clone_dest=$$abs_dstcore; \
	    clone_type="$(CP)"; $(clone_dir); \
	    :; \
	    $(ECHO) Removing write permission for files in $(DST_LIBDIR); \
	    find $(DSTROOT) -type f -exec chmod a-w {} \; ; \
	    :; \
	)

install_doc:: $(DST_MAN) $(DST_HTML)
	@( \
	    abs_symroot=`(cd $(SYMROOT); pwd | sed 's|^/private||' )`; \
	    :; \
	    cd $$abs_symroot/pod; \
	    :; \
	    $(ECHO) Copying man pages to $(DST_MAN); \
		for manpage in perl*.man; do \
		    installpage=`echo $$manpage | sed 's/\.man/.1/'`; \
		    echo cp $$manpage $(DST_MAN)/$$installpage; \
		    cp $$manpage $(DST_MAN)/$$installpage; \
		    chown root.wheel $(DST_MAN)/$$installpage; \
		    chmod 444 $(DST_MAN)/$$installpage; \
		done; \
	     \
	    $(ECHO) Copying html pages to $(DST_HTML); \
		for htmlpage in perl*.html; do \
		    echo cp $$htmlpage $(DST_HTML)/$$htmlpage; \
		    cp $$htmlpage $(DST_HTML)/$$htmlpage; \
		    chown root.wheel $(DST_HTML)/$$htmlpage; \
		    chmod 444 $(DST_HTML)/$$htmlpage; \
		done; \
		ln -s . $(DST_HTML)/pod; \
	     \
	)

install_links::
	@( \
	    cd $(DST_FRAMEWORK);	\
	    $(SYMLINK) $(DYLIB_VERSION) Versions/Current; \
	    $(SYMLINK) Versions/Current/Headers Headers; \
	    $(SYMLINK) Versions/Current/Modules Modules; \
	    $(SYMLINK) Versions/Current/Perl Perl; \
	)

strip_dstroot::
	@(	\
	    abs_dstroot=`(cd $(DSTROOT); pwd | sed 's|^/private||' )`; \
	    :; \
	    cd $$abs_dstroot; \
	    :; \
	    $(ECHO) Stripping Mach-O binaries in $(DSTROOT); \
	    find . -type f -exec file {} \; | egrep -e 'Mach-O|library' \
		| $(AWK) -F: '{print $$1}' | $(AWK) '{print $$1}' \
		| sort -u | xargs -t $(STRIP) -S; \
	)


$(DST_GNUSOURCE):: 
	$(MKDIRS) $@ || true
	$(DITTO) . $@
	$(RM) -rf $@/SGS_ENV
	$(CHOWN) -R root.wheel $@

installsrc:: $(SRCROOT)
	$(DITTO) . $(SRCROOT)

clean::
	@if [ $(OBJROOT) != "$(SRCROOT)" ]; then \
	    rm -rf $(OBJROOT); \
	fi; \
	if [ $(SYMROOT) != "$(SRCROOT)" ]; then \
	    rm -rf $(SYMROOT); \
	fi; \
	if [ -r $(PERLDIR)/Makefile -o -r $(PERLDIR)/makefile ]; then \
	    cd $(PERLDIR);	\
	    $(MAKE) realclean;	\
	fi

$(PERLDIR)::
	@( \
	    $(ECHO) Removing all old source; \
	    $(RM) -rf $(PERLDIR) $(CURRENT_PERL); \
	    :; \
	    $(ECHO) Extracting Archive $(ARCHIVE); \
	    $(TAR) xzf $(ARCHIVE); \
	    $(MV) $(CURRENT_PERL) $(PERLDIR); \
	    :; \
	    $(ECHO) Cleaning up setgid directories in $(PERLDIR); \
	    find $(PERLDIR) -perm -2000 -print | xargs chmod g-s; \
	)

perl_patch:: $(PERLDIR)/patched

$(PERLDIR)/patched::
	@( \
	    $(RM) -f $@; \
	    abs_patch=`(cd patch; pwd | sed 's|^/private||' )`; \
	    abs_perl=`(cd $(PERLDIR); pwd | sed 's|^/private||' )`; \
	    :; \
	    $(ECHO) -n Installing patch files in:; \
	    clone_files="find . -type f ! -name '.nfs*' -print"; \
	    clone_src=$$abs_patch; clone_dest=$$abs_perl; \
	    clone_type="$(TRANSMOGRIFY)"; $(clone_dir); \
	    $(TOUCH) $@; \
	)

$(PERLDIR)/Makefile::
	cd $(PERLDIR); $(CONFIGURE) -de;

start_perl_proj:: $(PERLDIR) $(PERLDIR)/patched $(PERLDIR)/Makefile

perl_test:: /tmp/perl_test
/tmp/perl_test::
	@( \
	    if [ -z "$(DSTROOT)"     -o ! -d "$(DST_BINDIR)" \
	    -o ! -d "$(DST_LIBCORE)" -o ! -d "$(DST_GNUSOURCE)/$(PERLDIR)" ]; \
	    then \
		$(ECHO) "Can't perl test suite until install is made";\
		false; \
	    fi; \
	    :; \
	    abs_origin=`pwd`; \
	    abs_libdir=`(cd $(DST_LIBDIR); pwd)`; \
	    abs_libcore=`(cd $(DST_LIBCORE); pwd)`; \
	    abs_gnusrc=`(cd $(DST_GNUSOURCE); pwd)`; \
	    test_base=/tmp/perl_test; \
	    :; \
	    $(RM) -rf $@; \
	    $(MKDIRS) $@ || true; \
	    cd $@; \
	    :; \
	    $(ECHO) -n Cloning test dir from $(DST_GNUSOURCE)/$(PERLDIR): ; \
	    clone_files='find t ! -type d -print'; \
	    clone_src=$$abs_gnusrc/$(PERLDIR); clone_dest=$@; \
	    clone_type="$(SYMLINK)"; $(clone_dir); \
	    :; \
	    $(ECHO) Establishing test environment; \
	    $(SYMLINK) $$abs_libdir lib; \
	    $(SYMLINK) $(DST_GNUSOURCE)/$(PERLDIR)/Configure; \
	    $(SYMLINK) $(DST_BINDIR)/perl t; \
	    :; \
	    $(ECHO) Running Tests; \
	    cd t; DYLD_LIBRARY_PATH=$$abs_libcore ./perl TEST; \
	    :; \
	    $(ECHO) Cleaning up after Tests; \
	    cd $$abs_origin; $(RM) -rf $@; \
	)

ROOT_DIRS = $(SRCROOT) $(OBJROOT) $(SYMROOT)
DST_DIRS = $(DSTROOT) $(DST_BINDIR) $(DST_LIBDIR) $(DST_LIBCORE) $(DST_MAN) $(DST_HTML)
$(ROOT_DIRS) $(DST_DIRS)::
	$(MKDIRS) $@ || true

installhdrs :: $(DST_LIBDIR)
	mkdir -p $(DST_LIBDIR)/Headers
	cd $(PERLDIR); cp *.h $(DST_LIBDIR)/Headers
