123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- #!/bin/sh -e
- mkdir oldbin
- mkdir bin
- for language in c cpp
- do
- exec <$language
- exec 9>${language}-works
-
- while read c options
- do
- echo "=== `date` === checking $c $options" >&2
- rm -f test*
- (
- echo "#!/bin/sh"
- echo 'PATH="'"$PATH"'"'
- echo 'export PATH'
- echo "$c" "$options" '"$@"'
- ) > test-okc
- chmod 755 test-okc
- cat lib.c main.c > test.$language || continue
- ./test-okc -o test test.$language || continue
- ./test || continue
- cp main.c test1.$language || continue
- cp lib.c test2.$language || continue
- ./test-okc -c test1.$language || continue
- ./test-okc -c test2.$language || continue
- ./test-okc -o test1 test1.o test2.o || continue
- ./test1 || continue
- echo "=== `date` === success: $c $options is ok"
- echo "$c $options" >&9
- done
- mv ${language}-works $language
- done
- exec <c
- exec 7>oldbin/okabi
- chmod 755 oldbin/okabi
- echo "#!/bin/sh" >&7
- while :
- do
- exec <c
- read c options || break
- for language in c cpp
- do
- exec 8>${language}-compatible
- exec 9>${language}-incompatible
- echo "=== `date` === checking compatibility with $c $options" >&2
- exec <$language
- while read c2 options2
- do
- echo "=== `date` === checking $c2 $options2" >&2
- works=1
- rm -f test*
- (
- echo "#!/bin/sh"
- echo 'PATH="'"$PATH"'"'
- echo 'export PATH'
- echo "$c" "$options" '"$@"'
- ) > test-okc
- chmod 755 test-okc
- (
- echo "#!/bin/sh"
- echo 'PATH="'"$PATH"'"'
- echo 'export PATH'
- echo "$c2" "$options2" '"$@"'
- ) > test-okc2
- chmod 755 test-okc2
- if cp main.c test5.c \
- && cp main.cpp test5.cpp \
- && cp lib.c test6.c \
- && ./test-okc2 -c test5.$language \
- && ./test-okc -c test6.c \
- && ./test-okc2 -o test5 test5.o test6.o \
- && ./test5
- then
- echo "=== `date` === success: $c2 $options2 is compatible" >&2
- echo "$c2 $options2" >&8
- else
- echo "$c2 $options2" >&9
- fi
- done
- done
- abi=`awk '{print length($0),$0}' < c-compatible \
- | sort -n | head -1 | sed 's/ *$//' | sed 's/^[^ ]* //' | tr ' /' '__'`
- echo "echo '"$abi"'" >&7
- syslibs=""
- for i in -lm -lnsl -lsocket -lrt
- do
- echo "=== `date` === checking $i" >&2
- (
- echo "#!/bin/sh"
- echo 'PATH="'"$PATH"'"'
- echo 'export PATH'
- echo "$c" "$options" '"$@"' "$i" "$syslibs"
- ) > test-okclink
- chmod 755 test-okclink
- cat lib.c main.c > test.c || continue
- ./test-okclink -o test test.c $i $syslibs || continue
- ./test || continue
- syslibs="$i $syslibs"
- (
- echo '#!/bin/sh'
- echo 'echo "'"$syslibs"'"'
- ) > "oldbin/oklibs-$abi"
- chmod 755 "oldbin/oklibs-$abi"
- done
- foundokar=0
- exec <archivers
- while read a
- do
- echo "=== `date` === checking archiver $a" >&2
- (
- echo "#!/bin/sh"
- echo 'PATH="'"$PATH"'"'
- echo 'export PATH'
- echo "$a" '"$@"'
- ) > test-okar
- chmod 755 test-okar
- cp main.c test9.c || continue
- cp lib.c test10.c || continue
- ./test-okc -c test10.c || continue
- ./test-okar cr test10.a test10.o || continue
- ranlib test10.a || echo "=== `date` === no ranlib; continuing anyway" >&2
- ./test-okc -o test9 test9.c test10.a || continue
- ./test9 || continue
- cp -p test-okar "oldbin/okar-$abi"
- echo "=== `date` === success: archiver $a is ok" >&2
- foundokar=1
- break
- done
- case $foundokar in
- 0)
- echo "=== `date` === giving up; no archivers work" >&2
- exit 111
- ;;
- esac
- for language in c cpp
- do
- mv ${language}-incompatible ${language}
- exec <${language}-compatible
- exec 9>"oldbin/ok${language}-$abi"
- chmod 755 "oldbin/ok${language}-$abi"
-
- echo "#!/bin/sh" >&9
- while read c2 options2
- do
- echo "echo '"$c2 $options2"'" >&9
- done
- done
- done
- exec 7>/dev/null
- oldbin/okabi \
- | while read abi
- do
- oldbin/okc-$abi \
- | head -1 \
- | while read c
- do
- $c -o abiname abiname.c \
- && ./abiname "$abi"
- done
- done > abinames
- numabinames=`awk '{print $2}' < abinames | sort -u | wc -l`
- numabis=`oldbin/okabi | wc -l`
- if [ "$numabis" = "$numabinames" ]
- then
- exec <abinames
- exec 7>bin/okabi
- chmod 755 bin/okabi
- echo '#!/bin/sh' >&7
- while read oldabi newabi
- do
- mv "oldbin/okc-$oldabi" "bin/okc-$newabi"
- mv "oldbin/okcpp-$oldabi" "bin/okcpp-$newabi"
- mv "oldbin/okar-$oldabi" "bin/okar-$newabi"
- mv "oldbin/oklibs-$oldabi" "bin/oklibs-$newabi"
- echo "echo $newabi" >&7
- done
- else
- cp -p oldbin/* bin
- fi
|