X-Git-Url: http://git.sven.stormbind.net/?p=sven%2Fexfat-utils.git;a=blobdiff_plain;f=SConstruct;h=e40a3409aaf1a3c3da2dbcf16a22ab0881d73c62;hp=14bd10e8fbcfbd6e31e38af4b3faf62a9e984250;hb=6b81bcd3e9fe39edc6868151d2ac7612c8d0fb80;hpb=bdac146497d70488232fc8d465dd3f2b9877d94c diff --git a/SConstruct b/SConstruct index 14bd10e..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,46 +23,79 @@ import platform import SCons env = Environment(**ARGUMENTS) -conf = Configure(env) +for var in ['PATH', 'SYSROOT']: + if var in os.environ: + env['ENV'][var] = os.environ[var] destdir = env.get('DESTDIR', '/sbin'); -targets = [] 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() + -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') - elif conf.env['CC'] == 'clang': - conf.env.Replace(CCFLAGS = '-Wall -O2 -g') -conf.env.Append(CPPDEFINES = {'FUSE_USE_VERSION': 26}) -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']) - -# __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': - conf.env.Append(CPPDEFINES = {'__DARWIN_64_BIT_INO_T' : 0}) - conf.env.Append(CPPDEFINES = {'__DARWIN_UNIX03' : 1}) - -# 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']) - -env = conf.Finish() def make_symlink(dir, target, link_name): workdir = os.getcwd() @@ -84,18 +117,16 @@ def program(pattern, output, alias, libs): return 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', [libs + ['fuse']]) +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) - -Default(targets)