From 94d34fc58e103cfc19544b90dcb357549b1d7d2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=B2=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=92=D0=BB=D0=B0?= =?UTF-8?q?=D0=B4=D0=B8=D0=BC=D0=B8=D1=80=20=D0=92=D0=B0=D0=BB=D0=B5=D1=80?= =?UTF-8?q?=D1=8C=D0=B5=D0=B2=D0=B8=D1=87?= Date: Thu, 28 Jul 2016 19:47:38 +0700 Subject: [PATCH 1/5] Added environment setup script. --- env.py | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 env.py diff --git a/env.py b/env.py new file mode 100644 index 00000000..68257e5d --- /dev/null +++ b/env.py @@ -0,0 +1,98 @@ +from __future__ import print_function + +import argparse +import glob +import os +import sys +import textwrap +import subprocess + + +def ensure_dir(path): + if os.path.exists(path): + return + + os.mkdir(path) + return path + + +def traverse_toolsets(f): + msbuild_dir = r'C:\Program Files (x86)\MSBuild' + toolsets = glob.glob(r'{}\Microsoft.Cpp\v4.0\*\Platforms\*\PlatformToolsets\*'.format(msbuild_dir)) + for toolset in toolsets: + f(toolset) + + +def clcache_props_path(toolset): + return os.path.join(toolset, 'ImportAfter', 'Clcache.props') + + +def generate_props_content(clcache_dir): + return textwrap.dedent(''' + + + {clcache_dir};$(ExecutablePath) + + ''').format(clcache_dir=clcache_dir)[1:] + + +def set_system_variable(var, value): + with open(os.devnull, 'w') as devnull: + if value: + subprocess.check_call(['setx', '-m', var, value], stderr=devnull, stdout=devnull) + else: + reg_path = r'HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment' + try: + subprocess.check_call(['reg', 'query', reg_path, '/V', var], stderr=devnull, stdout=devnull) + except subprocess.CalledProcessError: + # Variable doesn't exists + pass + else: + subprocess.check_call(['reg', 'delete', reg_path, '/F', '/V', var], stderr=devnull, stdout=devnull) + + +def install(exe, cache_dir): + def f(toolset): + clcache_props = clcache_props_path(toolset) + ensure_dir(os.path.dirname(clcache_props)) + with open(clcache_props, 'w') as f: + f.write(generate_props_content(os.path.dirname(exe))) + + traverse_toolsets(f) + set_system_variable('CLCACHE_DIR', cache_dir) + set_system_variable('CL', '/MP4') + + +def uninstall(): + def f(toolset): + clcache_props = clcache_props_path(toolset) + if os.path.exists(clcache_props): + os.remove(clcache_props) + + traverse_toolsets(f) + set_system_variable('CLCACHE_DIR', None) + set_system_variable('CL', None) + + +def main(args=sys.argv[1:]): + clcache_default_exe = os.path.join( + os.path.dirname(os.path.abspath(__file__)), + 'dist', + 'cl.exe') + + parser = argparse.ArgumentParser() + subparsers = parser.add_subparsers(dest='action') + parser_install = subparsers.add_parser('install') + parser_install.add_argument('--exe', default=clcache_default_exe) + parser_install.add_argument('--cache-dir') + parser_uninstall = subparsers.add_parser('uninstall') + args = parser.parse_args(args) + + if args.action == 'install': + install(args.exe, args.cache_dir) + else: + uninstall() + + +if __name__ == '__main__': + sys.exit(main()) \ No newline at end of file From 208e20ff203d7c828957de1f3008ba08abc67226 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=B2=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=92=D0=BB=D0=B0?= =?UTF-8?q?=D0=B4=D0=B8=D0=BC=D0=B8=D1=80=20=D0=92=D0=B0=D0=BB=D0=B5=D1=80?= =?UTF-8?q?=D1=8C=D0=B5=D0=B2=D0=B8=D1=87?= Date: Thu, 28 Jul 2016 20:05:15 +0700 Subject: [PATCH 2/5] Refactoring --- env.py | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/env.py b/env.py index 68257e5d..9a1663a4 100644 --- a/env.py +++ b/env.py @@ -36,19 +36,25 @@ def generate_props_content(clcache_dir): ''').format(clcache_dir=clcache_dir)[1:] -def set_system_variable(var, value): +def check_call_quiet(*args, **kwargs): with open(os.devnull, 'w') as devnull: - if value: - subprocess.check_call(['setx', '-m', var, value], stderr=devnull, stdout=devnull) + kwargs['stderr'] = devnull + kwargs['stdout'] = devnull + subprocess.check_call(*args, **kwargs) + + +def set_system_variable(var, value): + if value: + check_call_quiet(['setx', '-m', var, value]) + else: + reg_path = r'HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment' + try: + check_call_quiet(['reg', 'query', reg_path, '/V', var]) + except subprocess.CalledProcessError: + # Variable doesn't exists + pass else: - reg_path = r'HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment' - try: - subprocess.check_call(['reg', 'query', reg_path, '/V', var], stderr=devnull, stdout=devnull) - except subprocess.CalledProcessError: - # Variable doesn't exists - pass - else: - subprocess.check_call(['reg', 'delete', reg_path, '/F', '/V', var], stderr=devnull, stdout=devnull) + check_call_quiet(['reg', 'delete', reg_path, '/F', '/V', var]) def install(exe, cache_dir): From d8de91c3ff54191c8eedf41f595b7c75e1761f3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=B2=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=92=D0=BB=D0=B0?= =?UTF-8?q?=D0=B4=D0=B8=D0=BC=D0=B8=D1=80=20=D0=92=D0=B0=D0=BB=D0=B5=D1=80?= =?UTF-8?q?=D1=8C=D0=B5=D0=B2=D0=B8=D1=87?= Date: Fri, 29 Jul 2016 10:53:41 +0700 Subject: [PATCH 3/5] Added some parameter checks --- env.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/env.py b/env.py index 9a1663a4..70c8740f 100644 --- a/env.py +++ b/env.py @@ -85,11 +85,18 @@ def main(args=sys.argv[1:]): os.path.dirname(os.path.abspath(__file__)), 'dist', 'cl.exe') - + + def cl_exe_type(exe): + if not os.path.isfile(exe): + raise argparse.ArgumentTypeError('{} is not file'.format(exe)) + if os.path.basename(exe) != 'cl.exe': + raise argparse.ArgumentTypeError('clcache executable must be named cl.exe') + return exe + parser = argparse.ArgumentParser() subparsers = parser.add_subparsers(dest='action') parser_install = subparsers.add_parser('install') - parser_install.add_argument('--exe', default=clcache_default_exe) + parser_install.add_argument('--exe', type=cl_exe_type, default=clcache_default_exe) parser_install.add_argument('--cache-dir') parser_uninstall = subparsers.add_parser('uninstall') args = parser.parse_args(args) From 9be2095d96693090959b428b9a5e0d8d0dc95907 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=B2=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=92=D0=BB=D0=B0?= =?UTF-8?q?=D0=B4=D0=B8=D0=BC=D0=B8=D1=80=20=D0=92=D0=B0=D0=BB=D0=B5=D1=80?= =?UTF-8?q?=D1=8C=D0=B5=D0=B2=D0=B8=D1=87?= Date: Fri, 29 Jul 2016 11:35:20 +0700 Subject: [PATCH 4/5] Absolutify paths --- env.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/env.py b/env.py index 70c8740f..fd2579a8 100644 --- a/env.py +++ b/env.py @@ -102,7 +102,7 @@ def cl_exe_type(exe): args = parser.parse_args(args) if args.action == 'install': - install(args.exe, args.cache_dir) + install(os.path.abspath(args.exe), os.path.abspath(args.cache_dir)) else: uninstall() From bfe6af83ca7242ea573195e33ec5f8db2189d926 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=B2=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=92=D0=BB=D0=B0?= =?UTF-8?q?=D0=B4=D0=B8=D0=BC=D0=B8=D1=80=20=D0=92=D0=B0=D0=BB=D0=B5=D1=80?= =?UTF-8?q?=D1=8C=D0=B5=D0=B2=D0=B8=D1=87?= Date: Fri, 29 Jul 2016 18:40:05 +0700 Subject: [PATCH 5/5] Review fixes --- env.py | 34 ++++++++++++++-------------------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/env.py b/env.py index fd2579a8..607568f8 100644 --- a/env.py +++ b/env.py @@ -1,5 +1,3 @@ -from __future__ import print_function - import argparse import glob import os @@ -27,13 +25,16 @@ def clcache_props_path(toolset): return os.path.join(toolset, 'ImportAfter', 'Clcache.props') -def generate_props_content(clcache_dir): +def generate_props_content(exe): return textwrap.dedent(''' - {clcache_dir};$(ExecutablePath) + {exe} + {dir} - ''').format(clcache_dir=clcache_dir)[1:] + ''').format( + exe=os.path.basename(exe), + dir=os.path.dirname(exe))[1:] def check_call_quiet(*args, **kwargs): @@ -45,9 +46,9 @@ def check_call_quiet(*args, **kwargs): def set_system_variable(var, value): if value: - check_call_quiet(['setx', '-m', var, value]) + check_call_quiet(['setx', var, value]) else: - reg_path = r'HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment' + reg_path = r'HKEY_CURRENT_USER\Environment' try: check_call_quiet(['reg', 'query', reg_path, '/V', var]) except subprocess.CalledProcessError: @@ -62,11 +63,10 @@ def f(toolset): clcache_props = clcache_props_path(toolset) ensure_dir(os.path.dirname(clcache_props)) with open(clcache_props, 'w') as f: - f.write(generate_props_content(os.path.dirname(exe))) + f.write(generate_props_content(exe)) traverse_toolsets(f) set_system_variable('CLCACHE_DIR', cache_dir) - set_system_variable('CL', '/MP4') def uninstall(): @@ -77,32 +77,26 @@ def f(toolset): traverse_toolsets(f) set_system_variable('CLCACHE_DIR', None) - set_system_variable('CL', None) def main(args=sys.argv[1:]): clcache_default_exe = os.path.join( os.path.dirname(os.path.abspath(__file__)), 'dist', - 'cl.exe') - - def cl_exe_type(exe): - if not os.path.isfile(exe): - raise argparse.ArgumentTypeError('{} is not file'.format(exe)) - if os.path.basename(exe) != 'cl.exe': - raise argparse.ArgumentTypeError('clcache executable must be named cl.exe') - return exe + 'clcache.exe') parser = argparse.ArgumentParser() subparsers = parser.add_subparsers(dest='action') parser_install = subparsers.add_parser('install') - parser_install.add_argument('--exe', type=cl_exe_type, default=clcache_default_exe) + parser_install.add_argument('--exe', type=argparse.FileType('r'), default=clcache_default_exe) parser_install.add_argument('--cache-dir') parser_uninstall = subparsers.add_parser('uninstall') args = parser.parse_args(args) if args.action == 'install': - install(os.path.abspath(args.exe), os.path.abspath(args.cache_dir)) + exe = os.path.abspath(args.exe.name) + cache_dir = os.path.abspath(args.cache_dir) if args.cache_dir else None + install(exe, cache_dir) else: uninstall()