1 |
arta |
1.1 |
#!/usr/bin/perl -w |
2 |
|
|
|
3 |
arta |
1.4 |
# In config.local, __DEFS__ section must precede __MAKE__ section |
4 |
|
|
|
5 |
arta |
1.1 |
use constant kSTATUSOK => 0; |
6 |
|
|
use constant kSTATUSCONF => 1; |
7 |
|
|
|
8 |
|
|
use constant kUNKSECTION => 0; |
9 |
|
|
use constant kDEFSSECTION => 1; |
10 |
|
|
use constant kMAKESECTION => 2; |
11 |
|
|
|
12 |
|
|
use constant kCUSTMK => "custom.mk"; |
13 |
arta |
1.4 |
use constant kPROJTGTS => "projtgts.mk"; |
14 |
|
|
use constant kPROJRULES => "projRules.mk"; |
15 |
arta |
1.1 |
|
16 |
|
|
my($line); |
17 |
|
|
my($section); |
18 |
|
|
my($status); |
19 |
|
|
my($tmp); |
20 |
arta |
1.4 |
my($tmpa); |
21 |
|
|
my($tmpb); |
22 |
|
|
my($locopen); |
23 |
|
|
my($beginning); |
24 |
|
|
my($locdir); |
25 |
arta |
1.1 |
my($varname); |
26 |
|
|
my($mach); |
27 |
|
|
my($varvalu); |
28 |
arta |
1.5 |
my($projdir); |
29 |
arta |
1.1 |
my(%platmaps) = (); |
30 |
|
|
my(%machmaps) = (); |
31 |
|
|
|
32 |
|
|
$status = kSTATUSOK; |
33 |
|
|
$section = kUNKSECTION; |
34 |
arta |
1.4 |
$tmp = $ARGV[0]; |
35 |
|
|
$locdir = $ARGV[1]; |
36 |
|
|
$tmpa = kPROJTGTS; |
37 |
|
|
$tmpb = kPROJRULES; |
38 |
|
|
|
39 |
arta |
1.1 |
if (open(CONFLOC, "<$tmp")) |
40 |
|
|
{ |
41 |
|
|
$tmp = kCUSTMK; |
42 |
arta |
1.4 |
if (!open(CUSTMK, ">>$locdir/$tmp")) |
43 |
arta |
1.1 |
{ |
44 |
|
|
print STDERR "Can't open file '$tmp' for writing.\n" |
45 |
|
|
} |
46 |
|
|
else |
47 |
|
|
{ |
48 |
arta |
1.4 |
$locopen = 0; |
49 |
|
|
$beginning = 1; |
50 |
|
|
|
51 |
arta |
1.1 |
while (defined($line = <CONFLOC>)) |
52 |
|
|
{ |
53 |
|
|
chomp($line); |
54 |
|
|
|
55 |
|
|
if ($line =~ /^\#/ || $line =~ /^\s*$/) |
56 |
|
|
{ |
57 |
|
|
next; |
58 |
|
|
} |
59 |
|
|
|
60 |
|
|
if ($line =~ /__DEFS__/) |
61 |
|
|
{ |
62 |
|
|
$section = kDEFSSECTION; |
63 |
|
|
next; |
64 |
|
|
} |
65 |
|
|
elsif ($line =~ /__MAKE__/) |
66 |
|
|
{ |
67 |
|
|
$section = kMAKESECTION; |
68 |
|
|
next; |
69 |
|
|
} |
70 |
|
|
|
71 |
|
|
if ($section == kDEFSSECTION) |
72 |
|
|
{ |
73 |
|
|
# Do nothing - customizedefs.pl handles this section |
74 |
|
|
} |
75 |
|
|
elsif ($section == kMAKESECTION) |
76 |
|
|
{ |
77 |
arta |
1.4 |
if (!$locopen) |
78 |
|
|
{ |
79 |
|
|
if (!open(PROJTGTS, ">$locdir/$tmpa") || !open(PROJRULES, ">$locdir/$tmpb")) |
80 |
|
|
{ |
81 |
|
|
print STDERR "Can't open file '$tmpa' or '$tmpb' for writing.\n" |
82 |
|
|
} |
83 |
|
|
|
84 |
|
|
$locopen = 1; |
85 |
|
|
} |
86 |
|
|
|
87 |
arta |
1.1 |
$mach = ""; |
88 |
|
|
|
89 |
arta |
1.5 |
if ($line =~ /\s*PROJDIR\s+(\S+)/i) |
90 |
|
|
{ |
91 |
|
|
$varvalu = $1; |
92 |
|
|
|
93 |
|
|
# Create the entries for the projtgts.mk file |
94 |
|
|
if ($beginning) |
95 |
|
|
{ |
96 |
arta |
1.6 |
print PROJTGTS "proj2:\n"; |
97 |
arta |
1.5 |
$beginning = 0; |
98 |
|
|
} |
99 |
|
|
|
100 |
|
|
print PROJTGTS "\t+@[ -d \$(PROJOBJDIR)/$varvalu ] || mkdir -p \$(PROJOBJDIR)/$varvalu\n"; |
101 |
|
|
|
102 |
|
|
# Don't duplicate immediate subdirectories of proj |
103 |
|
|
if ($varvalu =~ /^(\S+)\// || $varvalu =~ /^(\S+)/) |
104 |
|
|
{ |
105 |
|
|
$projdir = $1; |
106 |
|
|
} |
107 |
|
|
else |
108 |
|
|
{ |
109 |
|
|
print STDERR "Invalid PROJDIR entry '$varvalu'.\n" |
110 |
|
|
} |
111 |
|
|
|
112 |
|
|
if (defined($projdir) && !defined($projmap{$projdir})) |
113 |
|
|
{ |
114 |
|
|
print PROJRULES "dir := \$(d)/$projdir\n"; |
115 |
|
|
print PROJRULES "-include \$(SRCDIR)/\$(dir)/Rules.mk\n"; |
116 |
|
|
$projmap{$projdir} = 1; |
117 |
|
|
} |
118 |
|
|
} |
119 |
|
|
elsif ($line =~ /\s*(\S+)\s+(\S+)/) |
120 |
arta |
1.1 |
{ |
121 |
|
|
$varname = $1; |
122 |
|
|
$varvalu = $2; |
123 |
|
|
|
124 |
|
|
if ($varname =~ /(\S+):(\S+)/) |
125 |
|
|
{ |
126 |
|
|
$varname = $1; |
127 |
|
|
$mach = $2; |
128 |
|
|
} |
129 |
|
|
|
130 |
|
|
if (length($mach) == 0) |
131 |
|
|
{ |
132 |
|
|
print CUSTMK "$varname = $varvalu\n"; |
133 |
|
|
} |
134 |
|
|
} |
135 |
|
|
elsif ($line =~ /\s*(\S+)\s*/) |
136 |
|
|
{ |
137 |
|
|
$varname = $1; |
138 |
|
|
|
139 |
|
|
if ($varname =~ /(\S+):(\S+)/) |
140 |
|
|
{ |
141 |
|
|
$varname = $1; |
142 |
|
|
$mach = $2; |
143 |
|
|
} |
144 |
|
|
|
145 |
|
|
if (length($mach) == 0) |
146 |
|
|
{ |
147 |
|
|
print CUSTMK "$varname = \n"; |
148 |
|
|
} |
149 |
|
|
} |
150 |
|
|
else |
151 |
|
|
{ |
152 |
|
|
print STDERR "Invalid line '$line' in configuration file.\n"; |
153 |
|
|
$status = kSTATUSCONF; |
154 |
|
|
last; |
155 |
|
|
} |
156 |
|
|
|
157 |
|
|
# deal with mach-specific |
158 |
|
|
if (length($mach) > 0) |
159 |
|
|
{ |
160 |
|
|
if (SupportedPlat($mach)) |
161 |
|
|
{ |
162 |
|
|
$platmaps{$mach}{$varname} = $varvalu; |
163 |
|
|
} |
164 |
|
|
else |
165 |
|
|
{ |
166 |
|
|
$machmaps{$mach}{$varname} = $varvalu; |
167 |
|
|
} |
168 |
|
|
} |
169 |
|
|
} |
170 |
|
|
else |
171 |
|
|
{ |
172 |
|
|
print STDERR "Invalid configuration file format.\n"; |
173 |
|
|
$status = kSTATUSCONF; |
174 |
|
|
} |
175 |
|
|
} |
176 |
|
|
|
177 |
arta |
1.4 |
close(PROJTGTS); |
178 |
|
|
close(PROJRULES); |
179 |
|
|
|
180 |
arta |
1.1 |
# Write out machine-specific key-value pairs |
181 |
|
|
my(%map); |
182 |
|
|
|
183 |
|
|
foreach $mach (keys(%platmaps)) |
184 |
|
|
{ |
185 |
|
|
%map = %{$platmaps{$mach}}; |
186 |
|
|
|
187 |
|
|
# There are two special machine 'types' - X86_64 and IA32; they refer to |
188 |
|
|
# the two supported linux-CPU types, linux_x86_64 and linux_ia32 as |
189 |
|
|
# identified by $JSOC_MACHINE |
190 |
|
|
if ($mach =~ /x86_64/i) |
191 |
|
|
{ |
192 |
arta |
1.2 |
print CUSTMK 'ifeq ($(JSOC_MACHINE), linux_x86_64)' . "\n"; |
193 |
arta |
1.1 |
} |
194 |
|
|
elsif ($mach =~ /ia32/i) |
195 |
|
|
{ |
196 |
arta |
1.2 |
print CUSTMK 'ifeq ($(JSOC_MACHINE), linux_ia32)' . "\n"; |
197 |
arta |
1.1 |
} |
198 |
arta |
1.3 |
elsif ($mach =~ /ia64/i) |
199 |
|
|
{ |
200 |
|
|
print CUSTMK 'ifeq ($(JSOC_MACHINE), linux_ia64)' . "\n"; |
201 |
|
|
} |
202 |
arta |
1.1 |
|
203 |
|
|
foreach $varname (keys(%map)) |
204 |
|
|
{ |
205 |
|
|
$varvalu = $map{$varname}; |
206 |
|
|
print CUSTMK "$varname = $varvalu\n"; |
207 |
|
|
} |
208 |
|
|
|
209 |
|
|
print CUSTMK "endif\n"; |
210 |
|
|
} |
211 |
|
|
|
212 |
|
|
foreach $mach (keys(%machmaps)) |
213 |
|
|
{ |
214 |
|
|
%map = %{$machmaps{$mach}}; |
215 |
|
|
|
216 |
|
|
# The MACH make variable is passed in as part of the make command-line: |
217 |
|
|
# make MACH='N02' |
218 |
|
|
# This will override the supported platform types. |
219 |
|
|
print CUSTMK "ifeq (\$(MACH), $mach)\n"; |
220 |
|
|
|
221 |
|
|
foreach $varname (keys(%map)) |
222 |
|
|
{ |
223 |
|
|
$varvalu = $map{$varname}; |
224 |
|
|
print CUSTMK "$varname = $varvalu\n"; |
225 |
|
|
} |
226 |
|
|
|
227 |
|
|
print CUSTMK "endif\n"; |
228 |
|
|
} |
229 |
|
|
|
230 |
|
|
|
231 |
|
|
close(CUSTMK); |
232 |
|
|
} |
233 |
|
|
|
234 |
|
|
close(CONFLOC); |
235 |
|
|
} |
236 |
|
|
|
237 |
|
|
exit($status); |
238 |
|
|
|
239 |
|
|
sub SupportedPlat |
240 |
|
|
{ |
241 |
|
|
my($plat) = $_[0]; |
242 |
|
|
|
243 |
arta |
1.3 |
if ($plat =~ /^x86_64$/i || $plat =~ /^ia32$/i || $plat =~ /^ia64$/i) |
244 |
arta |
1.1 |
{ |
245 |
|
|
return 1; |
246 |
|
|
} |
247 |
|
|
else |
248 |
|
|
{ |
249 |
|
|
return 0; |
250 |
|
|
} |
251 |
|
|
} |