X-Git-Url: http://git.sven.stormbind.net/?p=sven%2Fexfat-utils.git;a=blobdiff_plain;f=SConstruct;h=e40a3409aaf1a3c3da2dbcf16a22ab0881d73c62;hp=e4b2b104d6af33ab237e98e689342345e63981dc;hb=6b81bcd3e9fe39edc6868151d2ac7612c8d0fb80;hpb=4cb393cfd9b0ab69392612521ee3dbe481ec492d diff --git a/SConstruct b/SConstruct index e4b2b10..e40a340 100644 --- a/SConstruct +++ b/SConstruct @@ -2,7 +2,7 @@ # SConstruct (10.09.09) # SConscript for all components. # -# Copyright (C) 2009, 2010 Andrew Nayenko +# Copyright (C) 2010-2013 Andrew Nayenko # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -23,23 +23,79 @@ import platform import SCons env = Environment(**ARGUMENTS) +for var in ['PATH', 'SYSROOT']: + if var in os.environ: + env['ENV'][var] = os.environ[var] + destdir = env.get('DESTDIR', '/sbin'); -targets = [] - -if not env['CCFLAGS']: - if env['CC'] == 'gcc': - env['CCFLAGS'] = '-Wall -O2 -ggdb' -env.Append(CPPDEFINES = {'FUSE_USE_VERSION': 26}) -env.Append(CPPDEFINES = {'_FILE_OFFSET_BITS' : 64}) -# __DARWIN_64_BIT_INO_T=0 define is needed because since Snow Leopard inode -# numbers are 64-bit by default, but libfuse operates 32-bit ones. This define -# forces 32-bit inode declaration in system headers, but it's also possible to -# link against libfuse_ino64 instead. -if platform.system() == 'Darwin': - env.Append(CPPDEFINES = {'__DARWIN_64_BIT_INO_T' : 0}) - env.Append(CPPDEFINES = {'__DARWIN_UNIX03' : 1}) -env.Append(CPPPATH = ['libexfat']) -env.Append(LINKFLAGS = '') +libs = ['exfat'] +libfuse = 'fuse' + +if not env.GetOption('clean'): + conf = Configure(env) + + if 'AR' in os.environ: + conf.env.Replace(AR = os.environ['AR']) + if 'RANLIB' in os.environ: + conf.env.Replace(RANLIB = os.environ['RANLIB']) + if 'CC' in os.environ: + conf.env.Replace(CC = os.environ['CC']) + if 'CCFLAGS' in os.environ: + conf.env.Replace(CCFLAGS = os.environ['CCFLAGS']) + # Set default CCFLAGS for known compilers + if not conf.env['CCFLAGS']: + if conf.env['CC'] == 'gcc': + conf.env.Replace(CCFLAGS = '-Wall -O2 -ggdb -std=c99') + elif conf.env['CC'] == 'clang': + conf.env.Replace(CCFLAGS = '-Wall -O2 -g -std=c99') + if 'CPPFLAGS' in os.environ: + conf.env.Replace(CPPFLAGS = os.environ['CPPFLAGS']) + conf.env.Append(CPPDEFINES = {'_FILE_OFFSET_BITS' : 64}) + conf.env.Append(CPPPATH = ['libexfat']) + if 'LDFLAGS' in os.environ: + conf.env.Append(LINKFLAGS = os.environ['LDFLAGS']) + conf.env.Append(LIBPATH = ['libexfat']) + + # GNU/Linux requires _BSD_SOURCE define for vsyslog(), _XOPEN_SOURCE >= 500 + # for pread(), pwrite(), snprintf(), strdup(), etc. Everything needed is + # enabled by _GNU_SOURCE. + if platform.system() == 'Linux': + conf.env.Append(CPPDEFINES = '_GNU_SOURCE'); + + # Use 64-bit inode numbers (introduced in Mac OS X 10.5 Leopard). Require + # OSXFUSE (http://osxfuse.github.com). + if platform.system() == 'Darwin': + conf.env.Append(CPPDEFINES = '_DARWIN_USE_64_BIT_INODE') + conf.env.Append(CPPDEFINES = {'__DARWIN_UNIX03' : 1}) + conf.env.Append(CPPPATH = ['/usr/local/include/osxfuse']) + conf.env.Append(CFLAGS = '-mmacosx-version-min=10.5') + conf.env.Append(LINKFLAGS = '-mmacosx-version-min=10.5') + libfuse = 'osxfuse_i64' + + # FreeBSD does not support block devices, only raw devices. Ublio is + # required for unaligned I/O and caching. + if platform.system() == 'FreeBSD': + conf.env.Append(CPPDEFINES = 'USE_UBLIO') + libs.append('ublio') + conf.env.Append(CPPPATH = ['/usr/local/include']) + conf.env.Append(LIBPATH = ['/usr/local/lib']) + + if not conf.CheckCC(): + print ''' + A working C compiler is needed very much. +''' + Exit(1) + + if not conf.CheckTypeSize('off_t', '#include ', 'C', 8): + print ''' + The size of off_t type must be 64 bits. File systems larger than + 2 GB will be corrupted with 32-bit off_t. +''' + Exit(1) + + env = conf.Finish() + + def make_symlink(dir, target, link_name): workdir = os.getcwd() @@ -55,27 +111,22 @@ symlink = SCons.Action.ActionFactory(make_symlink, lambda dir, target, link_name: 'make_symlink("%s", "%s", "%s")' % (dir, target, link_name)) -def program(pattern, output, alias = None, lib = None): +def program(pattern, output, alias, libs): sources = Glob(pattern) if not sources: return - libs = ['exfat'] - if lib: - libs.append(lib) - target = env.Program(output, sources, LIBS = libs, LIBPATH = 'libexfat') + target = env.Program(output, sources, LIBS = libs) if alias: - Alias('install', Install(destdir, target), - symlink(destdir, os.path.basename(output), alias)) + Clean(Alias('install', Install(destdir, target), + symlink(destdir, os.path.basename(output), alias)), + destdir + '/' + alias) else: Alias('install', Install(destdir, target)) - targets.append(target) env.Library('libexfat/exfat', Glob('libexfat/*.c')) -program('fuse/*.c', 'fuse/mount.exfat-fuse', 'mount.exfat', ['fuse']) -program('dump/*.c', 'dump/dumpexfat') -program('fsck/*.c', 'fsck/exfatfsck', 'fsck.exfat') -program('mkfs/*.c', 'mkfs/mkexfatfs', 'mkfs.exfat') -program('label/*.c', 'label/exfatlabel') - -Default(targets) +program('fuse/*.c', 'fuse/mount.exfat-fuse', 'mount.exfat', [libs + [libfuse]]) +program('dump/*.c', 'dump/dumpexfat', None, libs) +program('fsck/*.c', 'fsck/exfatfsck', 'fsck.exfat', libs) +program('mkfs/*.c', 'mkfs/mkexfatfs', 'mkfs.exfat', libs) +program('label/*.c', 'label/exfatlabel', None, libs)