2013-03-01 23:51:11 +00: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 01:07:48 +00: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-01 23:51:11 +00:00
# TODO Bug 794506 Integrate with the in-tree virtualenv configuration.
SEARCH_PATHS = [
' python/mach ' ,
' python/mozboot ' ,
' python/mozbuild ' ,
2013-07-29 23:58:40 +00:00
' python/mozversioncontrol ' ,
2013-03-01 23:51:11 +00:00
' python/blessings ' ,
2015-03-18 17:47:36 +00:00
' python/compare-locales ' ,
2013-07-18 19:55:41 +00:00
' python/configobj ' ,
2013-09-12 02:54:19 +00:00
' python/jsmin ' ,
2013-03-01 23:51:11 +00:00
' python/psutil ' ,
' python/which ' ,
2014-11-26 18:11:28 +00:00
' python/pystache ' ,
' python/pyyaml/lib ' ,
2013-03-08 17:42:34 +00:00
' build/pymake ' ,
' config ' ,
2013-11-14 22:34:50 +00:00
' dom/bindings ' ,
' dom/bindings/parser ' ,
2014-06-18 00:29:57 +00:00
' layout/tools/reftest ' ,
2013-03-01 23:51:11 +00:00
' other-licenses/ply ' ,
' xpcom/idl-parser ' ,
' testing ' ,
2014-11-26 18:11:28 +00:00
' testing/taskcluster ' ,
2013-03-01 23:51:11 +00:00
' testing/xpcshell ' ,
2014-09-04 11:52:43 +00:00
' testing/web-platform ' ,
' testing/web-platform/harness ' ,
2015-02-10 21:55:33 +00:00
' testing/marionette/client ' ,
2014-04-16 17:27:25 +00:00
' testing/marionette/transport ' ,
2015-02-23 14:45:50 +00:00
' testing/marionette/driver ' ,
2013-03-26 22:00:43 +00:00
' testing/mozbase/mozcrash ' ,
2014-07-02 11:51:00 +00:00
' testing/mozbase/mozdebug ' ,
2013-04-19 12:19:54 +00:00
' testing/mozbase/mozdevice ' ,
' testing/mozbase/mozfile ' ,
' testing/mozbase/mozhttpd ' ,
2013-03-26 22:00:43 +00:00
' testing/mozbase/mozlog ' ,
2013-04-19 12:19:54 +00:00
' testing/mozbase/moznetwork ' ,
2013-03-01 23:51:11 +00:00
' testing/mozbase/mozprocess ' ,
2013-04-19 12:19:54 +00:00
' testing/mozbase/mozprofile ' ,
' testing/mozbase/mozrunner ' ,
2013-08-20 17:42:25 +00:00
' testing/mozbase/mozsystemmonitor ' ,
2013-03-01 23:51:11 +00:00
' testing/mozbase/mozinfo ' ,
2013-10-10 19:37:45 +00:00
' testing/mozbase/moztest ' ,
2014-02-19 21:42:01 +00:00
' testing/mozbase/mozversion ' ,
2014-06-10 17:20:23 +00:00
' testing/mozbase/manifestparser ' ,
2013-07-29 23:57:28 +00:00
' xpcom/idl-parser ' ,
2013-03-01 23:51:11 +00:00
]
# Individual files providing mach commands.
MACH_MODULES = [
' addon-sdk/mach_commands.py ' ,
2013-12-19 01:36:08 +00:00
' build/valgrind/mach_commands.py ' ,
2013-11-14 22:34:50 +00:00
' dom/bindings/mach_commands.py ' ,
2013-03-01 23:51:11 +00:00
' layout/tools/reftest/mach_commands.py ' ,
2013-07-03 00:33:48 +00:00
' python/mach_commands.py ' ,
2013-03-04 18:18:48 +00:00
' python/mach/mach/commands/commandinfo.py ' ,
2015-03-18 17:47:36 +00:00
' python/compare-locales/mach_commands.py ' ,
2013-03-01 23:51:11 +00:00
' python/mozboot/mozboot/mach_commands.py ' ,
' python/mozbuild/mozbuild/mach_commands.py ' ,
2014-09-04 06:08:33 +00:00
' python/mozbuild/mozbuild/backend/mach_commands.py ' ,
2013-03-01 23:51:11 +00:00
' python/mozbuild/mozbuild/frontend/mach_commands.py ' ,
2014-07-30 19:44:13 +00:00
' services/common/tests/mach_commands.py ' ,
2013-09-09 19:37:38 +00:00
' testing/mach_commands.py ' ,
2014-11-26 18:11:28 +00:00
' testing/taskcluster/mach_commands.py ' ,
2013-04-19 12:19:54 +00:00
' testing/marionette/mach_commands.py ' ,
2013-03-01 23:51:11 +00:00
' testing/mochitest/mach_commands.py ' ,
' testing/xpcshell/mach_commands.py ' ,
2013-07-26 15:04:31 +00:00
' testing/talos/mach_commands.py ' ,
2014-09-04 11:52:43 +00:00
' testing/web-platform/mach_commands.py ' ,
2013-07-29 23:58:40 +00:00
' testing/xpcshell/mach_commands.py ' ,
2013-11-20 20:37:22 +00:00
' tools/docs/mach_commands.py ' ,
2013-07-29 23:58:40 +00:00
' tools/mercurial/mach_commands.py ' ,
2013-03-06 17:58:40 +00:00
' tools/mach_commands.py ' ,
2014-11-21 20:40:00 +00:00
' mobile/android/mach_commands.py ' ,
2013-03-01 23:51:11 +00:00
]
2013-05-09 00:56:30 +00: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 18:11:28 +00:00
' ci ' : {
' short ' : ' CI ' ,
' long ' : ' Taskcluster commands ' ,
' priority ' : 59
} ,
2013-05-09 00:56:30 +00: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 17:41:25 +00:00
} ,
' disabled ' : {
' short ' : ' Disabled ' ,
2014-08-11 16:31:24 +00: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 17:41:25 +00:00
' priority ' : 0 ,
2013-05-09 00:56:30 +00:00
}
}
2013-03-07 21:19:27 +00:00
def bootstrap ( topsrcdir , mozilla_dir = None ) :
if mozilla_dir is None :
mozilla_dir = topsrcdir
2013-03-01 23:51:11 +00: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 01:07:48 +00: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-01 23:51:11 +00:00
try :
import mach . main
except ImportError :
2013-03-07 21:19:27 +00:00
sys . path [ 0 : 0 ] = [ os . path . join ( mozilla_dir , path ) for path in SEARCH_PATHS ]
2013-03-01 23:51:11 +00:00
import mach . main
2014-07-02 22:15:31 +00:00
def populate_context ( context , key = None ) :
if key is None :
return
if key == ' state_dir ' :
state_user_dir = os . path . expanduser ( ' ~/.mozbuild ' )
state_env_dir = os . environ . get ( ' MOZBUILD_STATE_PATH ' , None )
if state_env_dir :
if not os . path . exists ( state_env_dir ) :
print ( ' Creating global state directory from environment variable: %s '
% state_env_dir )
os . makedirs ( state_env_dir , mode = 0o770 )
print ( ' Please re-run mach. ' )
sys . exit ( 1 )
state_dir = state_env_dir
else :
if not os . path . exists ( state_user_dir ) :
print ( STATE_DIR_FIRST_RUN . format ( userdir = state_user_dir ) )
try :
for i in range ( 20 , - 1 , - 1 ) :
time . sleep ( 1 )
sys . stdout . write ( ' %d ' % i )
sys . stdout . flush ( )
except KeyboardInterrupt :
sys . exit ( 1 )
print ( ' \n Creating default state directory: %s ' % state_user_dir )
os . mkdir ( state_user_dir )
print ( ' Please re-run mach. ' )
sys . exit ( 1 )
state_dir = state_user_dir
return state_dir
if key == ' topdir ' :
return topsrcdir
raise AttributeError ( key )
2013-07-16 02:56:15 +00:00
2013-10-11 19:44:15 +00:00
mach = mach . main . Mach ( os . getcwd ( ) )
2013-07-16 02:56:15 +00:00
mach . populate_context_handler = populate_context
2013-05-09 00:56:30 +00:00
for category , meta in CATEGORIES . items ( ) :
mach . define_category ( category , meta [ ' short ' ] , meta [ ' long ' ] ,
meta [ ' priority ' ] )
2013-03-01 23:51:11 +00:00
for path in MACH_MODULES :
2013-03-07 21:19:27 +00:00
mach . load_commands_from_file ( os . path . join ( mozilla_dir , path ) )
2013-05-09 00:56:30 +00:00
2013-03-01 23:51:11 +00:00
return mach