1 arta 1.1 #!/usr/bin/perl -w
2
3 # Determine which compilers are installed; then set make variables to indicate that
|
4 arta 1.8 # Also, set DEFAULT values for Stanford-specific (if running at Stanford) make variables.
5 # To override the DEFAULT Stanford values, create a config.local file.
6
|
7 arta 1.1 use constant ICCMAJOR => 9;
8 use constant ICCMINOR => 0;
9 use constant IFORTMAJOR => 9;
10 use constant IFORTMINOR => 0;
|
11 arta 1.3 use constant GCCMAJOR => 3;
|
12 arta 1.1 use constant GCCMINOR => 0;
13 use constant GFORTMAJOR => 4;
14 use constant GFORTMINOR => 2;
15
16 my($arg);
17 my($pos);
|
18 arta 1.11 my($outdir);
|
19 arta 1.1 my($outfile);
|
20 arta 1.11 my($customdefsfile);
|
21 arta 1.1 my($major);
22 my($minor);
23 my($hasicc);
24 my($hasifort);
25 my($hasgcc);
26 my($hasgfort);
|
27 arta 1.11 my($skipautocomp);
28 my($line);
|
29 arta 1.1
30 while ($arg = shift(@ARGV))
31 {
|
32 arta 1.11 if (($pos = index($arg, "-d", 0)) == 0)
33 {
34 $outdir = substr($arg, 2);
35 }
36 elsif (($pos = index($arg, "-f", 0)) == 0)
|
37 arta 1.1 {
38 $outfile = substr($arg, 2);
39 }
|
40 arta 1.11 elsif (($pos = index($arg, "-c", 0)) == 0)
41 {
42 $customdefsfile = substr($arg, 2);
43 }
|
44 arta 1.1 }
45
|
46 arta 1.11 $outfile = "$outdir/$outfile";
47
|
48 arta 1.1 $hasicc = 0;
49 $hasifort = 0;
50 $hasgcc = 0;
51 $hasgfort = 0;
|
52 arta 1.11 $skipautocomp = 0;
|
53 arta 1.1
|
54 arta 1.11 if (defined($outdir) && defined($outfile))
|
55 arta 1.1 {
|
56 arta 1.11 # Check to see if user does not want to auto-configure compiler make variables
57 # Read the file containing the defs (right now, customizeddefs.h for Stanford,
58 # localization.h for non-Stanford).
59 if (defined($customdefsfile) && -e $customdefsfile)
60 {
61 if (open(DEFSFILE, "<$customdefsfile"))
62 {
63 my($doautocomp) = 0;
64
65 while (defined($line = <DEFSFILE>))
66 {
67 if ($line =~ /AUTOSELCOMP\s+(.+)/)
68 {
69 $doautocomp = $1;
70 $skipautocomp = !$doautocomp;
71 last;
72 }
73 }
|
74 arta 1.1
|
75 arta 1.11 close(DEFSFILE);
76 }
77 }
78
79 if (!$skipautocomp)
80 {
81 # Try icc
82 $ans = `icc -V 2>&1`;
83
84 if (defined($ans) && $ans =~ /Version\s+(\d+)\.(\d+)/)
85 {
86 $major = $1;
87 $minor = $2;
|
88 arta 1.1
|
89 arta 1.11 if (IsVersion($major, $minor, ICCMAJOR, ICCMINOR))
90 {
|
91 arta 1.1 $hasicc = 1;
|
92 arta 1.11 }
93 }
|
94 arta 1.1
|
95 arta 1.11 # Try gcc
96 if (!$hasicc)
97 {
98 $ans = `gcc -v 2>&1`;
99 if (defined($ans) && $ans =~ /gcc\s+version\s+(\d+)\.(\d+)/)
100 {
|
101 arta 1.1 $major = $1;
102 $minor = $2;
103
104 if (IsVersion($major, $minor, GCCMAJOR, GCCMINOR))
105 {
|
106 arta 1.11 $hasgcc = 1;
|
107 arta 1.1 }
|
108 arta 1.11 }
109 }
|
110 arta 1.1
|
111 arta 1.11 # Try ifort
112 $ans = `ifort -V 2>&1`;
113 if (defined($ans) && $ans =~ /Version\s+(\d+)\.(\d+)/)
114 {
115 $major = $1;
116 $minor = $2;
|
117 arta 1.1
|
118 arta 1.11 if (IsVersion($major, $minor, IFORTMAJOR, IFORTMINOR))
119 {
|
120 arta 1.1 $hasifort = 1;
|
121 arta 1.11 }
122 }
|
123 arta 1.1
|
124 arta 1.11 # Try gfortran
125 if (!$hasifort)
126 {
127 $ans = `gfortran -v 2>&1`;
128 if (defined($ans) && $ans =~ /gcc\s+version\s+(\d+)\.(\d+)/)
129 {
|
130 arta 1.1 $major = $1;
131 $minor = $2;
132
133 if (IsVersion($major, $minor, GFORTMAJOR, GFORTMINOR))
134 {
|
135 arta 1.11 $hasgfort = 1;
|
136 arta 1.1 }
|
137 arta 1.11 }
138 }
139 }
|
140 arta 1.1
141 open(OUTFILE, ">>$outfile") || die "Couldn't open file $outfile for writing.\n";
142
143 # Error messages
|
144 arta 1.11 if (!$skipautocomp)
|
145 arta 1.1 {
|
146 arta 1.11 if (!$hasicc && !$hasgcc)
147 {
148 print "Fatal error: Acceptable C compiler not found! You will be unable to build the DRMS library.\n";
149 }
150 elsif ($hasicc)
151 {
152 print OUTFILE "COMPILER = icc\n";
153 }
154 else
155 {
156 print OUTFILE "COMPILER = gcc\n";
157 }
|
158 arta 1.1
|
159 arta 1.11 if (!$hasifort && !$hasgfort)
160 {
161 print "Warning: Acceptable Fortran compiler not found! Fortran interface will not be built, and you will be unable to build Fortran modules.\n";
162 }
163 elsif ($hasifort)
164 {
165 print OUTFILE "FCOMPILER = ifort\n";
166 }
167 else
168 {
169 print OUTFILE "FCOMPILER = gfortran\n";
170 }
|
171 arta 1.1 }
172
|
173 arta 1.10 # Print out env var override logic - otherwise we lose this logic in make_basic.mk
174 # as the include of custom.mk comes after this logic in make_basic.mk
175 print OUTFILE "ifneq (\$(JSOC_COMPILER),)\n COMPILER = \$(JSOC_COMPILER)\nendif\n";
176 print OUTFILE "ifneq (\$(JSOC_FCOMPILER),)\n FCOMPILER = \$(JSOC_FCOMPILER)\nendif\n\n";
177
|
178 arta 1.8 # Set DEFAULT values for Stanford-specific (if running at Stanford) make variables.
|
179 arta 1.12 if (-e "configsdp.txt")
|
180 arta 1.8 {
181 my($line);
|
182 arta 1.12 my($parse);
|
183 arta 1.8
|
184 arta 1.12 if (open(SUFLAG, "<configsdp.txt"))
|
185 arta 1.8 {
|
186 arta 1.12
187 $parse = 0;
188
|
189 arta 1.8 while (defined($line = <SUFLAG>))
190 {
191 chomp($line);
|
192 arta 1.12
193 if ($line =~ /^__LIBS__/)
194 {
195 $parse = 1;
196 next;
197 }
198 elsif ($parse && $line =~ /^__END__/)
199 {
200 last;
201 }
202
203 if ($parse && $line !~ /^#/ && $line =~ /\S+/)
|
204 arta 1.8 {
205 print OUTFILE "$line\n";
206 }
207 }
208
209 close(SUFLAG);
210 }
211 }
212
|
213 arta 1.1 close(OUTFILE);
214 }
215
216 sub IsVersion
217 {
218 my($maj1) = $_[0];
219 my($min1) = $_[1];
220 my($maj2) = $_[2];
221 my($min2) = $_[3];
222
223 my($res) = 0;
224
225 if ($maj1 > $maj2 || ($maj1 == $maj2 && $min1 >= $min2))
226 {
227 $res = 1;
228 }
229
230 return $res;
231 }
|