2013-03-02 03:51:11 +04:00
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
from __future__ import print_function , unicode_literals
import os
import platform
import sys
2013-05-21 05:07:48 +04:00
import time
STATE_DIR_FIRST_RUN = '''
mach and the build system store shared state in a common directory on the
filesystem . The following directory will be created :
{ userdir }
If you would like to use a different directory , hit CTRL + c and set the
MOZBUILD_STATE_PATH environment variable to the directory you would like to
use and re - run mach . For this change to take effect forever , you ' ll likely
want to export this environment variable from your shell ' s init scripts.
''' .lstrip()
2013-03-02 03:51:11 +04:00
# TODO Bug 794506 Integrate with the in-tree virtualenv configuration.
SEARCH_PATHS = [
' python/mach ' ,
' python/mozboot ' ,
' python/mozbuild ' ,
2013-07-30 03:58:40 +04:00
' python/mozversioncontrol ' ,
2013-03-02 03:51:11 +04:00
' python/blessings ' ,
2015-03-18 20:47:36 +03:00
' python/compare-locales ' ,
2013-07-18 23:55:41 +04:00
' python/configobj ' ,
2013-09-12 06:54:19 +04:00
' python/jsmin ' ,
2013-03-02 03:51:11 +04:00
' python/psutil ' ,
' python/which ' ,
2014-11-26 21:11:28 +03:00
' python/pystache ' ,
' python/pyyaml/lib ' ,
2015-05-29 21:01:25 +03:00
' python/requests ' ,
2015-05-01 19:20:55 +03:00
' build ' ,
2013-03-08 21:42:34 +04:00
' build/pymake ' ,
' config ' ,
2013-11-15 02:34:50 +04:00
' dom/bindings ' ,
' dom/bindings/parser ' ,
2014-06-18 04:29:57 +04:00
' layout/tools/reftest ' ,
2013-03-02 03:51:11 +04:00
' other-licenses/ply ' ,
' xpcom/idl-parser ' ,
' testing ' ,
2015-05-29 01:57:21 +03:00
' testing/tools/autotry ' ,
2014-11-26 21:11:28 +03:00
' testing/taskcluster ' ,
2013-03-02 03:51:11 +04:00
' testing/xpcshell ' ,
2014-09-04 15:52:43 +04:00
' testing/web-platform ' ,
' testing/web-platform/harness ' ,
2015-02-11 00:55:33 +03:00
' testing/marionette/client ' ,
2015-05-27 20:00:09 +03:00
' testing/marionette/client/marionette/runner/mixins/browsermob-proxy-py ' ,
2014-04-16 21:27:25 +04:00
' testing/marionette/transport ' ,
2015-02-23 17:45:50 +03:00
' testing/marionette/driver ' ,
2015-04-09 18:46:00 +03:00
' testing/luciddream ' ,
2013-03-27 02:00:43 +04:00
' testing/mozbase/mozcrash ' ,
2014-07-02 15:51:00 +04:00
' testing/mozbase/mozdebug ' ,
2013-04-19 16:19:54 +04:00
' testing/mozbase/mozdevice ' ,
' testing/mozbase/mozfile ' ,
' testing/mozbase/mozhttpd ' ,
2015-07-03 08:04:22 +03:00
' testing/mozbase/mozleak ' ,
2013-03-27 02:00:43 +04:00
' testing/mozbase/mozlog ' ,
2013-04-19 16:19:54 +04:00
' testing/mozbase/moznetwork ' ,
2013-03-02 03:51:11 +04:00
' testing/mozbase/mozprocess ' ,
2013-04-19 16:19:54 +04:00
' testing/mozbase/mozprofile ' ,
' testing/mozbase/mozrunner ' ,
2013-08-20 21:42:25 +04:00
' testing/mozbase/mozsystemmonitor ' ,
2013-03-02 03:51:11 +04:00
' testing/mozbase/mozinfo ' ,
2013-10-10 23:37:45 +04:00
' testing/mozbase/moztest ' ,
2014-02-20 01:42:01 +04:00
' testing/mozbase/mozversion ' ,
2014-06-10 21:20:23 +04:00
' testing/mozbase/manifestparser ' ,
2013-07-30 03:57:28 +04:00
' xpcom/idl-parser ' ,
2013-03-02 03:51:11 +04:00
]
# Individual files providing mach commands.
MACH_MODULES = [
' addon-sdk/mach_commands.py ' ,
2013-12-19 05:36:08 +04:00
' build/valgrind/mach_commands.py ' ,
2013-11-15 02:34:50 +04:00
' dom/bindings/mach_commands.py ' ,
2013-03-02 03:51:11 +04:00
' layout/tools/reftest/mach_commands.py ' ,
2013-07-03 04:33:48 +04:00
' python/mach_commands.py ' ,
2013-03-04 22:18:48 +04:00
' python/mach/mach/commands/commandinfo.py ' ,
2015-03-18 20:47:36 +03:00
' python/compare-locales/mach_commands.py ' ,
2013-03-02 03:51:11 +04:00
' python/mozboot/mozboot/mach_commands.py ' ,
' python/mozbuild/mozbuild/mach_commands.py ' ,
2014-09-04 10:08:33 +04:00
' python/mozbuild/mozbuild/backend/mach_commands.py ' ,
2015-04-24 22:12:50 +03:00
' python/mozbuild/mozbuild/compilation/codecomplete.py ' ,
2013-03-02 03:51:11 +04:00
' python/mozbuild/mozbuild/frontend/mach_commands.py ' ,
2014-07-30 23:44:13 +04:00
' services/common/tests/mach_commands.py ' ,
2015-04-09 18:46:00 +03:00
' testing/luciddream/mach_commands.py ' ,
2013-09-09 23:37:38 +04:00
' testing/mach_commands.py ' ,
2014-11-26 21:11:28 +03:00
' testing/taskcluster/mach_commands.py ' ,
2013-04-19 16:19:54 +04:00
' testing/marionette/mach_commands.py ' ,
2013-03-02 03:51:11 +04:00
' testing/mochitest/mach_commands.py ' ,
' testing/xpcshell/mach_commands.py ' ,
2013-07-26 19:04:31 +04:00
' testing/talos/mach_commands.py ' ,
2014-09-04 15:52:43 +04:00
' testing/web-platform/mach_commands.py ' ,
2013-07-30 03:58:40 +04:00
' testing/xpcshell/mach_commands.py ' ,
2013-11-21 00:37:22 +04:00
' tools/docs/mach_commands.py ' ,
2013-07-30 03:58:40 +04:00
' tools/mercurial/mach_commands.py ' ,
2013-03-06 21:58:40 +04:00
' tools/mach_commands.py ' ,
2014-11-21 23:40:00 +03:00
' mobile/android/mach_commands.py ' ,
2013-03-02 03:51:11 +04:00
]
2013-05-09 04:56:30 +04:00
CATEGORIES = {
' build ' : {
' short ' : ' Build Commands ' ,
' long ' : ' Interact with the build system ' ,
' priority ' : 80 ,
} ,
' post-build ' : {
' short ' : ' Post-build Commands ' ,
' long ' : ' Common actions performed after completing a build. ' ,
' priority ' : 70 ,
} ,
' testing ' : {
' short ' : ' Testing ' ,
' long ' : ' Run tests. ' ,
' priority ' : 60 ,
} ,
2014-11-26 21:11:28 +03:00
' ci ' : {
' short ' : ' CI ' ,
' long ' : ' Taskcluster commands ' ,
' priority ' : 59
} ,
2013-05-09 04:56:30 +04:00
' devenv ' : {
' short ' : ' Development Environment ' ,
' long ' : ' Set up and configure your development environment. ' ,
' priority ' : 50 ,
} ,
' build-dev ' : {
' short ' : ' Low-level Build System Interaction ' ,
' long ' : ' Interact with specific parts of the build system. ' ,
' priority ' : 20 ,
} ,
' misc ' : {
' short ' : ' Potpourri ' ,
' long ' : ' Potent potables and assorted snacks. ' ,
' priority ' : 10 ,
2013-10-11 21:41:25 +04:00
} ,
' disabled ' : {
' short ' : ' Disabled ' ,
2014-08-11 20:31:24 +04:00
' long ' : ' The disabled commands are hidden by default. Use -v to display them. These commands are unavailable for your current context, run " mach <command> " to see why. ' ,
2013-10-11 21:41:25 +04:00
' priority ' : 0 ,
2013-05-09 04:56:30 +04:00
}
}
2015-07-14 23:44:59 +03:00
def get_state_dir ( ) :
""" Obtain the path to a directory to hold state.
Returns a tuple of the path and a bool indicating whether the value came
from an environment variable .
"""
state_user_dir = os . path . expanduser ( ' ~/.mozbuild ' )
state_env_dir = os . environ . get ( ' MOZBUILD_STATE_PATH ' , None )
if state_env_dir :
return state_env_dir , True
else :
return state_user_dir , False
2013-03-08 01:19:27 +04:00
def bootstrap ( topsrcdir , mozilla_dir = None ) :
if mozilla_dir is None :
mozilla_dir = topsrcdir
2013-03-02 03:51:11 +04:00
# Ensure we are running Python 2.7+. We put this check here so we generate a
# user-friendly error message rather than a cryptic stack trace on module
# import.
if sys . version_info [ 0 ] != 2 or sys . version_info [ 1 ] < 7 :
print ( ' Python 2.7 or above (but not Python 3) is required to run mach. ' )
print ( ' You are running Python ' , platform . python_version ( ) )
sys . exit ( 1 )
2013-05-21 05:07:48 +04:00
# Global build system and mach state is stored in a central directory. By
# default, this is ~/.mozbuild. However, it can be defined via an
# environment variable. We detect first run (by lack of this directory
# existing) and notify the user that it will be created. The logic for
# creation is much simpler for the "advanced" environment variable use
# case. For default behavior, we educate users and give them an opportunity
# to react. We always exit after creating the directory because users don't
# like surprises.
2013-03-02 03:51:11 +04:00
try :
import mach . main
except ImportError :
2013-03-08 01:19:27 +04:00
sys . path [ 0 : 0 ] = [ os . path . join ( mozilla_dir , path ) for path in SEARCH_PATHS ]
2013-03-02 03:51:11 +04:00
import mach . main
2014-07-03 02:15:31 +04:00
def populate_context ( context , key = None ) :
if key is None :
return
if key == ' state_dir ' :
2015-07-14 23:44:59 +03:00
state_dir , is_environ = get_state_dir ( )
if is_environ :
if not os . path . exists ( state_dir ) :
2014-07-03 02:15:31 +04:00
print ( ' Creating global state directory from environment variable: %s '
2015-07-14 23:44:59 +03:00
% state_dir )
os . makedirs ( state_dir , mode = 0o770 )
2014-07-03 02:15:31 +04:00
print ( ' Please re-run mach. ' )
sys . exit ( 1 )
else :
2015-07-14 23:44:59 +03:00
if not os . path . exists ( state_dir ) :
print ( STATE_DIR_FIRST_RUN . format ( userdir = state_dir ) )
2014-07-03 02:15:31 +04:00
try :
for i in range ( 20 , - 1 , - 1 ) :
time . sleep ( 1 )
sys . stdout . write ( ' %d ' % i )
sys . stdout . flush ( )
except KeyboardInterrupt :
sys . exit ( 1 )
2015-07-14 23:44:59 +03:00
print ( ' \n Creating default state directory: %s ' % state_dir )
os . mkdir ( state_dir )
2014-07-03 02:15:31 +04:00
print ( ' Please re-run mach. ' )
sys . exit ( 1 )
return state_dir
2015-07-14 23:44:59 +03:00
2014-07-03 02:15:31 +04:00
if key == ' topdir ' :
return topsrcdir
2015-07-14 23:44:59 +03:00
2014-07-03 02:15:31 +04:00
raise AttributeError ( key )
2013-07-16 06:56:15 +04:00
2013-10-11 23:44:15 +04:00
mach = mach . main . Mach ( os . getcwd ( ) )
2013-07-16 06:56:15 +04:00
mach . populate_context_handler = populate_context
2013-05-09 04:56:30 +04:00
for category , meta in CATEGORIES . items ( ) :
mach . define_category ( category , meta [ ' short ' ] , meta [ ' long ' ] ,
meta [ ' priority ' ] )
2013-03-02 03:51:11 +04:00
for path in MACH_MODULES :
2013-03-08 01:19:27 +04:00
mach . load_commands_from_file ( os . path . join ( mozilla_dir , path ) )
2013-05-09 04:56:30 +04:00
2013-03-02 03:51:11 +04:00
return mach