|  | @@ -178,6 +178,9 @@ class CLanguage(object):
 | 
	
		
			
				|  |  |        return ['buildtests_%s' % self.make_target]
 | 
	
		
			
				|  |  |      return ['buildtests_%s' % self.make_target, 'tools_%s' % self.make_target]
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  def make_options(self):
 | 
	
		
			
				|  |  | +    return []
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    def pre_build_steps(self):
 | 
	
		
			
				|  |  |      if self.platform == 'windows':
 | 
	
		
			
				|  |  |        return [['tools\\run_tests\\pre_build_c.bat']]
 | 
	
	
		
			
				|  | @@ -216,6 +219,9 @@ class NodeLanguage(object):
 | 
	
		
			
				|  |  |    def make_targets(self, test_regex):
 | 
	
		
			
				|  |  |      return []
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  def make_options(self):
 | 
	
		
			
				|  |  | +    return []
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    def build_steps(self):
 | 
	
		
			
				|  |  |      return [['tools/run_tests/build_node.sh']]
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -244,6 +250,9 @@ class PhpLanguage(object):
 | 
	
		
			
				|  |  |    def make_targets(self, test_regex):
 | 
	
		
			
				|  |  |      return ['static_c', 'shared_c']
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  def make_options(self):
 | 
	
		
			
				|  |  | +    return []
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    def build_steps(self):
 | 
	
		
			
				|  |  |      return [['tools/run_tests/build_php.sh']]
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -283,6 +292,9 @@ class PythonLanguage(object):
 | 
	
		
			
				|  |  |    def make_targets(self, test_regex):
 | 
	
		
			
				|  |  |      return ['static_c', 'grpc_python_plugin', 'shared_c']
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  def make_options(self):
 | 
	
		
			
				|  |  | +    return []
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    def build_steps(self):
 | 
	
		
			
				|  |  |      commands = []
 | 
	
		
			
				|  |  |      for python_version in self._build_python_versions:
 | 
	
	
		
			
				|  | @@ -322,6 +334,9 @@ class RubyLanguage(object):
 | 
	
		
			
				|  |  |    def make_targets(self, test_regex):
 | 
	
		
			
				|  |  |      return ['static_c']
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  def make_options(self):
 | 
	
		
			
				|  |  | +    return []
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    def build_steps(self):
 | 
	
		
			
				|  |  |      return [['tools/run_tests/build_ruby.sh']]
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -394,6 +409,13 @@ class CSharpLanguage(object):
 | 
	
		
			
				|  |  |      else:
 | 
	
		
			
				|  |  |        return ['grpc_csharp_ext']
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  def make_options(self):
 | 
	
		
			
				|  |  | +    if self.platform == 'mac':
 | 
	
		
			
				|  |  | +      # On Mac, official distribution of mono is 32bit.
 | 
	
		
			
				|  |  | +      return ['CFLAGS=-arch i386', 'LDFLAGS=-arch i386']
 | 
	
		
			
				|  |  | +    else:
 | 
	
		
			
				|  |  | +      return []
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    def build_steps(self):
 | 
	
		
			
				|  |  |      if self.platform == 'windows':
 | 
	
		
			
				|  |  |        return [['src\\csharp\\buildall.bat']]
 | 
	
	
		
			
				|  | @@ -425,6 +447,9 @@ class ObjCLanguage(object):
 | 
	
		
			
				|  |  |    def make_targets(self, test_regex):
 | 
	
		
			
				|  |  |      return ['grpc_objective_c_plugin', 'interop_server']
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  def make_options(self):
 | 
	
		
			
				|  |  | +    return []
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    def build_steps(self):
 | 
	
		
			
				|  |  |      return [['src/objective-c/tests/build_tests.sh']]
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -455,6 +480,9 @@ class Sanity(object):
 | 
	
		
			
				|  |  |    def make_targets(self, test_regex):
 | 
	
		
			
				|  |  |      return ['run_dep_checks']
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  def make_options(self):
 | 
	
		
			
				|  |  | +    return []
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    def build_steps(self):
 | 
	
		
			
				|  |  |      return []
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -482,6 +510,9 @@ class Build(object):
 | 
	
		
			
				|  |  |    def make_targets(self, test_regex):
 | 
	
		
			
				|  |  |      return ['static']
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  def make_options(self):
 | 
	
		
			
				|  |  | +    return []
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    def build_steps(self):
 | 
	
		
			
				|  |  |      return []
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -749,6 +780,14 @@ if len(build_configs) > 1:
 | 
	
		
			
				|  |  |        print language, 'does not support multiple build configurations'
 | 
	
		
			
				|  |  |        sys.exit(1)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +language_make_options=[]
 | 
	
		
			
				|  |  | +if any(language.make_options() for language in languages):
 | 
	
		
			
				|  |  | +  if len(languages) != 1:
 | 
	
		
			
				|  |  | +    print 'languages with custom make options cannot be built simultaneously with other languages'
 | 
	
		
			
				|  |  | +    sys.exit(1)
 | 
	
		
			
				|  |  | +  else:
 | 
	
		
			
				|  |  | +    language_make_options = next(iter(languages)).make_options()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  if platform_string() != 'windows':
 | 
	
		
			
				|  |  |    if args.arch != 'default':
 | 
	
		
			
				|  |  |      print 'Architecture %s not supported on current platform.' % args.arch
 | 
	
	
		
			
				|  | @@ -772,7 +811,8 @@ if platform_string() == 'windows':
 | 
	
		
			
				|  |  |                        '/p:Configuration=%s' % _WINDOWS_CONFIG[cfg],
 | 
	
		
			
				|  |  |                        _windows_toolset_option(args.compiler),
 | 
	
		
			
				|  |  |                        _windows_arch_option(args.arch)] +
 | 
	
		
			
				|  |  | -                      extra_args,
 | 
	
		
			
				|  |  | +                      extra_args +
 | 
	
		
			
				|  |  | +                      language_make_options,
 | 
	
		
			
				|  |  |                        shell=True, timeout_seconds=None)
 | 
	
		
			
				|  |  |        for target in targets]
 | 
	
		
			
				|  |  |  else:
 | 
	
	
		
			
				|  | @@ -783,6 +823,7 @@ else:
 | 
	
		
			
				|  |  |                                '-j', '%d' % (multiprocessing.cpu_count() + 1),
 | 
	
		
			
				|  |  |                                'EXTRA_DEFINES=GRPC_TEST_SLOWDOWN_MACHINE_FACTOR=%f' % args.slowdown,
 | 
	
		
			
				|  |  |                                'CONFIG=%s' % cfg] +
 | 
	
		
			
				|  |  | +                              language_make_options +
 | 
	
		
			
				|  |  |                               ([] if not args.travis else ['JENKINS_BUILD=1']) +
 | 
	
		
			
				|  |  |                               targets,
 | 
	
		
			
				|  |  |                               timeout_seconds=None)]
 |