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)
							 |