# Copyright (C) 92, 93, 94, 95, 1996 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # Please email any bugs, comments, and/or additions to this file to: # bug-dejagnu@prep.ai.mit.edu # This file was written by Rob Savoye. (rob@welcomehome.org) # # Find the linker script for the current target. Returns a string # suitable to pass to $CC or $CXX to use a liblgoss based linker script, # or NULL if there is no support. # proc libgloss_script { } { global srcdir global target_cpu global LDFLAGS global CFLAGS global CXXFLAGS global target_info # sanity check if ![info exists LDFLAGS] { set LDFLAGS "" } if ![info exists CFLAGS] { set CFLAGS "" } if ![info exists CXXFLAGS] { set CXXFLAGS "" } # find the linker script. first we look at the config # data and hope to find it all ready for us to use. if # that fails, then look in the LDFLAGS and CFLAGS variables that # get set in the global site.exp file. if [info exists target_info(target,name)] { set script $target_info(target,name).ld } else { if [regexp -- "-T.*\.ld" ${LDFLAGS} script] { string trimleft ${script} "-T" } if [regexp -- "-T.*\.ld" ${CFLAGS} script] { string trimleft ${script} "-T" } if [regexp -- "-T.*\.ld" ${CXXFLAGS} script] { string trimleft ${script} "-T" } } if ![info exists script] { warning "Couldn't find the linker script name for target" return "" } # if we're on a remote host, we can't search for the file, so use the # linker script in the path. if [is3way] { return "-T${script}" } # search for the general directories foreach i ".. ../.. ../../.. ../../../.." { verbose "Looking for a ${srcdir}/${i}/libgloss/${target_cpu}/${script}" 2 if [file exists ${srcdir}/$i/libgloss/${target_cpu}/${script} ] { verbose "Found ${srcdir}/${i}/libgloss/${target_cpu}/${script}." 3 return "-T${srcdir}/${i}/libgloss/${target_cpu}/${script}" } } # we didn't find the script, so we have to hope it's installed return "-T${script}" } # # Find all the pieces of libgloss for testing the GNU development tools # needed to use $CC or $CXX. It returns a string suitable to pass to # $CC or $CXX to get a fully linked binary for the target. # proc libgloss_flags { } { global target_alias global target_cpu global srcdir global base_dir # libgloss doesn't work native if [isnative] { return "" } # if we're on a remote host, we can't search for the file, so we can only # use an installed compiler, so we don't add any paths here. if [is3way] { return "[libgloss_script]" } # search for the general directories foreach i ".. ../.. ../../.. ../../../.." { if [file exists ${base_dir}/${i}/${target_alias}/libgloss/${target_cpu} ] { verbose "Found ${base_dir}/${i}/${target_alias}/libgloss/${target_cpu}." 3 return "-L${base_dir}/${i}/${target_alias}/libgloss/${target_cpu} [libgloss_script]" } } # we didn't find any support at all return "[libgloss_script]" } # # Find the C libraries # proc newlib_flags { } { global base_dir global srcdir global target_alias # if we're on a remote host, we can't search for the file, so use the # newlib already installed. if [is3way] { return "" } # search for the general directories foreach i ".. ../.. ../../.. ../../../.." { verbose "Looking for a ${base_dir}/${i}/${target_alias}/newlib/targ-include" 2 if [file exists ${base_dir}/${i}/${target_alias}/newlib/targ-include ] { verbose "Found ${base_dir}/${i}/${target_alias}/newlib/targ-include." 3 set incls1 "-I${base_dir}/${i}/${target_alias}/newlib/targ-include" } verbose "Looking for a ${srcdir}/${i}/newlib/libc/include" 2 if [file exists ${srcdir}/${i}/newlib/libc/include ] { verbose "Found ${srcdir}/${i}/newlib/libc/include." 3 set incls2 "-I${srcdir}/${i}/newlib/libc/include" } } # search for the general directories foreach i ".. ../.. ../../.. ../../../.." { verbose "Looking for a ${base_dir}/${i}/newlib" 2 if [file exists ${base_dir}/${i}/newlib ] { verbose "Found ${base_dir}/${i}/newlib." 3 return "-B${base_dir}/${i}/newlib/ ${incls1} ${incls2}" } } return "" } # # Find all the pieces of libgloss for testing the GNU development tools # needed to use $LD. This gets fun cause we have to guess the name of the # BSP for this target. If returns a string suitable to pass to LD to get # a fully linked binary for the target. It also sets two global variables, # CRT0 is the path to the startup file, and # BSP is the path to the support library. # proc libgloss_ld {} { #proc gloss_ld {} { global target_cpu global srcdir global base_dir global CRT0 global BSP # libgloss doesn't work native if [isnative] { return "" } # set ldflags "" # search for the general directories foreach i ".. ../.. ../../.. ../../../.." { if ![info exists gloss_srcdir] { if [file exists ${srcdir}/$i/libgloss/${target_cpu} ] { verbose "Found ${srcdir}/$i/libgloss/${target_cpu}." 3 set gloss_srcdir "$i/libgloss/${target_cpu}" } } if ![info exists gloss_objdir] { if [file exists ${base_dir}/$i/libgloss/${target_cpu} ] { verbose "Found ${base_dir}/$i/libgloss/${target_cpu}." 3 set gloss_objdir "$i/libgloss/${target_cpu}" append ldflags " -L${gloss_objdir} " } } } # find the crt0 if [file exists ${gloss_objdir}/crt0.o] { verbose "Found ${base_dir}/$i/libgloss/${target_cpu}." 3 set CRT0 "$i/libgloss/${target_cpu}" append ldflags " ${gloss_objdir}/crt0.o " } else { perror "No crt0.o built for this target" } # find the BSP (currently an object, it may become an archive soon) foreach i "[list_targets]" { if [info exists target_info($i,name}] { if [file exists ${gloss_objdir}/${target_info}($i,name).o ] { set BSP "${target_info}($i,name).o" append ldflags " -lc -l ${target_info}($i,name).o -lc " } } } if [expr ![info exists gloss_srcdir] || ![info exists gloss_srcdir]] { warning "No libgloss support in build tree" return "" } else { return "${ldflags}" } }