How to compile PHP on a HP (yes it's HP now) Nonstop Kernel Himalaya System running 
OSS G06:


WARNING: THIS PROCEDURE HAS ONLY BEEN TESTED ON G06 SYSTEMS AND PHP-4.2.0. THERE IS NO 
GUARANTEE THAT IT WILL EVEN WORK ON YOUR SYSTEM. THIS IS A DRAFT AND YOU SHOULD NOT 
USE THIS NOTE TO INSTALL PHP ON A PRODUCTION HIMALAYA SYSTEM. THIS IS NOT SUPPORTED BY 
COMPAQ.

Comments: [EMAIL PROTECTED]

DRAFT 0.1

The problem with running ./configure on an Himalaya system is that the c89 compiler 
will not fail if there are unresolved externals. Those are resolved at fixup time, the 
first time the program is ran. It has been a linker design since the beginning of 
Tandem systems, but doesn't work well with ./configure scripts.

The way to make ./configure work properly and only find procedures that are really 
available is to make a wrapper for the c89 compiler, so that it will fail if a 
procedure is unknown.

Here are the steps to achieve this:

1) Copy the following script under a directory you will call 'nsk' and create under 
the directory that contains ./configure. For example, if you have downloaded the PHP 
release in /usr/joe/php-4.2.0, then the ./configure program will be in that directory. 
Do the following:

/usr/joe/php-4.2.0: mkdir nsk
/usr/joe/php-4.2.0: cd nsk

Copy the following program in the 'nsk' directory (the program is in between *****):

************************************************************************************
echo "\nStarting to build the procedure list from your system..\n";

# First get the current sysnn

sysnn=`gtacl -c 'sysinfo' | grep "Current SYSnn" | sed 's/[ ]*Current SYSnn[ ]*//'`

echo "You are running on $sysnn.";

# Get the list of SRLs to look for. This is libc.obey

srllist=`cat /usr/lib/libc.obey | sed 's/-l//'`;
srllist="$srllist TSYSCLR";

# For each srl, call nm to extract the procedure names, and store that
# in a file.
# The grep and sed commands remove the extra information and just keep
# the procedure names. The last sed command changes the OSS_xxx_ proc names
# to xxx (e.g. OSS_gethostbyname_ to gethostbyname).

for srl in $srllist; do
  fullname="/G/SYSTEM/$sysnn/$srl";
  echo "Extracting info from $fullname..." >&2;
  nm $fullname | nm $fullname | egrep '(^_EXP#)|(^_ORG#)' | sed -n -e '/|COMMON/d' -e 
'/|DATA/d' \
     -e '/ file/d' -e 's/^\([^       ]*\).*/\1/p' \
     | sed 's/^_EXP#//' | sed 's/^_ORG#//' | sed 's/^OSS_\([a-z]*\)[_]/\1/'
done >procs;

echo "Done.. Now creating nskcc..";

# Now make a fake cc so that the Configure script will work properly. I call
# it 'nskcc', then set the following environment variables. After this is
# done, ./Configure and the subsequent make will run properly.
#
# PATH=$PATH:.
# CC=nskcc
# CFLAGS="-D_XOPEN_SOURCE_EXTENDED=1 -D_TANDEM_SOURCE -Wnowarn=1506,262,707,304,770"

# Remove our previous test file if any.
# launch the c compiler with the options given by the caller.

cat >nskcc <<EOM
rm -f nskt

# Look for the name of the object file.

