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 + -
显示快捷键?