import os, subprocess
-Import('env')
+Import('main')
+
+from m5.util import compareVersions
elf_files = []
def ElfFile(filename):
elf_files.append(File(filename))
-
+
ElfFile('elf_begin.c')
ElfFile('elf_cntl.c')
ElfFile('elf_data.c')
ElfFile('elf_end.c')
+ElfFile('elf_errmsg.c')
+ElfFile('elf_errno.c')
ElfFile('elf_fill.c')
ElfFile('elf_flag.c')
ElfFile('elf_getarhdr.c')
ElfFile('libelf_fsize.c')
ElfFile('libelf_msize.c')
-m4env = Environment(ENV=os.environ)
-if env.get('CC'):
- m4env['CC'] = env['CC']
-if env.get('CXX'):
- m4env['CXX'] = env['CXX']
+m4env = main.Clone()
+if m4env['GCC']:
+ m4env.Append(CCFLAGS=['-Wno-pointer-sign'])
+ if compareVersions(m4env['GCC_VERSION'], '4.6') >= 0:
+ m4env.Append(CCFLAGS=['-Wno-unused-but-set-variable',
+ '-Wno-implicit-function-declaration'])
+if m4env['CLANG']:
+ m4env.Append(CCFLAGS=['-Wno-initializer-overrides', '-Wno-pointer-sign'])
+ # clang defaults to c99 (while gcc defaults to gnu89) and there is a
+ # difference in the handling of inlining functions which causes
+ # linking problems with multiple definitions of the symbols in
+ # sysmacros.h for older versions of glibc
+ m4env.Append(CCFLAGS=['-std=gnu89'])
+m4env.Append(CCFLAGS=['-Wno-implicit'])
+del m4env['CPPPATH']
# If we have gm4 use it
-if subprocess.Popen("gm4 --version", shell=True, stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT, close_fds=True).communicate()[0].find('GNU') >= 0:
+if m4env.Detect('gm4'):
m4env['M4'] = 'gm4'
# Check that m4 is available
-if not m4env.get('M4'):
- print "Error: Can't find version of M4 macro processor. Please install M4 and try again."
+import SCons.Tool.m4
+if not SCons.Tool.m4.exists(m4env):
+ print "Error: Can't find version of M4 macro processor. " + \
+ "Please install M4 and try again."
Exit(1)
-m4env.Append(M4FLAGS='-DSRCDIR=%s' % Dir('.').path)
+m4env.Append(M4FLAGS=['-DSRCDIR=%s' % Dir('.').path])
m4env['M4COM'] = '$M4 $M4FLAGS $SOURCES > $TARGET'
m4env.M4(target=File('libelf_convert.c'),
source=[File('elf_types.m4'), File('libelf_convert.m4')])
source=[File('elf_types.m4'), File('libelf_fsize.m4')])
m4env.M4(target=File('libelf_msize.c'),
source=[File('elf_types.m4'), File('libelf_msize.m4')])
-m4env.Library('elf', elf_files)
-env.Append(CPPPATH=Dir('.'))
-env.Append(LIBS=['elf'])
-env.Append(LIBPATH=[Dir('.')])
+# Build libelf as a static library with PIC code so it can be linked
+# into either m5 or the library
+m4env.Library('elf', [m4env.SharedObject(f) for f in elf_files])
+
+main.Prepend(CPPPATH=Dir('.'))
+main.Append(LIBS=['elf'])
+main.Prepend(LIBPATH=[Dir('.')])