diff --git a/configure b/configure index 48d65385e9..3b9c9a3821 100755 --- a/configure +++ b/configure @@ -164,6 +164,12 @@ parser.add_option("--no-ifaddrs", dest="no_ifaddrs", help="Use on deprecated SunOS systems that do not support ifaddrs.h") +parser.add_option("--with-arm-float-abi", + action="store", + dest="arm_float_abi", + help="Specifies which floating-point ABI to use. Valid values are: " + "soft, softfp, hard") + (options, args) = parser.parse_args() @@ -189,8 +195,8 @@ def pkg_config(pkg): return (libs, cflags) -def host_arch_cc(): - """Host architecture check using the CC command.""" +def cc_macros(): + """Checks predefined macros using the CC command.""" try: p = subprocess.Popen(CC.split() + ['-dM', '-E', '-'], @@ -219,6 +225,52 @@ def host_arch_cc(): key = lst[1] val = lst[2] k[key] = val + return k + + +def is_arch_armv7(): + """Check for ARMv7 instructions""" + cc_macros_cache = cc_macros() + return ('__ARM_ARCH_7__' in cc_macros_cache or + '__ARM_ARCH_7A__' in cc_macros_cache or + '__ARM_ARCH_7R__' in cc_macros_cache or + '__ARM_ARCH_7M__' in cc_macros_cache) + + +def arm_hard_float_abi(): + """Check for hardfloat or softfloat eabi on ARM""" + # GCC versions 4.6 and above define __ARM_PCS or __ARM_PCS_VFP to specify + # the Floating Point ABI used (PCS stands for Procedure Call Standard). + # We use these as well as a couple of other defines to statically determine + # what FP ABI used. + # GCC versions 4.4 and below don't support hard-fp. + # GCC versions 4.5 may support hard-fp without defining __ARM_PCS or + # __ARM_PCS_VFP. + + if compiler_version() >= (4, 6, 0): + return '__ARM_PCS_VFP' in cc_macros() + elif compiler_version() < (4, 5, 0): + return False + elif '__ARM_PCS_VFP' in cc_macros(): + return True + elif ('__ARM_PCS' in cc_macros() or + '__SOFTFP' in cc_macros() or + not '__VFP_FP__' in cc_macros()): + return False + else: + print '''Node.js configure error: Your version of GCC does not report + the Floating-Point ABI to compile for your hardware + + Please manually specify which floating-point ABI to use with the + --with-arm-float-abi option. + ''' + sys.exit() + + +def host_arch_cc(): + """Host architecture check using the CC command.""" + + k = cc_macros() matchup = { '__x86_64__' : 'x64', @@ -277,11 +329,15 @@ def configure_node(o): o['variables']['host_arch'] = host_arch o['variables']['target_arch'] = target_arch - # V8 on ARM requires that armv7 is set. We don't have a good way to detect - # the CPU model right now so we pick a default and hope that it works okay - # for the majority of users. + # V8 on ARM requires that armv7 is set. CPU Model detected by + # the presence of __ARM_ARCH_7__ and the like defines in compiler if target_arch == 'arm': - o['variables']['armv7'] = 0 # FIXME + if options.arm_float_abi: + hard_float = options.arm_float_abi == 'hard' + else: + hard_float = arm_hard_float_abi() + o['variables']['v8_use_arm_eabi_hardfloat'] = b(hard_float) + o['variables']['armv7'] = 1 if is_arch_armv7() else 0 # clang has always supported -fvisibility=hidden, right? cc_version, is_clang = compiler_version()