SConstruct
上传用户:market2
上传日期:2018-11-18
资源大小:18786k
文件大小:9k
源码类别:

外挂编程

开发平台:

Windows_Unix

  1. # -*-python-*-
  2. # This is the main SCons script which defines compilation rules.
  3. # See http://www.scons.org/ for more information.
  4. #
  5. # If you wish to tweak the build system but aren't familiar with SCons,
  6. # then simply edit these variables:
  7. # Extra directories in which the C(++) compiler should look for
  8. # header files.
  9. # Example: EXTRA_INCLUDE_DIRECTORIES = ['/foo', '/bar']
  10. EXTRA_INCLUDE_DIRECTORIES = []
  11. # Extra directories in which the linker should search for libraries.
  12. # Example: EXTRA_LIBRARY_DIRECTORIES = ['/opt/foo/lib', '/tmp/bar/lib']
  13. EXTRA_LIBRARY_DIRECTORIES = []
  14. # Extra arguments to be passed to the compiler during the compilation
  15. # stage (not during the linking stage).
  16. EXTRA_COMPILER_FLAGS = ['-Wall', '-g', '-O2', '-pipe']
  17. ####################
  18. import os
  19. import sys
  20. ### Platform configuration ###
  21. platform = str(ARGUMENTS.get('OS', Platform()))
  22. cygwin = platform == "cygwin"
  23. darwin = platform == "darwin"
  24. win32 = cygwin or platform == "win32"
  25. have_ncurses = False
  26. READLINE_LIB = 'readline'
  27. perlconfig = {}
  28. env = Environment()
  29. def CheckPerl(context):
  30. global cygwin
  31. global win32
  32. global perlconfig
  33. context.Message('Checking Perl configuration ...')
  34. source = '''
  35. use strict;
  36. use Config;
  37. use File::Spec;
  38. sub search {
  39. my $paths = shift;
  40. my $file = shift;
  41. foreach (@{$paths}) {
  42. if (-f "$_/$file") {
  43. return "$_/$file";
  44. last;
  45. }
  46. }
  47. return;
  48. }
  49. my $coredir = File::Spec->catfile($Config{installarchlib}, "CORE");
  50. open(F, ">", ".perlconfig.txt");
  51. print F "perl=$Config{perlpath}\n";
  52. print F "typemap=" . search(\@INC, "ExtUtils/typemap") . "\n";
  53. print F "xsubpp=" . search(\@INC, "ExtUtils/xsubpp" || search([File::Spec->path()], "xsubpp")) . "\n";
  54. print F "coredir=$coredir\n";
  55. close F;
  56. '''
  57. f = file(".perltest.pl", "w")
  58. f.write(source)
  59. f.close()
  60. if win32:
  61. if cygwin:
  62. # Maybe the user just installed ActivePerl and wperl isn't
  63. # in PATH yet. So add the default Perl installation folder
  64. # to PATH.
  65. os.environ['PATH'] += os.path.pathsep + "/cygdrive/c/Perl/bin"
  66. ret = os.spawnlp(os.P_WAIT, "wperl", "wperl", ".perltest.pl")
  67. else:
  68. ret = os.spawnlp(os.P_WAIT, "perl", "perl", ".perltest.pl")
  69. context.Result(ret == 0)
  70. os.unlink(".perltest.pl")
  71. if ret == 0:
  72. f = file(".perlconfig.txt", "r")
  73. while 1:
  74. line = f.readline()
  75. if line == "":
  76. break
  77. line = line.rstrip("n")
  78. line = line.rstrip("r")
  79. [name, value] = line.split("=", 2)
  80. perlconfig[name] = value
  81. f.close()
  82. os.unlink(".perlconfig.txt")
  83. if cygwin:
  84. # Convert paths to Cygwin-compatible paths
  85. def cygpath(path):
  86. f = os.popen('cygpath --unix "' + path + '"', 'r')
  87. if f == None:
  88. return path
  89. else:
  90. line = f.readline()
  91. line = line.rstrip("n")
  92. line = line.rstrip("r")
  93. f.close()
  94. return line
  95. perlconfig['perl'] = cygpath(perlconfig['perl'])
  96. perlconfig['coredir'] = cygpath(perlconfig['coredir'])
  97. return ret == 0
  98. def CheckReadline(context, conf):
  99. context.Message('Checking for GNU readline 4.3 or higher...')
  100. result = context.TryCompile("""
  101. #include <stdio.h>
  102. #include <readline/readline.h>
  103. #if !defined(RL_READLINE_VERSION)
  104. #error "You do not have the GNU readline development headers installed!"
  105. #elif RL_READLINE_VERSION < 0x0403
  106. #error "Your version of GNU readline is too old. Please install version 4.3 or higher."
  107. #endif
  108. """, '.c')
  109. context.Result(result)
  110. return result
  111. def CheckLibCurl(context):
  112. context.Message('Checking for libcurl...')
  113. (input, output, error) = os.popen3('curl-config --version', 'r')
  114. if input != None:
  115. input.close()
  116. if error != None:
  117. error.close()
  118. if output != None:
  119. version = "n".join(output.readlines())
  120. output.close()
  121. version = version.rstrip("n")
  122. version = version.rstrip("r")
  123. result = version
  124. else:
  125. result = False
  126. context.Result(result)
  127. return result
  128. conf = Configure(env, custom_tests = {
  129. 'CheckPerl' : CheckPerl,
  130. 'CheckReadline' : CheckReadline,
  131. 'CheckLibCurl'  : CheckLibCurl
  132. })
  133. if not conf.CheckPerl():
  134. print "You do not have Perl installed! Read:"
  135. print "http://www.openkore.com/wiki/index.php/How_to_run_OpenKore_on_Linux/Unix#Perl.27s_Time::HiRes_module"
  136. Exit(1)
  137. if not win32:
  138. have_ncurses = conf.CheckLib('ncurses')
  139. if not conf.CheckReadline(conf):
  140. print "You don't have GNU readline installed, or your version of GNU readline is not recent enough! Read:"
  141. print "http://www.openkore.com/wiki/index.php/How_to_run_OpenKore_on_Linux/Unix#GNU_readline"
  142. Exit(1)
  143. if darwin:
  144. has_readline_5 = conf.CheckLib('readline.5')
  145. sys.stdout.write('Checking whether Readline 5 is available...')
  146. sys.stdout.flush
  147. if has_readline_5:
  148. READLINE_LIB = 'readline.5'
  149. sys.stdout.write(" yesn")
  150. else:
  151. sys.stdout.write(" non")
  152. if not conf.CheckLibCurl():
  153. print "You don't have libcurl installed. Please download it at:";
  154. print "http://curl.haxx.se/libcurl/";
  155. Exit(1)
  156. conf.Finish()
  157. ### Environment setup ###
  158. # Standard environment for programs
  159. env['CCFLAGS'] = [] + EXTRA_COMPILER_FLAGS
  160. env['LINKFLAGS'] = []
  161. env['LIBPATH'] = [] + EXTRA_LIBRARY_DIRECTORIES
  162. env['LIBS'] = []
  163. env['CPPDEFINES'] = []
  164. env['CPPPATH'] = [] + EXTRA_INCLUDE_DIRECTORIES
  165. if cygwin:
  166. env['CCFLAGS'] += ['-mno-cygwin']
  167. env['LINKFLAGS'] += ['-mno-cygwin']
  168. env.Replace(CXXFLAGS = env['CCFLAGS'])
  169. # Environment for libraries
  170. libenv = env.Clone()
  171. if win32:
  172. if cygwin:
  173. libenv['CCFLAGS'] += ['-mdll']
  174. libenv['CPPDEFINES'] += ['WIN32']
  175. elif not darwin:
  176. libenv['CCFLAGS'] += ['-fPIC']
  177. libenv['LINKFLAGS'] += ['-fPIC']
  178. libenv.Replace(CXXFLAGS = libenv['CCFLAGS'])
  179. if cygwin:
  180. # We want to build native Win32 DLLs on Cygwin
  181. def linkDLLAction(target, source, env):
  182. sources = []
  183. for f in source:
  184. sources += [str(f)]
  185. (temp, dllname) = os.path.split(str(target[0]))
  186. (targetName, temp) = os.path.splitext(str(target[0]))
  187. command = ['dlltool', '--dllname', dllname,
  188. '-z', targetName + '.def',
  189. '-l', targetName + '.lib',
  190. '--export-all-symbols',
  191. '--add-stdcall-alias'] + sources
  192. print ' '.join(command)
  193. ret = os.spawnvp(os.P_WAIT, command[0], command)
  194. if ret != 0:
  195. return 0
  196. command = ['dllwrap', '--driver=g++', '--target=i386-mingw32',
  197. '--def', targetName + '.def', '-mno-cygwin'] + 
  198. sources + ['-o', str(target[0])]
  199. if env.has_key('LIBPATH'):
  200. for dir in env['LIBPATH']:
  201. command += ['-L' + dir]
  202. if env.has_key('LIBS'):
  203.   for flag in env['LIBS']:
  204. command += ['-l' + flag]
  205. command += ['-lstdc++']
  206. print ' '.join(command)
  207. return os.spawnvp(os.P_WAIT, command[0], command)
  208. NativeDLLBuilder = Builder(action = linkDLLAction,
  209. emitter = '$LIBEMITTER',
  210. suffix = 'dll',
  211. src_suffix = '$OBJSUFFIX',
  212. src_builder = 'SharedObject')
  213. elif darwin:
  214. def linkBundleAction(target, source, env):
  215. sources = []
  216. for f in source:
  217. sources += [str(f)]
  218. command = [env['CXX'], '-flat_namespace', '-bundle',
  219. '-undefined', 'dynamic_lookup',
  220. '-o', str(target[0])] + sources
  221. if env.has_key('LIBPATH'):
  222. for dir in env['LIBPATH']:
  223. command += ['-L' + dir]
  224. if env.has_key('LIBS'):
  225.   for flag in env['LIBS']:
  226. command += ['-l' + flag]
  227. print ' '.join(command)
  228. return os.spawnvp(os.P_WAIT, command[0], command)
  229. NativeDLLBuilder = Builder(action = linkBundleAction,
  230.    emitter = '$LIBEMITTER',
  231.    prefix = '',
  232.    suffix = 'bundle',
  233.    src_suffix = '$OBJSUFFIX',
  234.    src_builder = 'SharedObject')
  235. else:
  236. NativeDLLBuilder = libenv['BUILDERS']['SharedLibrary']
  237. libenv['BUILDERS']['NativeDLL'] = NativeDLLBuilder
  238. # Environment for Perl libraries
  239. perlenv = libenv.Clone()
  240. if win32:
  241. # Windows
  242. perlenv['CCFLAGS'] += Split('-Wno-comments -include stdint.h')
  243. perlenv['CPPDEFINES'] += Split('__MINGW32__ WIN32IO_IS_STDIO ' +
  244. '_UINTPTR_T_DEFINED CHECK_FORMAT')
  245. perlenv['LIBS'] += ['perl58']
  246. perlenv['LIBPATH'] += [perlconfig['coredir']]
  247. elif not darwin:
  248. # Unix (except MacOS X)
  249. perlenv['CCFLAGS'] += Split('-D_REENTRANT -D_GNU_SOURCE' +
  250. ' -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64')
  251. else:
  252. # MacOS X
  253. perlenv['CCFLAGS'] += ['-no-cpp-precomp', '-DPERL_DARWIN',
  254.       '-fno-strict-aliasing']
  255. perlenv['LIBS'] += ['perl']
  256. perlenv['LIBPATH'] += [perlconfig['coredir']]
  257. # Add default Fink header directory to header search path.
  258. # But give system's default include paths higher priority.
  259. perlenv['CPPPATH'] += ['/usr/include', '/usr/local/include', '/sw/include']
  260. perlenv['CPPPATH'] += [perlconfig['coredir']]
  261. perlenv['CCFLAGS'] += ['-DVERSION=\"1.0\"', '-DXS_VERSION=\"1.0\"']
  262. perlenv.Replace(CXXFLAGS = perlenv['CCFLAGS'])
  263. def buildXS(target, source, env):
  264. global perlconfig
  265. code = '''
  266. use strict;
  267. my $out = shift;
  268. my $file = shift;
  269. close STDOUT;
  270. if (!open(STDOUT, ">", $out)) {
  271. print STDERR "Cannot open $out for writing: $!n";
  272. exit 1;
  273. }
  274. select STDOUT;
  275. do $file;
  276. '''
  277. print "Creating", str(target[0]), "..."
  278. command = [
  279. perlconfig['perl'],
  280. '-e',
  281. code,
  282. str(target[0]),
  283. perlconfig['xsubpp'],
  284. '-C++',
  285. '-typemap',
  286. perlconfig['typemap'],
  287. str(source[0])]
  288. return os.spawnvp(os.P_WAIT, perlconfig['perl'], command)
  289. perlenv.Append(BUILDERS = { 'XS' : Builder(action = buildXS) })
  290. ### Invoke SConscripts ###
  291. Export('env libenv perlenv platform win32 cygwin darwin have_ncurses READLINE_LIB')
  292. sconscripts = []
  293. if not int(ARGUMENTS.get('TESTS_ONLY', 0)):
  294. sconscripts += ['src/auto/XSTools/SConscript']
  295. sconscripts += ['src/test/SConscript']
  296. SConscript(sconscripts)