]>
Commit | Line | Data |
---|---|---|
42a4f53d | 1 | # Copyright 2004-2019 Free Software Foundation, Inc. |
d40d2c92 JB |
2 | # |
3 | # This program is free software; you can redistribute it and/or modify | |
4 | # it under the terms of the GNU General Public License as published by | |
e22f8b7c | 5 | # the Free Software Foundation; either version 3 of the License, or |
d40d2c92 | 6 | # (at your option) any later version. |
e22f8b7c | 7 | # |
d40d2c92 JB |
8 | # This program is distributed in the hope that it will be useful, |
9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
11 | # GNU General Public License for more details. | |
e22f8b7c | 12 | # |
d40d2c92 | 13 | # You should have received a copy of the GNU General Public License |
e22f8b7c | 14 | # along with this program. If not, see <http://www.gnu.org/licenses/>. |
d40d2c92 | 15 | |
ab8314b3 JB |
16 | # Call target_compile with SOURCE DEST TYPE and OPTIONS as argument, |
17 | # after having temporarily changed the current working directory to | |
18 | # BUILDDIR. | |
19 | ||
20 | proc target_compile_ada_from_dir {builddir source dest type options} { | |
21 | set saved_cwd [pwd] | |
abcf2cc8 TV |
22 | |
23 | global board | |
24 | set board [target_info name] | |
25 | set save_multilib_flag [board_info $board multilib_flags] | |
26 | set multilib_flag "" | |
27 | foreach op $save_multilib_flag { | |
28 | if { $op == "-pie" || $op == "-no-pie" } { | |
29 | # Pretend gnatmake supports -pie/-no-pie, route it to | |
30 | # linker. | |
31 | append multilib_flag " -largs $op -margs" | |
32 | } else { | |
33 | append multilib_flag " $op" | |
34 | } | |
35 | } | |
36 | if { $multilib_flag != "" } { | |
37 | unset_board_info "multilib_flags" | |
38 | set_board_info multilib_flags "$multilib_flag" | |
39 | } | |
40 | ||
ab8314b3 JB |
41 | catch { |
42 | cd $builddir | |
43 | return [target_compile $source $dest $type $options] | |
44 | } result options | |
45 | cd $saved_cwd | |
abcf2cc8 TV |
46 | |
47 | if { $save_multilib_flag != "" } { | |
48 | unset_board_info "multilib_flags" | |
49 | set_board_info multilib_flags $save_multilib_flag | |
50 | } | |
51 | ||
ab8314b3 JB |
52 | return -options $options $result |
53 | } | |
54 | ||
034cb681 JB |
55 | # Compile some Ada code. |
56 | ||
57 | proc gdb_compile_ada {source dest type options} { | |
58 | ||
464dd14d JB |
59 | set srcdir [file dirname $source] |
60 | set gprdir [file dirname $srcdir] | |
034cb681 JB |
61 | set objdir [file dirname $dest] |
62 | ||
ab8314b3 JB |
63 | # Although strictly not necessary, we force the recompilation |
64 | # of all units (additional_flags=-f). This is what is done | |
65 | # when using GCC to build programs in the other languages, | |
66 | # and it avoids using a stray objfile file from a long-past | |
67 | # run, for instance. | |
034cb681 | 68 | append options " ada" |
ab8314b3 JB |
69 | append options " additional_flags=-f" |
70 | append options " additional_flags=-I$srcdir" | |
034cb681 | 71 | |
ab8314b3 | 72 | set result [target_compile_ada_from_dir \ |
4f5946a8 | 73 | $objdir [file tail $source] $dest $type $options] |
034cb681 JB |
74 | |
75 | # The Ada build always produces some output, even when the build | |
76 | # succeeds. Thus, we can not use the output the same way we do in | |
77 | # gdb_compile to determine whether the build has succeeded or not. | |
78 | # We therefore simply check whether the dest file has been created | |
79 | # or not. Unless not present, the build has succeeded. | |
ec3c07fc NS |
80 | if [file exists $dest] { set result "" } |
81 | gdb_compile_test $source $result | |
82 | return $result | |
034cb681 JB |
83 | } |
84 | ||
8223e12c TT |
85 | # Like standard_testfile, but for Ada. Historically the Ada tests |
86 | # used a different naming convention from many of the other gdb tests, | |
87 | # and this difference was preserved during the conversion to | |
88 | # standard_testfile. DIR defaults to the base name of the test case; | |
89 | # but can be overridden to find sources in a different subdirectory of | |
90 | # gdb.ada. | |
91 | ||
92 | proc standard_ada_testfile {base_file {dir ""}} { | |
93 | global gdb_test_file_name srcdir subdir | |
94 | global testdir testfile srcfile binfile | |
95 | ||
96 | if {$dir == ""} { | |
97 | set testdir $gdb_test_file_name | |
98 | } else { | |
99 | set testdir $dir | |
100 | } | |
8223e12c | 101 | |
f0464b23 SM |
102 | set testfile $base_file |
103 | set srcfile $srcdir/$subdir/$testdir/$testfile.adb | |
104 | set binfile [standard_output_file $testfile] | |
8223e12c | 105 | } |
2ff0a947 TT |
106 | |
107 | # A helper function to find the appropriate version of a tool. | |
108 | # TOOL is the tool's name, e.g., "gnatbind" or "gnatlink". | |
109 | ||
110 | proc find_ada_tool {tool} { | |
111 | set upper [string toupper $tool] | |
112 | ||
113 | set targname ${upper}_FOR_TARGET | |
114 | global $targname | |
115 | if {[info exists $targname]} { | |
116 | return $targname | |
117 | } | |
118 | ||
119 | global tool_root_dir | |
120 | set root "$tool_root_dir/gcc" | |
121 | set result "" | |
122 | ||
123 | if {![is_remote host]} { | |
124 | set result [lookfor_file $root $tool] | |
125 | } | |
126 | ||
127 | if {$result == ""} { | |
128 | set result [transform $tool] | |
129 | } | |
130 | ||
131 | return $result | |
132 | } | |
d1b70248 TV |
133 | |
134 | # Return 1 if gnatmake is at least version $MAJOR.x.x | |
135 | ||
136 | proc gnatmake_version_at_least { major } { | |
137 | set gnatmake [gdb_find_gnatmake] | |
138 | set gnatmake [lindex [split $gnatmake] 0] | |
139 | set output [exec $gnatmake --version] | |
140 | if { [regexp {GNATMAKE ([^ .]+).([^ .]+).([^ .]+)} $output \ | |
141 | match gnatmake_major gnatmake_minor gnatmake_micro] } { | |
142 | if { $gnatmake_major >= $major } { | |
143 | return 1 | |
144 | } else { | |
145 | return 0 | |
146 | } | |
147 | } | |
148 | ||
149 | # Unknown, return 1 | |
150 | return 1 | |
151 | } |