obj=\`echo \$* | sed 's/.*-o \([A-Za-z0-9.]*\) .*/\1/'\`

# Try the compilation. Return immediately if failed.

if ! c89 \$*;then exit 1;fi

# if a procedure is undefined, it will appear like this:
# (none)    : gethostbyname
#
# use grep/sed to extract the procedure names that are undefined.
# we FAIL if there is one procedure undefined, even if the other is
# good. ./configure will rarely check more than one proc at a time
# so that should work 99%.

noft "file \$obj;llf" 2>/dev/null | grep "^(none)" | sed 's/^(none)[ ]*: //' >nskt

# if nskt is not empty, then there is a procedure that was not found in
# the srl, either because it was not declared properly, or because it's
# in the tsysclr. In that case, try to find our procedure in the procs file.
#
# If the procedure is not found, exit with status 1. That way, ./configure will
# think cc failed and consider the procedure to not work.

if test -s nskt; then
   proclist=\`cat nskt\`;
   for proc in \$proclist; do
      if ! grep "^\$proc\\\$" nsk/procs >/dev/null 2>&1; then exit 1; fi
   done;
fi
exit;
EOM

# Now tell user to set the env variables so ./configure uses our nskcc program.

echo "Now set the following environment variables and run ./configure."

echo "export PATH=\$PATH:./nsk (or the full path of nsk)";
echo "export CC=nskcc";
echo "export CFLAGS=\"-D_XOPEN_SOURCE_EXTENDED=1 -D_TANDEM_SOURCE 
-Dnowarn=1506,262,707,304,770\""

echo "Now run ./configure";

**************************************************************************************************

Name this script as you wish. For example:

/usr/joe/php-4.2.0/nsk/makensk

Allow execution of the script:

chmod +x /usr/joe/php-4.2.0/nsk/makensk

This script will search the SRLs and make a list of procedures that are known on the 
system.

2) Execute the script

cd /usr/joe/php-4.2.0/nsk
./makensk

The script will execute (takes some time to run) and search for your SYSnn, for the 
SRLs, and extract the procedure names from the SRLs and TSYSCLR. It will then create a 
file called "nskcc". nskcc will be the wrapper that you will need to use instead of 
c89.


3) You should have a file called "procs" in ../nsk. This file should contain a list of 
procedures. If you can't find this file or it is empty, there's been a problem.

4) Now run ./configure:

cd .. (to return to /usr/joe/php-4.2.0)
export CC=nskcc (to tell ./configure to use nskcc as the c compiler)
export LD=nld (tells which linker we have)
export CFLAGS="-D_XOPEN_SOURCE_EXTENDED -D_TANDEM_SOURCE 
-Wnowarn=1506,262,707,304,770" (sets the c compiler flags and suppresses some warnings)
export PATH=$PATH:/usr/joe/php-4.2.0/nsk (tells the shell where to look for nskcc)
rm config.cache (if you have already run ./configure)

./configure --without-mysql

Note: if you get the following message:
Configure: error: invalid package name: mysql then you must edit the ./configure file 
and comment the following lines:

604      #expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
605      #  { echo "$as_me: error: invalid package name: $ac_package" >&2
606      # { (exit 1); exit 1; }; }

5) Look at the output. Verify that it says that it is using nskcc as the C compiler.
6) Prepare yourself a coffee, watch TV, read the latest PHP documentation.. and wait..
7) If ./configure goes into inspect because of unresolved externals asctime_r, then 
you've made a mistake, and nskcc is either not used, or the macro didn't work on your 
system. Check that you've copied it correctly, and that you've set the paths 
correctly. Don't forget to rm config.cache if you're trying again.
8) When ./configure has finished successfully, rename nsk/nskcc to whatever you want, 
then create the following nskcc file in /usr/bin:
#!/bin/sh
c89 $*
This is because 'make' will try to run nskcc and won't find it. You could just copy it 
to /usr/bin, but it's not necessary to do a complete procedure check again. This will 
be fixed in a future version of the macro.
9) Edit main/php_config.h and look for the line that contains "u_int". Comment it:
 /* #define in_addr_t u_int */
run make. The warnings you see are okay. You shouldn't get any fatal error.

When the make is finished, run ./php -v to verify that you don't have any unresolved 
external. Install PHP as a Pathway CGI module in the iTP Webserver, and..
10) Enjoy PHP on your Himalaya!


Note: if you're going to rebuild PHP, don't forget to remove /usr/bin/nskcc, rename it 
correctly in ../nsk and remove config.cache if any. 'make clean' is always a good idea 
too.

This compiles PHP with symbols. The resulting code is a huge file, you may strip the 
symbols if necessary.



Reply via email to