annotate scripts/ycm_extra_conf.py @ 10:f444739dd8af

Improvements to YCM dynamic flags. - Fallback to a "companion" item (e.g. header/source) or a nearby item when no flags are found for an item. - Finding a "companion" is also exposed as a standalone script. - Ability to pass extra clang flags, including some from a special file found in the .vimcrosoft directory. - Add support for PCH and other forced-include files. - Add options for short/long args, or forcing forward slashes. - Debugging/troubleshooting options, including dumping a batch file and response file to run clang directly, and the ability to auto-load a solution's last known environment when running in command line.
author Ludovic Chabant <ludovic@chabant.com>
date Thu, 24 Sep 2020 23:02:16 -0700
parents 5d2c0db51914
children 096e80c13781
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1 import argparse
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2 import logging
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
3 import os.path
10
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
4 import shutil
0
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
5 import sys
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
6
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
7
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
8 if True: # 'vim' in sys.modules:
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
9 sys.path.append(os.path.dirname(__file__))
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
10
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
11
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
12 from logutil import setup_logging
10
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
13 from vshelpers import load_vimcrosoft_auto_env, find_vimcrosoft_slncache, find_item_project
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
14 from vsutil import SolutionCache, ITEM_TYPE_CPP_SRC, ITEM_TYPE_CPP_HDR
0
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
15
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
16
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
17 logger = logging.getLogger(__name__)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
18
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
19
10
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
20 def _split_paths_property(val):
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
21 if val:
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
22 return val.strip(';').split(';')
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
23 return []
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
24
0
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
25
10
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
26 def _split_paths_property_and_make_absolute(basedir, val):
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
27 return [os.path.abspath(os.path.join(basedir, p))
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
28 for p in _split_paths_property(val)]
0
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
29
10
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
30
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
31 def _get_item_specific_flags(projdir, clcompileitems, filename):
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
32 logger.debug("Looking through %d items to find: %s" % (len(clcompileitems), filename))
0
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
33 filename_lower = filename.lower()
10
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
34 for item in clcompileitems:
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
35 absiteminclude = os.path.normpath(os.path.join(projdir, item.include))
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
36 if absiteminclude.lower() != filename_lower:
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
37 continue
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
38 logger.debug("Found file-specific flags for: %s" % filename)
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
39 incpaths = _split_paths_property_and_make_absolute(
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
40 projdir, item.metadata.get('AdditionalIncludeDirectories'))
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
41 incfiles = _split_paths_property_and_make_absolute(
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
42 projdir, item.metadata.get('ForcedIncludeFiles'))
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
43 return (incpaths, incfiles)
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
44 return ([], [])
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
45
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
46
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
47 def _find_any_possible_item_specific_flags(
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
48 solution, slncache, projdir, clcompileitems, filename, incpaths, incfiles, *,
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
49 search_neighbours=True):
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
50 # First, find any actual flags for this item.
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
51 item_incpaths, item_incfiles = _get_item_specific_flags(projdir, clcompileitems, filename)
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
52 if item_incpaths or item_incfiles:
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
53 incpaths += item_incpaths
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
54 incfiles += item_incfiles
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
55 return True
0
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
56
10
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
57 logger.debug("Requested item didn't have any flags, looking for companion item")
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
58 from find_companion import _find_companion_item
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
59 companion_item = _find_companion_item(solution, filename, slncache=slncache)
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
60 if companion_item:
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
61 logger.debug("Found companion item: %s" % companion_item)
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
62 item_incpaths, item_incfiles = _get_item_specific_flags(projdir, clcompileitems, companion_item)
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
63 incpaths += item_incpaths
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
64 incfiles += item_incfiles
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
65 return True
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
66
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
67 #logger.debug("No companion item found, see if we can find flags for a neighbour")
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
68 #os.path.dirname(filename)
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
69 return False
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
70
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
71
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
72 def _expand_extra_flags_with_solution_extra_flags(solution, extraflags):
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
73 argfilename = os.path.join(
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
74 os.path.dirname(solution),
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
75 '.vimcrosoft',
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
76 (os.path.basename(solution) + '.flags'))
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
77 try:
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
78 with open(argfilename, 'r', encoding='utf8') as fp:
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
79 lines = fp.readlines()
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
80 logger.debug("Read extra flags from: %s (%d lines)" % (argfilename, len(lines)))
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
81 except OSError:
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
82 return extraflags
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
83
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
84 extraflags = extraflags or []
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
85 for line in lines:
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
86 if not line.startswith('#'):
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
87 extraflags.append(line.strip())
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
88 return extraflags
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
89
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
90
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
91 def _build_cflags(filename, solution, buildenv=None, slncache=None, extraflags=None,
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
92 force_fwd_slashes=True, short_flags=True):
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
93 # Find the current file in the solution.
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
94 cache, proj = find_item_project(filename, solution, slncache)
0
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
95 logger.debug("Found project %s: %s" % (proj.name, proj.abspath))
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
96
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
97 # Get the provided config/platform combo, which represent a solution
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
98 # configuration, and find the corresponding project configuration.
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
99 # For instance, a solution configuration of "Debug|Win64" could map
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
100 # to a "MyDebug|AnyCPU" configuration on a specific project.
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
101 sln_config_platform = '%s|%s' % (buildenv['Configuration'],
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
102 buildenv['Platform'])
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
103 proj_config_platform = cache.slnobj.find_project_configuration(
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
104 proj.guid, sln_config_platform)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
105 if not proj_config_platform:
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
106 raise Exception("Can't find project configuration and platform for "
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
107 "solution configuration and platform: %s" %
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
108 sln_config_platform)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
109
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
110 # Make a build environment for the project, and figure out what
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
111 # kind of project it is.
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
112 proj_config, proj_platform = proj_config_platform.split('|')
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
113
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
114 proj_buildenv = buildenv.copy()
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
115 proj_buildenv['Configuration'] = proj_config
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
116 proj_buildenv['Platform'] = proj_platform
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
117
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
118 cfggroup = proj.propertygroup('Configuration', proj_buildenv)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
119 cfgtype = cfggroup.get('ConfigurationType')
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
120 if not cfgtype:
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
121 raise Exception("Can't find configuration type. Did you specify a "
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
122 "configuration name and platform? Got: %s" %
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
123 proj_buildenv)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
124 logger.debug("Found configuration type: %s" % cfgtype)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
125
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
126 # Let's prepare a list of standard stuff for C++.
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
127 preproc = []
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
128 incpaths = []
10
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
129 incfiles = []
0
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
130 projdir = os.path.dirname(proj.abspath)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
131
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
132 if cfgtype == 'Makefile':
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
133 # It's a 'Makefile' project, which means we know as little about
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
134 # compiler flags as whatever information was given to VS. As
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
135 # such, if the solution setup doesn't give enough info, VS
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
136 # intellisense won't work, and neither will YouCompleteMe.
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
137 defaultpropgroup = proj.defaultpropertygroup(proj_buildenv)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
138
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
139 nmake_preproc = defaultpropgroup.get('NMakePreprocessorDefinitions')
10
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
140 preproc += _split_paths_property(nmake_preproc)
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
141
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
142 vs_incpaths = defaultpropgroup.get('IncludePath')
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
143 if vs_incpaths:
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
144 incpaths += _split_paths_property_and_make_absolute(
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
145 projdir, vs_incpaths)
0
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
146
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
147 nmake_incpaths = defaultpropgroup.get('NMakeIncludeSearchPath')
10
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
148 if nmake_incpaths:
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
149 incpaths += _split_paths_property_and_make_absolute(
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
150 projdir, nmake_incpaths)
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
151
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
152 nmake_forcedincs = defaultpropgroup.get('NMakeForcedIncludes')
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
153 if nmake_forcedincs:
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
154 incfiles += _split_paths_property_and_make_absolute(
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
155 projdir, nmake_forcedincs)
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
156
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
157 # Find stuff specific to the file we are working on.
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
158 defaultitemgroup = proj.defaultitemgroup(proj_buildenv)
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
159 clcompileitems = list(defaultitemgroup.get_items_of_types([ITEM_TYPE_CPP_SRC, ITEM_TYPE_CPP_HDR]))
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
160 _find_any_possible_item_specific_flags(
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
161 solution, slncache, projdir, clcompileitems, filename, incpaths, incfiles)
0
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
162
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
163 else:
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
164 # We should definitely support standard VC++ projects here but
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
165 # I don't need it yet :)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
166 raise Exception("Don't know how to handle configuration type: %s" %
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
167 cfgtype)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
168
10
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
169 # We need to duplicate all the forced-included files because they could
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
170 # have a VS-generated PCH file next to them. Clang then tries to pick it
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
171 # up and complains that it doesn't use a valid format... :(
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
172 incfiles = _cache_pch_files(incfiles)
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
173
0
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
174 # Build the clang/YCM flags with what we found.
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
175 flags = ['-x', 'c++'] # TODO: check language type from project file.
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
176
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
177 for symbol in preproc:
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
178 flags.append('-D%s' % symbol)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
179 for path in incpaths:
10
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
180 flagname = '-I'
0
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
181 if path.startswith("C:\\Program Files"):
10
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
182 flagname = '-isystem'
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
183 flagval = path.replace('\\', '/') if force_fwd_slashes else path
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
184 if short_flags:
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
185 flags.append('%s%s' % (flagname, flagval))
0
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
186 else:
10
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
187 flags.append(flagname)
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
188 flags.append(flagval)
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
189 # For some reason it seems VS applies those in last-to-first order.
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
190 incfiles = list(reversed(incfiles))
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
191 for path in incfiles:
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
192 if force_fwd_slashes:
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
193 flags.append('--include=%s' % path.replace('\\', '/'))
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
194 else:
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
195 flags.append('--include=%s' % path)
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
196
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
197 if extraflags:
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
198 flags += extraflags
0
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
199
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
200 return {'flags': flags}
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
201
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
202
10
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
203 _clang_shadow_pch_suffix = '-for-clang'
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
204
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
205
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
206 def _cache_pch_files(paths):
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
207 outpaths = []
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
208 for path in paths:
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
209 name, ext = os.path.splitext(path)
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
210 outpath = "%s%s%s" % (name, _clang_shadow_pch_suffix, ext)
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
211
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
212 do_cache = False
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
213 orig_mtime = os.path.getmtime(path)
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
214 try:
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
215 out_mtime = os.path.getmtime(outpath)
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
216 if orig_mtime >= out_mtime:
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
217 do_cache = True
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
218 except OSError:
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
219 do_cache = True
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
220
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
221 if do_cache:
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
222 logger.debug("Creating shadow PCH file: %s" % path)
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
223 shutil.copy2(path, outpath)
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
224
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
225 outpaths.append(outpath)
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
226 return outpaths
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
227
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
228
0
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
229 def _build_env_from_vim(client_data):
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
230 buildenv = {}
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
231 buildenv['Configuration'] = client_data.get('g:vimcrosoft_current_config', '')
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
232 buildenv['Platform'] = client_data.get('g:vimcrosoft_current_platform', '')
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
233 return buildenv
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
234
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
235
10
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
236 _dump_debug_file = True
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
237
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
238
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
239 def _do_dump_debug_file(args, flags, debug_filename):
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
240 import pprint
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
241
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
242 with open(debug_filename, 'w') as fp:
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
243 fp.write(" args: \n")
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
244 fp.write("=========\n")
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
245 pp = pprint.PrettyPrinter(indent=2, stream=fp)
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
246 pp.pprint(args)
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
247 fp.write("\n\n")
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
248
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
249 fp.write(" flags: \n")
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
250 fp.write("==========\n")
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
251 flags = flags.get('flags')
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
252 if flags:
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
253 fp.write(flags[0])
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
254 for flag in flags[1:]:
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
255 if flag[0] == '-':
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
256 fp.write("\n")
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
257 else:
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
258 fp.write(" ")
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
259 fp.write(flag)
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
260 else:
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
261 fp.write("<no flags found>\n")
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
262 fp.write("\n\n")
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
263
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
264
0
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
265 def Settings(**kwargs):
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
266 language = kwargs.get('language')
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
267 filename = kwargs.get('filename')
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
268
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
269 client_data = kwargs.get('client_data', {})
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
270 from_cli = kwargs.get('from_cli', False)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
271 if from_cli:
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
272 solution = client_data.get('solution')
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
273 slncache = client_data.get('slncache')
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
274 buildenv = client_data.get('env', {})
10
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
275 extraflags = client_data.get('extra_flags')
0
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
276 else:
10
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
277 if not client_data:
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
278 raise Exception("No client data provided by Vim host!")
0
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
279 solution = client_data.get('g:vimcrosoft_current_sln')
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
280 slncache = client_data.get('g:vimcrosoft_current_sln_cache')
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
281 buildenv = _build_env_from_vim(client_data)
10
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
282 extraflags = client_data.get('g:vimcrosoft_extra_clang_args')
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
283
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
284 extraflags = _expand_extra_flags_with_solution_extra_flags(solution, extraflags)
0
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
285
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
286 flags = None
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
287
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
288 if language == 'cfamily':
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
289 try:
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
290 flags = _build_cflags(filename, solution,
10
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
291 buildenv=buildenv, slncache=slncache,
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
292 extraflags=extraflags)
0
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
293 except Exception as exc:
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
294 if from_cli:
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
295 raise
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
296 flags = {'error': str(exc)}
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
297 else:
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
298 flags = {'error': f"Unknown language: {language}"}
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
299
10
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
300 if _dump_debug_file:
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
301 debug_filename = os.path.join(
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
302 os.path.dirname(solution), '.vimcrosoft', 'debug_flags.txt')
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
303 _do_dump_debug_file(kwargs, flags, debug_filename)
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
304
0
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
305 return flags
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
306
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
307
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
308 languages = {
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
309 'cfamily': ['h', 'c', 'hpp', 'cpp', 'inl']
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
310 }
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
311
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
312
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
313 def _get_language(filename):
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
314 _, ext = os.path.splitext(filename)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
315 ext = ext.lstrip('.')
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
316 for lang, exts in languages.items():
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
317 if ext in exts:
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
318 return lang
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
319 return None
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
320
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
321
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
322 def main():
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
323 parser = argparse.ArgumentParser()
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
324 parser.add_argument('solution',
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
325 help="The solution file")
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
326 parser.add_argument('filename',
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
327 help="The filename for which to get flags")
10
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
328 parser.add_argument('--no-auto-env',
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
329 action='store_true',
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
330 help="Don't read configuration information from Vimcrosoft cache")
0
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
331 parser.add_argument('-p', '--property',
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
332 action="append",
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
333 help="Specifies a build property")
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
334 parser.add_argument('-c', '--cache',
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
335 help="The solution cache to use")
10
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
336 parser.add_argument('--cmdline',
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
337 action='store_true',
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
338 help="Output flags in a command-line form")
0
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
339 parser.add_argument('-v', '--verbose',
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
340 action='store_true',
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
341 help="Show debugging information")
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
342 args = parser.parse_args()
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
343 setup_logging(args.verbose)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
344
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
345 lang = _get_language(args.filename)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
346 logger.debug(f"Got language {lang} for {args.filename}")
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
347
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
348 build_env = {}
10
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
349 slncache = args.cache
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
350 if not args.no_auto_env:
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
351 load_vimcrosoft_auto_env(args.solution, build_env)
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
352 if not slncache:
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
353 slncache = find_vimcrosoft_slncache(args.solution)
0
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
354 if args.property:
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
355 for p in args.property:
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
356 pname, pval = p.split('=', 1)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
357 build_env[pname] = pval
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
358 logger.debug(f"Got build environment: {build_env}")
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
359 client_data = {'solution': args.solution,
10
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
360 'slncache': slncache,
0
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
361 'env': build_env}
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
362
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
363 params = {'from_cli': True,
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
364 'language': lang,
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
365 'filename': args.filename,
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
366 'client_data': client_data
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
367 }
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
368 flags = Settings(**params)
10
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
369 if args.cmdline:
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
370 import shlex
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
371 if hasattr(shlex, 'join'):
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
372 joinargs = shlex.join
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
373 else:
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
374 joinargs = lambda a: ' '.join(a)
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
375
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
376 with open('clang_ycm_args.rsp', 'w', encoding='utf8') as fp:
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
377 fp.write("%s -fsyntax-only \"%s\"" % (
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
378 joinargs(sanitizeargs(flags['flags'])),
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
379 args.filename.replace('\\', '/')
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
380 ))
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
381 with open('clang_ycm_invoke.cmd', 'w', encoding='utf8') as fp:
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
382 fp.write("\"c:\\Program Files\\LLVM\\bin\\clang++.exe\" @clang_ycm_args.rsp > clang_ycm_invoke.log 2>&1")
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
383
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
384 logger.info("Command line written to: clang_ycm_invoke.cmd")
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
385 else:
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
386 logger.info("Flags:")
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
387 import pprint
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
388 pp = pprint.PrettyPrinter(indent=2)
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
389 pp.pprint(flags)
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
390
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
391
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
392 def sanitizeargs(args):
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
393 for arg in args:
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
394 if ' ' in arg:
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
395 yield '"%s"' % arg
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
396 else:
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
397 yield arg
0
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
398
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
399
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
400 if __name__ == '__main__':
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
401 main()