mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-11-03 21:40:52 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			251 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			251 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
#!/usr/bin/python
 | 
						|
 | 
						|
# Copyright (C) 2013 Steven Watanabe
 | 
						|
# Distributed under the Boost Software License, Version 1.0.
 | 
						|
# (See accompanying file LICENSE_1_0.txt or copy at
 | 
						|
# http://www.boost.org/LICENSE_1_0.txt)
 | 
						|
 | 
						|
import sys
 | 
						|
 | 
						|
def create(t):
 | 
						|
  t.write('''mockinfo.py''', '''
 | 
						|
import re
 | 
						|
import optparse
 | 
						|
import os
 | 
						|
 | 
						|
parser = optparse.OptionParser()
 | 
						|
parser.add_option('-o', dest="output_file")
 | 
						|
parser.add_option('-x', dest="language")
 | 
						|
parser.add_option('-c', dest="compile", action="store_true")
 | 
						|
parser.add_option('-I', dest="includes", action="append")
 | 
						|
parser.add_option('-L', dest="library_path", action="append")
 | 
						|
parser.add_option('--dll', dest="dll", action="store_true")
 | 
						|
parser.add_option('--archive', dest="archive", action="store_true")
 | 
						|
parser.add_option('--static-lib', dest="static_libraries", action="append")
 | 
						|
parser.add_option('--shared-lib', dest="shared_libraries", action="append")
 | 
						|
 | 
						|
cwd = os.environ["JAM_CWD"]
 | 
						|
 | 
						|
class MockInfo(object):
 | 
						|
  def __init__(self, verbose=False):
 | 
						|
    self.files = dict()
 | 
						|
    self.commands = list()
 | 
						|
    self.verbose = verbose
 | 
						|
  def source_file(self, name, pattern):
 | 
						|
    self.files[name] = pattern
 | 
						|
  def action(self, command, status=0):
 | 
						|
    self.commands.append((command, status))
 | 
						|
  def check(self, command):
 | 
						|
    print "Testing command", command
 | 
						|
    for (raw, status) in self.commands:
 | 
						|
      if self.matches(raw, command):
 | 
						|
        return status
 | 
						|
  def matches(self, raw, command):
 | 
						|
    (expected_options, expected_args) = parser.parse_args(raw.split())
 | 
						|
    options = command[0]
 | 
						|
    input_files = list(command[1])
 | 
						|
    if self.verbose:
 | 
						|
      print "  - matching against", (expected_options, expected_args)
 | 
						|
    if len(expected_args) != len(input_files):
 | 
						|
      if self.verbose:
 | 
						|
        print "  argument list sizes differ"
 | 
						|
      return False
 | 
						|
    for arg in expected_args:
 | 
						|
      if arg.startswith('$'):
 | 
						|
        fileid = arg[1:]
 | 
						|
        pattern = self.files[fileid] if fileid in self.files else fileid
 | 
						|
        matching_file = None
 | 
						|
        for input_file in input_files:
 | 
						|
          with open(input_file, 'r') as f:
 | 
						|
            contents = f.read()
 | 
						|
          if pattern == contents:
 | 
						|
            matching_file = input_file
 | 
						|
            break
 | 
						|
        if matching_file is not None:
 | 
						|
          input_files.remove(matching_file)
 | 
						|
        else:
 | 
						|
          if self.verbose:
 | 
						|
            print "    Failed to match input file contents: %s" % arg
 | 
						|
          return False
 | 
						|
      else:
 | 
						|
        if arg in input_files:
 | 
						|
          input_files.remove(arg)
 | 
						|
        else:
 | 
						|
          if self.verbose:
 | 
						|
            print "    Failed to match input file: %s" % arg
 | 
						|
          return False
 | 
						|
 | 
						|
    if options.language != expected_options.language:
 | 
						|
      if self.verbose:
 | 
						|
        print "    Failed to match -c"
 | 
						|
      return False
 | 
						|
 | 
						|
    if options.compile != expected_options.compile:
 | 
						|
      if self.verbose:
 | 
						|
        print "    Failed to match -x"
 | 
						|
      return False
 | 
						|
 | 
						|
    # Normalize a path for comparison purposes
 | 
						|
    def adjust_path(p):
 | 
						|
      return os.path.normcase(os.path.normpath(os.path.join(cwd, p)))
 | 
						|
 | 
						|
    # order matters
 | 
						|
    if options.includes is None:
 | 
						|
      options.includes = []
 | 
						|
    if expected_options.includes is None:
 | 
						|
      expected_options.includes = []
 | 
						|
    if map(adjust_path, options.includes) != \
 | 
						|
        map(adjust_path, expected_options.includes):
 | 
						|
      if self.verbose:
 | 
						|
        print "    Failed to match -I ",  map(adjust_path, options.includes), \
 | 
						|
          " != ", map(adjust_path, expected_options.includes)
 | 
						|
      return False
 | 
						|
 | 
						|
    if options.library_path is None:
 | 
						|
      options.library_path = []
 | 
						|
    if expected_options.library_path is None:
 | 
						|
      expected_options.library_path = []
 | 
						|
    if map(adjust_path, options.library_path) != \
 | 
						|
        map(adjust_path, expected_options.library_path):
 | 
						|
      if self.verbose:
 | 
						|
        print "    Failed to match -L ",  map(adjust_path, options.library_path), \
 | 
						|
          " != ", map(adjust_path, expected_options.library_path)
 | 
						|
      return False
 | 
						|
 | 
						|
    if options.static_libraries != expected_options.static_libraries:
 | 
						|
      if self.verbose:
 | 
						|
        print "    Failed to match --static-lib"
 | 
						|
      return False
 | 
						|
 | 
						|
    if options.shared_libraries != expected_options.shared_libraries:
 | 
						|
      if self.verbose:
 | 
						|
        print "    Failed to match --shared-lib"
 | 
						|
      return False
 | 
						|
 | 
						|
    if options.dll != expected_options.dll:
 | 
						|
      if self.verbose:
 | 
						|
        print "    Failed to match --dll"
 | 
						|
      return False
 | 
						|
 | 
						|
    if options.archive != expected_options.archive:
 | 
						|
      if self.verbose:
 | 
						|
        print "    Failed to match --archive"
 | 
						|
      return False
 | 
						|
 | 
						|
    # The output must be handled after everything else
 | 
						|
    # is validated
 | 
						|
    if expected_options.output_file is not None:
 | 
						|
      if options.output_file is not None:
 | 
						|
        if expected_options.output_file.startswith('$'):
 | 
						|
          fileid = expected_options.output_file[1:]
 | 
						|
          if fileid not in self.files:
 | 
						|
            self.files[fileid] = fileid
 | 
						|
          else:
 | 
						|
            assert(self.files[fileid] == fileid)
 | 
						|
          with open(options.output_file, 'w') as output:
 | 
						|
            output.write(fileid)
 | 
						|
      else:
 | 
						|
        if self.verbose:
 | 
						|
          print "Failed to match -o"
 | 
						|
        return False
 | 
						|
    elif options.output_file is not None:
 | 
						|
      if self.verbose:
 | 
						|
        print "Failed to match -o"
 | 
						|
      return False
 | 
						|
 | 
						|
    # if we've gotten here, then everything matched
 | 
						|
    if self.verbose:
 | 
						|
      print "    Matched"
 | 
						|
    return True
 | 
						|
''')
 | 
						|
 | 
						|
  t.write('mock.py', '''
 | 
						|
import mockinfo
 | 
						|
import markup
 | 
						|
import sys
 | 
						|
 | 
						|
status = markup.info.check(mockinfo.parser.parse_args())
 | 
						|
if status is not None:
 | 
						|
  exit(status)
 | 
						|
else:
 | 
						|
  print("Unrecognized command: " + ' '.join(sys.argv))
 | 
						|
  exit(1)
 | 
						|
''')
 | 
						|
 | 
						|
  t.write('mock.jam', '''
 | 
						|
import feature ;
 | 
						|
import toolset ;
 | 
						|
import path ;
 | 
						|
import modules ;
 | 
						|
import common ;
 | 
						|
import type ;
 | 
						|
 | 
						|
.python-cmd = "\"%s\"" ;
 | 
						|
 | 
						|
# Behave the same as gcc on Windows, because that's what
 | 
						|
# the test system expects
 | 
						|
type.set-generated-target-prefix SHARED_LIB : <toolset>mock <target-os>windows : lib ;
 | 
						|
type.set-generated-target-suffix STATIC_LIB : <toolset>mock <target-os>windows : a ;
 | 
						|
 | 
						|
rule init ( )
 | 
						|
{
 | 
						|
    local here = [ path.make [ modules.binding $(__name__) ] ] ;
 | 
						|
    here = [ path.native [ path.root [ path.parent $(here) ] [ path.pwd ] ] ] ;
 | 
						|
    .config-cmd = [ common.variable-setting-command JAM_CWD : $(here) ] $(.python-cmd) -B ;
 | 
						|
}
 | 
						|
 | 
						|
feature.extend toolset : mock ;
 | 
						|
 | 
						|
generators.register-c-compiler mock.compile.c++ : CPP : OBJ : <toolset>mock ;
 | 
						|
generators.register-c-compiler mock.compile.c : C : OBJ : <toolset>mock ;
 | 
						|
 | 
						|
generators.register-linker mock.link : LIB OBJ : EXE : <toolset>mock ;
 | 
						|
generators.register-linker mock.link.dll : LIB OBJ : SHARED_LIB : <toolset>mock ;
 | 
						|
generators.register-archiver mock.archive : OBJ : STATIC_LIB : <toolset>mock ;
 | 
						|
 | 
						|
toolset.flags mock.compile INCLUDES <include> ;
 | 
						|
 | 
						|
actions compile.c
 | 
						|
{
 | 
						|
   $(.config-cmd) mock.py -c -x c -I"$(INCLUDES)" "$(>)" -o "$(<)"
 | 
						|
}
 | 
						|
 | 
						|
actions compile.c++
 | 
						|
{
 | 
						|
    $(.config-cmd) mock.py -c -x c++ -I"$(INCLUDES)" "$(>)" -o "$(<)"
 | 
						|
}
 | 
						|
 | 
						|
toolset.flags mock.link USER_OPTIONS <linkflags> ;
 | 
						|
toolset.flags mock.link FINDLIBS-STATIC <find-static-library> ;
 | 
						|
toolset.flags mock.link FINDLIBS-SHARED <find-shared-library> ;
 | 
						|
toolset.flags mock.link LINK_PATH <library-path> ;
 | 
						|
toolset.flags mock.link LIBRARIES <library-file> ;
 | 
						|
 | 
						|
actions link
 | 
						|
{
 | 
						|
    $(.config-cmd) mock.py "$(>)" -o "$(<)" $(USER_OPTIONS) -L"$(LINK_PATH)" --static-lib=$(FINDLIBS-STATIC) --shared-lib=$(FINDLIBS-SHARED)
 | 
						|
}
 | 
						|
 | 
						|
actions archive
 | 
						|
{
 | 
						|
    $(.config-cmd) mock.py --archive "$(>)" -o "$(<)" $(USER_OPTIONS)
 | 
						|
}
 | 
						|
 | 
						|
actions link.dll
 | 
						|
{
 | 
						|
    $(.config-cmd) mock.py --dll "$(>)" -o "$(<)" $(USER_OPTIONS) -L"$(LINK_PATH)" --static-lib=$(FINDLIBS-STATIC) --shared-lib=$(FINDLIBS-SHARED)
 | 
						|
}
 | 
						|
 | 
						|
''' % sys.executable.replace('\\', '\\\\'))
 | 
						|
 | 
						|
def set_expected(t, markup):
 | 
						|
  verbose = "True" if t.verbose else "False"
 | 
						|
  t.write('markup.py', '''
 | 
						|
import mockinfo
 | 
						|
info = mockinfo.MockInfo(%s)
 | 
						|
def source_file(name, contents):
 | 
						|
  info.source_file(name, contents)
 | 
						|
def action(command, status=0):
 | 
						|
  info.action(command, status)
 | 
						|
''' % verbose + markup)
 |