2013-03-01 15:51:11 -08: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-20 18:07:48 -07: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 15:51:11 -08:00
# TODO Bug 794506 Integrate with the in-tree virtualenv configuration.
SEARCH_PATHS = [
' python/mach ' ,
' python/mozboot ' ,
' python/mozbuild ' ,
2013-07-29 16:58:40 -07:00
' python/mozversioncontrol ' ,
2013-03-01 15:51:11 -08:00
' python/blessings ' ,
2013-07-18 12:55:41 -07:00
' python/configobj ' ,
2013-09-11 19:54:19 -07:00
' python/jsmin ' ,
2013-03-01 15:51:11 -08:00
' python/psutil ' ,
' python/which ' ,
2014-11-26 10:11:28 -08:00
' python/pystache ' ,
' python/pyyaml/lib ' ,
2013-03-08 09:42:34 -08:00
' build/pymake ' ,
' config ' ,
2013-11-14 14:34:50 -08:00
' dom/bindings ' ,
' dom/bindings/parser ' ,
2014-06-17 17:29:57 -07:00
' layout/tools/reftest ' ,
2013-03-01 15:51:11 -08:00
' other-licenses/ply ' ,
' xpcom/idl-parser ' ,
' testing ' ,
2014-11-26 10:11:28 -08:00
' testing/taskcluster ' ,
2013-03-01 15:51:11 -08:00
' testing/xpcshell ' ,
2014-09-04 04:52:43 -07:00
' testing/web-platform ' ,
' testing/web-platform/harness ' ,
2013-04-19 05:19:54 -07:00
' testing/marionette/client/marionette ' ,
2014-04-16 10:27:25 -07:00
' testing/marionette/transport ' ,
2013-03-26 15:00:43 -07:00
' testing/mozbase/mozcrash ' ,
2014-07-02 04:51:00 -07:00
' testing/mozbase/mozdebug ' ,
2013-04-19 05:19:54 -07:00
' testing/mozbase/mozdevice ' ,
' testing/mozbase/mozfile ' ,
' testing/mozbase/mozhttpd ' ,
2013-03-26 15:00:43 -07:00
' testing/mozbase/mozlog ' ,
2013-04-19 05:19:54 -07:00
' testing/mozbase/moznetwork ' ,
2013-03-01 15:51:11 -08:00
' testing/mozbase/mozprocess ' ,
2013-04-19 05:19:54 -07:00
' testing/mozbase/mozprofile ' ,
' testing/mozbase/mozrunner ' ,
2013-08-20 10:42:25 -07:00
' testing/mozbase/mozsystemmonitor ' ,
2013-03-01 15:51:11 -08:00
' testing/mozbase/mozinfo ' ,
2013-10-10 12:37:45 -07:00
' testing/mozbase/moztest ' ,
2014-02-19 13:42:01 -08:00
' testing/mozbase/mozversion ' ,
2014-06-10 10:20:23 -07:00
' testing/mozbase/manifestparser ' ,
2013-07-29 16:57:28 -07:00
' xpcom/idl-parser ' ,
2013-03-01 15:51:11 -08:00
]
# Individual files providing mach commands.
MACH_MODULES = [
' addon-sdk/mach_commands.py ' ,
2013-12-18 17:36:08 -08:00
' build/valgrind/mach_commands.py ' ,
2013-11-14 14:34:50 -08:00
' dom/bindings/mach_commands.py ' ,
2013-03-01 15:51:11 -08:00
' layout/tools/reftest/mach_commands.py ' ,
2013-07-02 17:33:48 -07:00
' python/mach_commands.py ' ,
2013-03-04 10:18:48 -08:00
' python/mach/mach/commands/commandinfo.py ' ,
2013-03-01 15:51:11 -08:00
' python/mozboot/mozboot/mach_commands.py ' ,
' python/mozbuild/mozbuild/mach_commands.py ' ,
2014-09-03 23:08:33 -07:00
' python/mozbuild/mozbuild/backend/mach_commands.py ' ,
2013-03-01 15:51:11 -08:00
' python/mozbuild/mozbuild/frontend/mach_commands.py ' ,
2014-07-30 12:44:13 -07:00
' services/common/tests/mach_commands.py ' ,
2013-09-09 12:37:38 -07:00
' testing/mach_commands.py ' ,
2014-11-26 10:11:28 -08:00
' testing/taskcluster/mach_commands.py ' ,
2013-04-19 05:19:54 -07:00
' testing/marionette/mach_commands.py ' ,
2013-03-01 15:51:11 -08:00
' testing/mochitest/mach_commands.py ' ,
' testing/xpcshell/mach_commands.py ' ,
2013-07-26 08:04:31 -07:00
' testing/talos/mach_commands.py ' ,
2014-09-04 04:52:43 -07:00
' testing/web-platform/mach_commands.py ' ,
2013-07-29 16:58:40 -07:00
' testing/xpcshell/mach_commands.py ' ,
2013-11-20 12:37:22 -08:00
' tools/docs/mach_commands.py ' ,
2013-07-29 16:58:40 -07:00
' tools/mercurial/mach_commands.py ' ,
2013-03-06 09:58:40 -08:00
' tools/mach_commands.py ' ,
2014-11-21 12:40:00 -08:00
' mobile/android/mach_commands.py ' ,
2013-03-01 15:51:11 -08:00
]
2013-05-08 17:56:30 -07: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 10:11:28 -08:00
' ci ' : {
' short ' : ' CI ' ,
' long ' : ' Taskcluster commands ' ,
' priority ' : 59
} ,
2013-05-08 17:56:30 -07: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 10:41:25 -07:00
} ,
' disabled ' : {
' short ' : ' Disabled ' ,
2014-08-11 09:31:24 -07: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 10:41:25 -07:00
' priority ' : 0 ,
2013-05-08 17:56:30 -07:00
}
}
2013-03-07 13:19:27 -08:00
def bootstrap ( topsrcdir , mozilla_dir = None ) :
if mozilla_dir is None :
mozilla_dir = topsrcdir
2013-03-01 15:51:11 -08: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-20 18:07:48 -07: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 15:51:11 -08:00
try :
import mach . main
except ImportError :
2013-03-07 13:19:27 -08:00
sys . path [ 0 : 0 ] = [ os . path . join ( mozilla_dir , path ) for path in SEARCH_PATHS ]
2013-03-01 15:51:11 -08:00
import mach . main
2014-07-02 15:15:31 -07: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-15 19:56:15 -07:00
2013-10-11 12:44:15 -07:00
mach = mach . main . Mach ( os . getcwd ( ) )
2013-07-15 19:56:15 -07:00
mach . populate_context_handler = populate_context
2013-05-08 17:56:30 -07:00
for category , meta in CATEGORIES . items ( ) :
mach . define_category ( category , meta [ ' short ' ] , meta [ ' long ' ] ,
meta [ ' priority ' ] )
2013-03-01 15:51:11 -08:00
for path in MACH_MODULES :
2013-03-07 13:19:27 -08:00
mach . load_commands_from_file ( os . path . join ( mozilla_dir , path ) )
2013-05-08 17:56:30 -07:00
2013-03-01 15:51:11 -08:00
return mach