blob: deec9900c8dba8bd9586ffa9be6356fe85c412f7 [file] [log] [blame]
#
# Copyright 2019 The Cobalt Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
"""Goma specific definitions and helper functions.
Goma is used for faster builds. Install goma and add directory to PATH.
Provides common functions to setup goma across platform builds.
It checks that goma is enabled and installed, and starts the
goma proxy.
Override settings using environment variables.
USE_GOMA To enable/disable goma. Default is None.
"""
import logging
import os
import subprocess
import sys
import util
def _GomaEnabledFromEnv():
"""Enable goma if USE_GOMA is defined.
Returns:
True to enable goma, defaults to False.
"""
if 'USE_GOMA' in os.environ:
return os.environ['USE_GOMA'] == '1'
return False
def _GetGomaFromPath():
"""Returns goma directory from PATH, otherwise is None."""
gomacc_path = util.Which('gomacc')
if gomacc_path is not None:
return os.path.dirname(gomacc_path)
return None
def _GomaInstalled(goma_dir):
"""Returns True if goma is installed, otherwise is False."""
if goma_dir and os.path.isdir(goma_dir):
if os.path.isfile(GomaControlFile(goma_dir)):
logging.error('Using Goma installed at: %s', goma_dir)
return True
logging.error('Failed to find goma dir. Check PATH location: %s', goma_dir)
return False
def GomaControlFile(goma_dir):
"""Returns path to goma control script."""
return os.path.join(goma_dir, 'goma_ctl.py')
def _GomaEnsureStart(goma_dir):
"""Starts the goma proxy.
Checks the proxy status and tries to start if not running.
Args:
goma_dir: goma install directory
Returns:
True if goma started, otherwise False.
"""
if not _GomaInstalled(goma_dir):
return False
goma_ctl = GomaControlFile(goma_dir)
command = [goma_ctl, 'ensure_start']
logging.error('starting goma proxy...')
try:
subprocess.check_call(command)
return True
except subprocess.CalledProcessError as e:
logging.error('Goma proxy failed to start.\nCommand: %s\n%s',
' '.join(e.cmd), e.output)
return False
def FindAndStartGoma(enable_in_path=True, exit_on_failed_start=False):
"""Uses goma if installed and proxy is running.
Args:
enable_in_path: If True, enable goma if found in PATH. Otherwise,
it enables it when USE_GOMA=1 is set.
exit_on_failed_start: Boolean to exit if goma is enabled, but wasn't
started.
Returns:
True if goma is enabled and running, otherwise False.
"""
if enable_in_path or _GomaEnabledFromEnv():
goma_dir = _GetGomaFromPath()
if _GomaEnsureStart(goma_dir):
return True
else:
logging.critical('goma was enabled, but failed to start.')
if exit_on_failed_start:
sys.exit(1)
return False
else:
logging.info('Goma is disabled. To enable, check for gomacc in PATH '
'and/or set USE_GOMA=1.')
return False