target-supports.exp
来自「linux下编程用 编译软件」· EXP 代码 · 共 1,508 行 · 第 1/4 页
EXP
1,508 行
# PCC_BITFIELD_TYPE_MATTERS isn't just about unnamed or empty # bitfields, but let's stick to the example code from the docs. set et_pcc_bitfield_type_matters_saved \ [string match "" [get_compiler_messages pcc_bitfield_type_matters assembly { struct foo1 { char x; char :0; char y; }; struct foo2 { char x; int :0; char y; }; int s[sizeof (struct foo1) != sizeof (struct foo2) ? 1 : -1]; } ]] } verbose "check_effective_target_pcc_bitfield_type_matters: returning $et_pcc_bitfield_type_matters_saved" 2 return $et_pcc_bitfield_type_matters_saved}# Return 1 if thread local storage (TLS) is supported, 0 otherwise.## This won't change for different subtargets so cache the result.proc check_effective_target_tls {} { global et_tls_saved if [info exists et_tls_saved] { verbose "check_effective_target_tls: using cached result" 2 } else { set et_tls_saved 1 set src tls[pid].c set asm tls[pid].S verbose "check_effective_target_tls: compiling testfile $src" 2 set f [open $src "w"] # Compile a small test program. puts $f "__thread int i;\n" close $f # Test for thread-local data supported by the platform. set comp_output \ [target_compile $src $asm assembly ""] file delete $src if { [string match "*not supported*" $comp_output] } { set et_tls_saved 0 } remove-build-file $asm } verbose "check_effective_target_tls: returning $et_tls_saved" 2 return $et_tls_saved}# Return 1 if TLS executables can run correctly, 0 otherwise.## This won't change for different subtargets so cache the result.proc check_effective_target_tls_runtime {} { global et_tls_runtime_saved if [info exists et_tls_runtime_saved] { verbose "check_effective_target_tls_runtime: using cached result" 2 } else { set et_tls_runtime_saved 0 set src tls_runtime[pid].c set exe tls_runtime[pid].x verbose "check_effective_target_tls_runtime: compiling testfile $src" 2 set f [open $src "w"] # Compile a small test program. puts $f "__thread int thr = 0;\n" puts $f "int main(void)\n {\n return thr;\n}" close $f set comp_output \ [target_compile $src $exe executable ""] file delete $src if [string match "" $comp_output] then { # No error messages, everything is OK. set result [remote_load target "./$exe" "" ""] set status [lindex $result 0] remote_file build delete $exe verbose "check_effective_target_tls_runtime status is <$status>" 2 if { $status == "pass" } { set et_tls_runtime_saved 1 } verbose "check_effective_target_tls_runtime: returning $et_tls_runtime_saved" 2 } } return $et_tls_runtime_saved}# Return 1 if compilation with -freorder-blocks-and-partition is error-free# for trivial code, 0 otherwise.proc check_effective_target_freorder {} { global et_freorder_saved global et_freorder_target_name if { ![info exists et_freorder_target_name] } { set et_freorder_target_name "" } # If the target has changed since we set the cached value, clear it. set current_target [current_target_name] if { $current_target != $et_freorder_target_name } { verbose "check_effective_target_freorder: `$et_freorder_target_name'" 2 set et_freorder_target_name $current_target if [info exists et_freorder_saved] { verbose "check_effective_target_freorder: removing cached result" 2 unset et_freorder_saved } } if [info exists et_freorder_saved] { verbose "check_effective_target_freorder: using cached result" 2 } else { verbose "check_effective_target_freorder: compiling source" 2 set et_freorder_saved [string match "" [get_compiler_messages freorder object { void foo (void) { } } "-freorder-blocks-and-partition"]] } verbose "check_effective_target_freorder: returning $et_freorder_saved" 2 return $et_freorder_saved}# Return 1 if -fpic and -fPIC are supported, as in no warnings or errors# emitted, 0 otherwise. Whether a shared library can actually be built is# out of scope for this test.## When the target name changes, replace the cached result.proc check_effective_target_fpic { } { global et_fpic_saved global et_fpic_target_name if { ![info exists et_fpic_target_name] } { set et_fpic_target_name "" } # If the target has changed since we set the cached value, clear it. set current_target [current_target_name] if { $current_target != $et_fpic_target_name } { verbose "check_effective_target_fpic: `$et_fpic_target_name'" 2 set et_fpic_target_name $current_target if [info exists et_fpic_saved] { verbose "check_effective_target_fpic: removing cached result" 2 unset et_fpic_saved } } if [info exists et_fpic_saved] { verbose "check_effective_target_fpic: using cached result" 2 } else { verbose "check_effective_target_fpic: compiling source" 2 # Note that M68K has a multilib that supports -fpic but not # -fPIC, so we need to check both. We test with a program that # requires GOT references. set et_fpic_saved [string match "" [get_compiler_messages fpic object { extern int foo (void); extern int bar; int baz (void) { return foo () + bar; } } "-fpic"]] if { $et_fpic_saved != 0 } { set et_fpic_saved [string match "" [get_compiler_messages fpic object { extern int foo (void); extern int bar; int baz (void) { return foo () + bar; } } "-fPIC"]] } } verbose "check_effective_target_fpic: returning $et_fpic_saved" 2 return $et_fpic_saved}# Return true if iconv is supported on the target. In particular IBM1047.proc check_iconv_available { test_what } { global tool global libiconv set result "" set src iconv[pid].c set exe iconv[pid].x verbose "check_iconv_available compiling testfile $src" 2 set f [open $src "w"] # Compile a small test program. puts $f "#include <iconv.h>\n" puts $f "int main (void)\n {\n iconv_t cd; \n" puts $f "cd = iconv_open (\"[lindex $test_what 1]\", \"UTF-8\");\n" puts $f "if (cd == (iconv_t) -1)\n return 1;\n" puts $f "return 0;\n}" close $f # If the tool configuration file has not set libiconv, try "-liconv" if { ![info exists libiconv] } { set libiconv "-liconv" } set lines [${tool}_target_compile $src $exe executable "libs=$libiconv" ] file delete $src if [string match "" $lines] then { # No error messages, everything is OK. set result [${tool}_load "./$exe" "" ""] set status [lindex $result 0] remote_file build delete $exe verbose "check_iconv_available status is <$status>" 2 if { $status == "pass" } then { return 1 } } return 0}# Return true if named sections are supported on this target.# This proc does not cache results, because the answer may vary# when cycling over subtarget options (e.g. irix o32/n32/n64) in# the same test run.proc check_named_sections_available { } { verbose "check_named_sections_available: compiling source" 2 set answer [string match "" [get_compiler_messages named object { int __attribute__ ((section("whatever"))) foo; }]] verbose "check_named_sections_available: returning $answer" 2 return $answer}# Return 1 if the target supports Fortran real kinds larger than real(8),# 0 otherwise.## When the target name changes, replace the cached result.proc check_effective_target_fortran_large_real { } { global et_fortran_large_real_saved global et_fortran_large_real_target_name global tool if { ![info exists et_fortran_large_real_target_name] } { set et_fortran_large_real_target_name "" } # If the target has changed since we set the cached value, clear it. set current_target [current_target_name] if { $current_target != $et_fortran_large_real_target_name } { verbose "check_effective_target_fortran_large_real: `$et_fortran_large_real_target_name' `$current_target'" 2 set et_fortran_large_real_target_name $current_target if [info exists et_fortran_large_real_saved] { verbose "check_effective_target_fortran_large_real: removing cached result" 2 unset et_fortran_large_real_saved } } if [info exists et_fortran_large_real_saved] { verbose "check_effective_target_fortran_large_real returning saved $et_fortran_large_real_saved" 2 } else { set et_fortran_large_real_saved 0 # Set up, compile, and execute a test program using large real # kinds. Include the current process ID in the file names to # prevent conflicts with invocations for multiple testsuites. set src real[pid].f90 set exe real[pid].x set f [open $src "w"] puts $f "integer,parameter :: k = &" puts $f " selected_real_kind (precision (0.0_8) + 1)" puts $f "real(kind=k) :: x" puts $f "x = cos (x);" puts $f "end" close $f verbose "check_effective_target_fortran_large_real compiling testfile $src" 2 set lines [${tool}_target_compile $src $exe executable ""] file delete $src if [string match "" $lines] then { # No error message, compilation succeeded. set et_fortran_large_real_saved 1 } } return $et_fortran_large_real_saved}# Return 1 if the target supports Fortran integer kinds larger than# integer(8), 0 otherwise.## When the target name changes, replace the cached result.proc check_effective_target_fortran_large_int { } { global et_fortran_large_int_saved global et_fortran_large_int_target_name global tool if { ![info exists et_fortran_large_int_target_name] } { set et_fortran_large_int_target_name "" } # If the target has changed since we set the cached value, clear it. set current_target [current_target_name] if { $current_target != $et_fortran_large_int_target_name } { verbose "check_effective_target_fortran_large_int: `$et_fortran_large_int_target_name' `$current_target'" 2 set et_fortran_large_int_target_name $current_target if [info exists et_fortran_large_int_saved] { verbose "check_effective_target_fortran_large_int: removing cached result" 2 unset et_fortran_large_int_saved } } if [info exists et_fortran_large_int_saved] { verbose "check_effective_target_fortran_large_int returning saved $et_fortran_large_int_saved" 2 } else { set et_fortran_large_int_saved 0 # Set up, compile, and execute a test program using large integer # kinds. Include the current process ID in the file names to # prevent conflicts with invocations for multiple testsuites. set src int[pid].f90 set exe int[pid].x set f [open $src "w"] puts $f "integer,parameter :: k = &" puts $f " selected_int_kind (range (0_8) + 1)" puts $f "integer(kind=k) :: i" puts $f "end" close $f verbose "check_effective_target_fortran_large_int compiling testfile $src" 2 set lines [${tool}_target_compile $src $exe executable ""] file delete $src if [string match "" $lines] then { # No error message, compilation succeeded. set et_fortran_large_int_saved 1 } } return $et_fortran_large_int_saved}# Return 1 if we can statically link libgfortran, 0 otherwise.## When the target name changes, replace the cached result.proc check_effective_target_static_libgfortran { } { global et_static_libgfortran global et_static_libgfortran_target_name global tool if { ![info exists et_static_libgfortran_target_name] } { set et_static_libgfortran_target_name "" } # If the target has changed since we set the cached value, clear it. set current_target [current_target_name] if { $current_target != $et_static_libgfortran_target_name } { verbose "check_effective_target_static_libgfortran: `$et_static_libgfortran_target_name' `$current_target'" 2 set et_static_libgfortran_target_name $current_target if [info exists et_static_libgfortran_saved] { verbose "check_effective_target_static_libgfortran: removing cached result" 2 unset et_static_libgfortran_saved } } if [info exists et_static_libgfortran_saved] { verbose "check_effective_target_static_libgfortran returning saved $et_static_libgfortran_saved" 2 } else { set et_static_libgfortran_saved 0 # Set up, compile, and execute a test program using static linking. # Include the current process ID in the file names to prevent
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?