Changes in tools/autotool.py [603c8740:28f4adb] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
tools/autotool.py
r603c8740 r28f4adb 49 49 50 50 PACKAGE_BINUTILS = "usually part of binutils" 51 PACKAGE_GCC = "preferably version 4. 5.1or newer"51 PACKAGE_GCC = "preferably version 4.4.3 or newer" 52 52 PACKAGE_CROSS = "use tools/toolchain.sh to build the cross-compiler toolchain" 53 53 54 54 COMPILER_FAIL = "The compiler is probably not capable to compile HelenOS." 55 COMPILER_WARNING = "The compilation of HelenOS might fail." 56 57 PROBE_HEAD = """#define AUTOTOOL_DECLARE(category, subcategory, tag, name, strc, conc, value) \\ 55 56 PROBE_HEAD = """#define AUTOTOOL_DECLARE(category, subcategory, tag, name, value) \\ 58 57 asm volatile ( \\ 59 "AUTOTOOL_DECLARE\\t" category "\\t" subcategory "\\t" tag "\\t" name "\\t " strc "\\t" conc "\\t%[val]\\n" \\58 "AUTOTOOL_DECLARE\\t" category "\\t" subcategory "\\t" tag "\\t" name "\\t%[val]\\n" \\ 60 59 : \\ 61 60 : [val] "n" (value) \\ 62 61 ) 63 62 64 #define STRING(arg) STRING_ARG(arg) 65 #define STRING_ARG(arg) #arg 66 67 #define DECLARE_BUILTIN_TYPE(tag, type) \\ 68 AUTOTOOL_DECLARE("builtin", "", tag, STRING(type), "", "", sizeof(type)); 69 70 #define DECLARE_INTSIZE(tag, type, strc, conc) \\ 71 AUTOTOOL_DECLARE("intsize", "unsigned", tag, #type, strc, conc, sizeof(unsigned type)); \\ 72 AUTOTOOL_DECLARE("intsize", "signed", tag, #type, strc, conc, sizeof(signed type)); 63 #define DECLARE_INTSIZE(tag, type) \\ 64 AUTOTOOL_DECLARE("intsize", "unsigned", tag, #type, sizeof(unsigned type)); \\ 65 AUTOTOOL_DECLARE("intsize", "signed", tag, #type, sizeof(signed type)) 73 66 74 67 int main(int argc, char *argv[]) 75 68 { 76 #ifdef __SIZE_TYPE__77 DECLARE_BUILTIN_TYPE("size", __SIZE_TYPE__);78 #endif79 #ifdef __WCHAR_TYPE__80 DECLARE_BUILTIN_TYPE("wchar", __WCHAR_TYPE__);81 #endif82 #ifdef __WINT_TYPE__83 DECLARE_BUILTIN_TYPE("wint", __WINT_TYPE__);84 #endif85 69 """ 86 70 … … 112 96 113 97 sys.exit(1) 114 115 def print_warning(msg):116 "Print a bold error message"117 118 sys.stderr.write("\n")119 sys.stderr.write("######################################################################\n")120 sys.stderr.write("HelenOS build sanity check warning:\n")121 sys.stderr.write("\n")122 sys.stderr.write("%s\n" % "\n".join(msg))123 sys.stderr.write("######################################################################\n")124 sys.stderr.write("\n")125 126 time.sleep(5)127 98 128 99 def sandbox_enter(): … … 215 186 check_app([common['STRIP'], "--version"], "GNU strip", details) 216 187 217 def decode_value(value):218 "Decode integer value"219 220 base = 10221 222 if ((value.startswith('$')) or (value.startswith('#'))):223 value = value[1:]224 225 if (value.startswith('0x')):226 value = value[2:]227 base = 16228 229 return int(value, base)230 231 188 def probe_compiler(common, sizes): 232 189 "Generate, compile and parse probing source" … … 238 195 239 196 for typedef in sizes: 240 outf.write("\tDECLARE_INTSIZE(\"%s\", %s , %s, %s);\n" % (typedef['tag'], typedef['type'], typedef['strc'], typedef['conc']))197 outf.write("\tDECLARE_INTSIZE(\"%s\", %s);\n" % (typedef['tag'], typedef['type'])) 241 198 242 199 outf.write(PROBE_TAIL) … … 274 231 signed_tags = {} 275 232 276 unsigned_strcs = {}277 signed_strcs = {}278 279 unsigned_concs = {}280 signed_concs = {}281 282 builtins = {}283 284 233 for j in range(len(lines)): 285 234 tokens = lines[j].strip().split("\t") … … 287 236 if (len(tokens) > 0): 288 237 if (tokens[0] == "AUTOTOOL_DECLARE"): 289 if (len(tokens) < 7):238 if (len(tokens) < 5): 290 239 print_error(["Malformed declaration in \"%s\" on line %s." % (PROBE_OUTPUT, j), COMPILER_FAIL]) 291 240 … … 294 243 tag = tokens[3] 295 244 name = tokens[4] 296 strc = tokens[5] 297 conc = tokens[6] 298 value = tokens[7] 245 value = tokens[5] 299 246 300 247 if (category == "intsize"): 248 base = 10 249 250 if ((value.startswith('$')) or (value.startswith('#'))): 251 value = value[1:] 252 253 if (value.startswith('0x')): 254 value = value[2:] 255 base = 16 256 301 257 try: 302 value_int = decode_value(value)258 value_int = int(value, base) 303 259 except: 304 260 print_error(["Integer value expected in \"%s\" on line %s." % (PROBE_OUTPUT, j), COMPILER_FAIL]) 305 261 306 262 if (subcategory == "unsigned"): 307 unsigned_sizes[ value_int] = name263 unsigned_sizes[name] = value_int 308 264 unsigned_tags[tag] = value_int 309 unsigned_strcs[value_int] = strc310 unsigned_concs[value_int] = conc311 265 elif (subcategory == "signed"): 312 signed_sizes[ value_int] = name266 signed_sizes[name] = value_int 313 267 signed_tags[tag] = value_int 314 signed_strcs[value_int] = strc315 signed_concs[value_int] = conc316 268 else: 317 269 print_error(["Unexpected keyword \"%s\" in \"%s\" on line %s." % (subcategory, PROBE_OUTPUT, j), COMPILER_FAIL]) 318 319 if (category == "builtin"): 320 try: 321 value_int = decode_value(value) 322 except: 323 print_error(["Integer value expected in \"%s\" on line %s." % (PROBE_OUTPUT, j), COMPILER_FAIL]) 324 325 builtins[tag] = {'name': name, 'value': value_int} 326 327 return {'unsigned_sizes': unsigned_sizes, 'signed_sizes': signed_sizes, 'unsigned_tags': unsigned_tags, 'signed_tags': signed_tags, 'unsigned_strcs': unsigned_strcs, 'signed_strcs': signed_strcs, 'unsigned_concs': unsigned_concs, 'signed_concs': signed_concs, 'builtins': builtins} 328 329 def detect_uints(probe, bytes, tags): 270 271 return {'unsigned_sizes' : unsigned_sizes, 'signed_sizes' : signed_sizes, 'unsigned_tags': unsigned_tags, 'signed_tags': signed_tags} 272 273 def detect_uints(probe, bytes): 330 274 "Detect correct types for fixed-size integer types" 331 275 … … 334 278 335 279 for b in bytes: 336 if (not b in probe['unsigned_sizes']): 337 print_error(['Unable to find appropriate unsigned integer type for %u bytes' % b, 280 fnd = False 281 newtype = "uint%s_t" % (b * 8) 282 283 for name, value in probe['unsigned_sizes'].items(): 284 if (value == b): 285 oldtype = "unsigned %s" % name 286 typedefs.append({'oldtype' : oldtype, 'newtype' : newtype}) 287 fnd = True 288 break 289 290 if (not fnd): 291 print_error(['Unable to find appropriate integer type for %s' % newtype, 338 292 COMPILER_FAIL]) 339 293 340 if (not b in probe['signed_sizes']): 341 print_error(['Unable to find appropriate signed integer type for %u bytes' % b, 294 295 fnd = False 296 newtype = "int%s_t" % (b * 8) 297 298 for name, value in probe['signed_sizes'].items(): 299 if (value == b): 300 oldtype = "signed %s" % name 301 typedefs.append({'oldtype' : oldtype, 'newtype' : newtype}) 302 fnd = True 303 break 304 305 if (not fnd): 306 print_error(['Unable to find appropriate integer type for %s' % newtype, 342 307 COMPILER_FAIL]) 343 344 if (not b in probe['unsigned_strcs']): 345 print_error(['Unable to find appropriate unsigned printf formatter for %u bytes' % b, 346 COMPILER_FAIL]) 347 348 if (not b in probe['signed_strcs']): 349 print_error(['Unable to find appropriate signed printf formatter for %u bytes' % b, 350 COMPILER_FAIL]) 351 352 if (not b in probe['unsigned_concs']): 353 print_error(['Unable to find appropriate unsigned literal macro for %u bytes' % b, 354 COMPILER_FAIL]) 355 356 if (not b in probe['signed_concs']): 357 print_error(['Unable to find appropriate signed literal macro for %u bytes' % b, 358 COMPILER_FAIL]) 359 360 typedefs.append({'oldtype': "unsigned %s" % probe['unsigned_sizes'][b], 'newtype': "uint%u_t" % (b * 8)}) 361 typedefs.append({'oldtype': "signed %s" % probe['signed_sizes'][b], 'newtype': "int%u_t" % (b * 8)}) 362 363 macros.append({'oldmacro': "\"%so\"" % probe['unsigned_strcs'][b], 'newmacro': "PRIo%u" % (b * 8)}) 364 macros.append({'oldmacro': "\"%su\"" % probe['unsigned_strcs'][b], 'newmacro': "PRIu%u" % (b * 8)}) 365 macros.append({'oldmacro': "\"%sx\"" % probe['unsigned_strcs'][b], 'newmacro': "PRIx%u" % (b * 8)}) 366 macros.append({'oldmacro': "\"%sX\"" % probe['unsigned_strcs'][b], 'newmacro': "PRIX%u" % (b * 8)}) 367 macros.append({'oldmacro': "\"%sd\"" % probe['signed_strcs'][b], 'newmacro': "PRId%u" % (b * 8)}) 368 369 name = probe['unsigned_concs'][b] 370 if ((name.startswith('@')) or (name == "")): 371 macros.append({'oldmacro': "c ## U", 'newmacro': "UINT%u_C(c)" % (b * 8)}) 372 else: 373 macros.append({'oldmacro': "c ## U%s" % name, 'newmacro': "UINT%u_C(c)" % (b * 8)}) 374 375 name = probe['unsigned_concs'][b] 376 if ((name.startswith('@')) or (name == "")): 377 macros.append({'oldmacro': "c", 'newmacro': "INT%u_C(c)" % (b * 8)}) 378 else: 379 macros.append({'oldmacro': "c ## %s" % name, 'newmacro': "INT%u_C(c)" % (b * 8)}) 380 381 for tag in tags: 308 309 for tag in ['CHAR', 'SHORT', 'INT', 'LONG', 'LLONG']: 310 fnd = False; 382 311 newmacro = "U%s" % tag 383 if (not tag in probe['unsigned_tags']): 312 313 for name, value in probe['unsigned_tags'].items(): 314 if (name == tag): 315 oldmacro = "UINT%s" % (value * 8) 316 macros.append({'oldmacro': "%s_MIN" % oldmacro, 'newmacro': "%s_MIN" % newmacro}) 317 macros.append({'oldmacro': "%s_MAX" % oldmacro, 'newmacro': "%s_MAX" % newmacro}) 318 fnd = True 319 break 320 321 if (not fnd): 384 322 print_error(['Unable to find appropriate size macro for %s' % newmacro, 385 323 COMPILER_FAIL]) 386 324 387 oldmacro = "UINT%s" % (probe['unsigned_tags'][tag] * 8) 388 macros.append({'oldmacro': "%s_MIN" % oldmacro, 'newmacro': "%s_MIN" % newmacro}) 389 macros.append({'oldmacro': "%s_MAX" % oldmacro, 'newmacro': "%s_MAX" % newmacro}) 390 325 fnd = False; 391 326 newmacro = tag 392 if (not tag in probe['unsigned_tags']): 327 328 for name, value in probe['signed_tags'].items(): 329 if (name == tag): 330 oldmacro = "INT%s" % (value * 8) 331 macros.append({'oldmacro': "%s_MIN" % oldmacro, 'newmacro': "%s_MIN" % newmacro}) 332 macros.append({'oldmacro': "%s_MAX" % oldmacro, 'newmacro': "%s_MAX" % newmacro}) 333 fnd = True 334 break 335 336 if (not fnd): 393 337 print_error(['Unable to find appropriate size macro for %s' % newmacro, 394 338 COMPILER_FAIL]) 395 396 oldmacro = "INT%s" % (probe['signed_tags'][tag] * 8)397 macros.append({'oldmacro': "%s_MIN" % oldmacro, 'newmacro': "%s_MIN" % newmacro})398 macros.append({'oldmacro': "%s_MAX" % oldmacro, 'newmacro': "%s_MAX" % newmacro})399 400 fnd = True401 402 if (not 'wchar' in probe['builtins']):403 print_warning(['The compiler does not provide the macro __WCHAR_TYPE__',404 'for defining the compiler-native type wchar_t. We are',405 'forced to define wchar_t as a hardwired type int32_t.',406 COMPILER_WARNING])407 fnd = False408 409 if (probe['builtins']['wchar']['value'] != 4):410 print_warning(['The compiler provided macro __WCHAR_TYPE__ for defining',411 'the compiler-native type wchar_t is not compliant with',412 'HelenOS. We are forced to define wchar_t as a hardwired',413 'type int32_t.',414 COMPILER_WARNING])415 fnd = False416 417 if (not fnd):418 macros.append({'oldmacro': "int32_t", 'newmacro': "wchar_t"})419 else:420 macros.append({'oldmacro': "__WCHAR_TYPE__", 'newmacro': "wchar_t"})421 422 fnd = True423 424 if (not 'wint' in probe['builtins']):425 print_warning(['The compiler does not provide the macro __WINT_TYPE__',426 'for defining the compiler-native type wint_t. We are',427 'forced to define wint_t as a hardwired type int32_t.',428 COMPILER_WARNING])429 fnd = False430 431 if (probe['builtins']['wint']['value'] != 4):432 print_warning(['The compiler provided macro __WINT_TYPE__ for defining',433 'the compiler-native type wint_t is not compliant with',434 'HelenOS. We are forced to define wint_t as a hardwired',435 'type int32_t.',436 COMPILER_WARNING])437 fnd = False438 439 if (not fnd):440 macros.append({'oldmacro': "int32_t", 'newmacro': "wint_t"})441 else:442 macros.append({'oldmacro': "__WINT_TYPE__", 'newmacro': "wint_t"})443 339 444 340 return {'macros': macros, 'typedefs': typedefs} … … 501 397 cross_prefix = os.environ['CROSS_PREFIX'] 502 398 else: 503 cross_prefix = "/usr/local /cross"399 cross_prefix = "/usr/local" 504 400 505 401 # Prefix binutils tools on Solaris … … 612 508 probe = probe_compiler(common, 613 509 [ 614 {'type': ' long long int', 'tag': 'LLONG', 'strc': '"ll"', 'conc': '"LL"'},615 {'type': ' long int', 'tag': 'LONG', 'strc': '"l"', 'conc': '"L"'},616 {'type': 'int', 'tag': 'INT' , 'strc': '""', 'conc': '""'},617 {'type': ' short int', 'tag': 'SHORT', 'strc': '"h"', 'conc': '"@"'},618 {'type': ' char', 'tag': 'CHAR', 'strc': '"hh"', 'conc': '"@@"'}510 {'type': 'char', 'tag': 'CHAR'}, 511 {'type': 'short int', 'tag': 'SHORT'}, 512 {'type': 'int', 'tag': 'INT'}, 513 {'type': 'long int', 'tag': 'LONG'}, 514 {'type': 'long long int', 'tag': 'LLONG'} 619 515 ] 620 516 ) 621 517 622 maps = detect_uints(probe, [1, 2, 4, 8] , ['CHAR', 'SHORT', 'INT', 'LONG', 'LLONG'])518 maps = detect_uints(probe, [1, 2, 4, 8]) 623 519 624 520 finally:
Note:
See TracChangeset
for help on using the changeset viewer.