|  | 
 
 发表于 2005-3-12 06:48:02
|
显示全部楼层 
| 在gentoo论坛上有个自动决定CFLAG的帖子,试试看。 
 http://forums.gentoo.org/viewtopic-t-53602.html
 
 [code:1]
 #!/bin/sh
 
 # Author: pixelbeat
 
 #This script is Linux specific
 #It should work on any gcc >= 2.95 at least
 
 #these apply to any arch (just here for reference)
 unsafe_math_opts="-ffast-math -fno-math-errno -funsafe-math-optimizations -fno-trapping-math"
 
 gcc_version=`gcc -dumpversion | sed 's/\([0-9]\{1,\}\.[0-9]\{1,\}\)\.*\([0-9]\{1,\}\)\{0,1\}/\1\2/'`
 
 IFS=":"
 while read name value; do
 unset IFS
 name=`echo $name`
 value=`echo $value`
 IFS=":"
 if [ "$name" == "vendor_id" ]; then
 vendor_id="$value"
 elif [ "$name" == "cpu family" ]; then
 cpu_family="$value"
 elif [ "$name" == "model" ]; then
 cpu_model="$value"
 elif [ "$name" == "flags" ]; then
 flags="$value"
 fi
 done < /proc/cpuinfo
 unset IFS
 
 if [ "$vendor_id" == "AuthenticAMD" ]; then
 if [ "$cpu_family" == "4" ]; then
 _CFLAGS="$_CFLAGS -march=i486"
 elif [ "$cpu_family" == "5" ]; then
 if [ "$cpu_model" -lt "4" ]; then
 _CFLAGS="$_CFLAGS -march=pentium"
 elif [ "$cpu_model" == "6" ] || [ "$cpu_model" == "7" ]; then
 _CFLAGS="$_CFLAGS -march=k6"
 elif [ "$cpu_model" == "8" ] || [ "$cpu_model" == "12" ]; then
 if expr $gcc_version '>=' 3.1 >/dev/null; then
 _CFLAGS="$_CFLAGS -march=k6-2"
 else
 _CFLAGS="$_CFLAGS -march=k6"
 fi
 elif [ "$cpu_model" == "9" ] || [ "$cpu_model" == "13" ]; then
 if expr $gcc_version '>=' 3.1 >/dev/null; then
 _CFLAGS="$_CFLAGS -march=k6-3"
 else
 _CFLAGS="$_CFLAGS -march=k6"
 fi
 fi
 elif [ "$cpu_family" == "6" ]; then
 if [ "$cpu_model" -le "3" ]; then
 if expr $gcc_version '>=' 3.0 >/dev/null; then
 _CFLAGS="$_CFLAGS -march=athlon"
 else
 _CFLAGS="$_CFLAGS -march=k6"
 fi
 elif [ "$cpu_model" == "4" ]; then
 if expr $gcc_version '>=' 3.1 >/dev/null; then
 _CFLAGS="$_CFLAGS -march=athlon-tbird"
 elif expr $gcc_version '>=' 3.0 >/dev/null; then
 _CFLAGS="$_CFLAGS -march=athlon"
 else
 _CFLAGS="$_CFLAGS -march=k6"
 fi
 elif [ "$cpu_model" -ge "6" ]; then #athlon-{4,xp,mp}
 if expr $gcc_version '>=' 3.1 >/dev/null; then
 _CFLAGS="$_CFLAGS -march=athlon-xp"
 elif expr $gcc_version '>=' 3.0 >/dev/null; then
 _CFLAGS="$_CFLAGS -march=athlon"
 else
 _CFLAGS="$_CFLAGS -march=k6"
 fi
 fi
 fi
 else #everything else "GenuineIntel"
 if [ "$cpu_family" == "3" ]; then
 _CFLAGS="$_CFLAGS -march=i386"
 elif [ "$cpu_family" == "4" ]; then
 _CFLAGS="$_CFLAGS -march=i486"
 elif [ "$cpu_family" == "5" ] && expr $gcc_version '<' 3.1 >/dev/null; then
 _CFLAGS="$_CFLAGS -march=pentium"
 elif [ "$cpu_family" -ge "6" ] && expr $gcc_version '<' 3.1 >/dev/null; then        _CFLAGS="$_CFLAGS -march=pentiumpro"
 elif [ "$cpu_family" == "5" ]; then
 if [ "$cpu_model" != "4" ]; then
 _CFLAGS="$_CFLAGS -march=pentium"
 else
 _CFLAGS="$_CFLAGS -march=pentium-mmx" #No overlap with other vendors        fi
 elif [ "$cpu_family" == "6" ]; then
 if echo "$flags" | grep -vq cmov; then #gcc incorrectly assumes i686 always has cmov
 _CFLAGS="$_CFLAGS -march=pentium -mcpu=pentiumpro" #VIA CPUs exhibit this
 else
 if [ "$cpu_model" == "0" ] || [ "$cpu_model" == "1" ]; then
 _CFLAGS="$_CFLAGS -march=pentiumpro"
 elif [ "$cpu_model" -ge "3" ] && [ "$cpu_model" -le "6" ]; then #4=TM5600 at least
 _CFLAGS="$_CFLAGS -march=pentium2"
 elif [ "$cpu_model" -ge "7" ] && [ "$cpu_model" -le "11" ]; then #9 invalid
 _CFLAGS="$_CFLAGS -march=pentium3"
 fi
 fi
 elif [ "$cpu_family" == "15" ]; then
 _CFLAGS="$_CFLAGS -march=pentium4"
 fi
 fi
 
 if expr $gcc_version '>=' 3.1 >/dev/null; then
 if echo "$flags" | grep -q sse2; then
 _CFLAGS="$_CFLAGS -mfpmath=sse -msse2"
 elif echo "$flags" | grep -q sse; then
 _CFLAGS="$_CFLAGS -mfpmath=sse -msse"
 fi
 if echo "$flags" | grep -q mmx; then
 _CFLAGS="$_CFLAGS -mmmx"
 fi
 if echo "$flags" | grep -q 3dnow; then
 _CFLAGS="$_CFLAGS -m3dnow"
 fi
 fi
 
 echo "$_CFLAGS"
 [/code:1]
 | 
 |