Mercurial > vim-crosoft
annotate scripts/ycm_extra_conf.py @ 12:1639be0967d6
Warn if multiple solutions have been found in the project.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Tue, 29 Aug 2023 12:50:59 -0700 |
parents | 096e80c13781 |
children |
rev | line source |
---|---|
0 | 1 import argparse |
2 import logging | |
3 import os.path | |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
4 import shutil |
0 | 5 import sys |
6 | |
7 | |
8 if True: # 'vim' in sys.modules: | |
9 sys.path.append(os.path.dirname(__file__)) | |
10 | |
11 | |
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 | 15 |
16 | |
17 logger = logging.getLogger(__name__) | |
18 | |
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 | 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 | 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 | 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 | 56 |
11
096e80c13781
Use the correct documentation extension.
Ludovic Chabant <ludovic@chabant.com>
parents:
10
diff
changeset
|
57 logger.debug("Requested item didn't have any flags, looking for related items") |
10
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 item_incpaths, item_incfiles = _get_item_specific_flags(projdir, clcompileitems, companion_item) |
11
096e80c13781
Use the correct documentation extension.
Ludovic Chabant <ludovic@chabant.com>
parents:
10
diff
changeset
|
62 if item_incpaths or item_incfiles: |
096e80c13781
Use the correct documentation extension.
Ludovic Chabant <ludovic@chabant.com>
parents:
10
diff
changeset
|
63 logger.debug("Found flags on companion item: %s" % companion_item) |
096e80c13781
Use the correct documentation extension.
Ludovic Chabant <ludovic@chabant.com>
parents:
10
diff
changeset
|
64 incpaths += item_incpaths |
096e80c13781
Use the correct documentation extension.
Ludovic Chabant <ludovic@chabant.com>
parents:
10
diff
changeset
|
65 incfiles += item_incfiles |
096e80c13781
Use the correct documentation extension.
Ludovic Chabant <ludovic@chabant.com>
parents:
10
diff
changeset
|
66 return True |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
67 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
68 #logger.debug("No companion item found, see if we can find flags for a neighbour") |
11
096e80c13781
Use the correct documentation extension.
Ludovic Chabant <ludovic@chabant.com>
parents:
10
diff
changeset
|
69 #dirname = os.path.dirname(filename) |
096e80c13781
Use the correct documentation extension.
Ludovic Chabant <ludovic@chabant.com>
parents:
10
diff
changeset
|
70 #neighbournames = os.listdir(dirname) |
096e80c13781
Use the correct documentation extension.
Ludovic Chabant <ludovic@chabant.com>
parents:
10
diff
changeset
|
71 #neighbournames.remove(os.path.basename(filename)) |
096e80c13781
Use the correct documentation extension.
Ludovic Chabant <ludovic@chabant.com>
parents:
10
diff
changeset
|
72 #for neighbourname in neighbournames: |
096e80c13781
Use the correct documentation extension.
Ludovic Chabant <ludovic@chabant.com>
parents:
10
diff
changeset
|
73 # neighbourpath = os.path.join(dirname, neighbourname) |
096e80c13781
Use the correct documentation extension.
Ludovic Chabant <ludovic@chabant.com>
parents:
10
diff
changeset
|
74 # item_incpaths, item_incfiles = _get_item_specific_flags(projdir, clcompileitems, neighbourpath) |
096e80c13781
Use the correct documentation extension.
Ludovic Chabant <ludovic@chabant.com>
parents:
10
diff
changeset
|
75 # if item_incpaths or item_incfiles: |
096e80c13781
Use the correct documentation extension.
Ludovic Chabant <ludovic@chabant.com>
parents:
10
diff
changeset
|
76 # logger.debug("Found flags on: %d" % neighbourpath) |
096e80c13781
Use the correct documentation extension.
Ludovic Chabant <ludovic@chabant.com>
parents:
10
diff
changeset
|
77 # incpaths += item_incpaths |
096e80c13781
Use the correct documentation extension.
Ludovic Chabant <ludovic@chabant.com>
parents:
10
diff
changeset
|
78 # incfiles += item_incfiles |
096e80c13781
Use the correct documentation extension.
Ludovic Chabant <ludovic@chabant.com>
parents:
10
diff
changeset
|
79 # return True |
096e80c13781
Use the correct documentation extension.
Ludovic Chabant <ludovic@chabant.com>
parents:
10
diff
changeset
|
80 |
096e80c13781
Use the correct documentation extension.
Ludovic Chabant <ludovic@chabant.com>
parents:
10
diff
changeset
|
81 # neighbour_companion = _find_companion_item(solution, filename, slncache=slncache) |
096e80c13781
Use the correct documentation extension.
Ludovic Chabant <ludovic@chabant.com>
parents:
10
diff
changeset
|
82 # if neighbour_companion: |
096e80c13781
Use the correct documentation extension.
Ludovic Chabant <ludovic@chabant.com>
parents:
10
diff
changeset
|
83 # item_incpaths, item_incfiles = _get_item_specific_flags(projdir, clcompileitems, neighbour_companion) |
096e80c13781
Use the correct documentation extension.
Ludovic Chabant <ludovic@chabant.com>
parents:
10
diff
changeset
|
84 # if item_incpaths or item_incfiles: |
096e80c13781
Use the correct documentation extension.
Ludovic Chabant <ludovic@chabant.com>
parents:
10
diff
changeset
|
85 # logger.debug("Found flags on: %s" % neighbour_companion) |
096e80c13781
Use the correct documentation extension.
Ludovic Chabant <ludovic@chabant.com>
parents:
10
diff
changeset
|
86 # incpaths += item_incpaths |
096e80c13781
Use the correct documentation extension.
Ludovic Chabant <ludovic@chabant.com>
parents:
10
diff
changeset
|
87 # incfiles += item_incfiles |
096e80c13781
Use the correct documentation extension.
Ludovic Chabant <ludovic@chabant.com>
parents:
10
diff
changeset
|
88 # return True |
096e80c13781
Use the correct documentation extension.
Ludovic Chabant <ludovic@chabant.com>
parents:
10
diff
changeset
|
89 |
096e80c13781
Use the correct documentation extension.
Ludovic Chabant <ludovic@chabant.com>
parents:
10
diff
changeset
|
90 #logger.debug("No flags found anywhere...") |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
91 return False |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
92 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
93 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
94 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
|
95 argfilename = os.path.join( |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
96 os.path.dirname(solution), |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
97 '.vimcrosoft', |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
98 (os.path.basename(solution) + '.flags')) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
99 try: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
100 with open(argfilename, 'r', encoding='utf8') as fp: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
101 lines = fp.readlines() |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
102 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
|
103 except OSError: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
104 return extraflags |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
105 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
106 extraflags = extraflags or [] |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
107 for line in lines: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
108 if not line.startswith('#'): |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
109 extraflags.append(line.strip()) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
110 return extraflags |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
111 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
112 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
113 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
|
114 force_fwd_slashes=True, short_flags=True): |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
115 # Find the current file in the solution. |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
116 cache, proj = find_item_project(filename, solution, slncache) |
0 | 117 logger.debug("Found project %s: %s" % (proj.name, proj.abspath)) |
118 | |
119 # Get the provided config/platform combo, which represent a solution | |
120 # configuration, and find the corresponding project configuration. | |
121 # For instance, a solution configuration of "Debug|Win64" could map | |
122 # to a "MyDebug|AnyCPU" configuration on a specific project. | |
123 sln_config_platform = '%s|%s' % (buildenv['Configuration'], | |
124 buildenv['Platform']) | |
125 proj_config_platform = cache.slnobj.find_project_configuration( | |
126 proj.guid, sln_config_platform) | |
127 if not proj_config_platform: | |
128 raise Exception("Can't find project configuration and platform for " | |
129 "solution configuration and platform: %s" % | |
130 sln_config_platform) | |
131 | |
132 # Make a build environment for the project, and figure out what | |
133 # kind of project it is. | |
134 proj_config, proj_platform = proj_config_platform.split('|') | |
135 | |
136 proj_buildenv = buildenv.copy() | |
137 proj_buildenv['Configuration'] = proj_config | |
138 proj_buildenv['Platform'] = proj_platform | |
139 | |
140 cfggroup = proj.propertygroup('Configuration', proj_buildenv) | |
141 cfgtype = cfggroup.get('ConfigurationType') | |
142 if not cfgtype: | |
143 raise Exception("Can't find configuration type. Did you specify a " | |
144 "configuration name and platform? Got: %s" % | |
145 proj_buildenv) | |
146 logger.debug("Found configuration type: %s" % cfgtype) | |
147 | |
148 # Let's prepare a list of standard stuff for C++. | |
149 preproc = [] | |
150 incpaths = [] | |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
151 incfiles = [] |
0 | 152 projdir = os.path.dirname(proj.abspath) |
153 | |
154 if cfgtype == 'Makefile': | |
155 # It's a 'Makefile' project, which means we know as little about | |
156 # compiler flags as whatever information was given to VS. As | |
157 # such, if the solution setup doesn't give enough info, VS | |
158 # intellisense won't work, and neither will YouCompleteMe. | |
159 defaultpropgroup = proj.defaultpropertygroup(proj_buildenv) | |
160 | |
161 nmake_preproc = defaultpropgroup.get('NMakePreprocessorDefinitions') | |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
162 preproc += _split_paths_property(nmake_preproc) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
163 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
164 vs_incpaths = defaultpropgroup.get('IncludePath') |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
165 if vs_incpaths: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
166 incpaths += _split_paths_property_and_make_absolute( |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
167 projdir, vs_incpaths) |
0 | 168 |
169 nmake_incpaths = defaultpropgroup.get('NMakeIncludeSearchPath') | |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
170 if nmake_incpaths: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
171 incpaths += _split_paths_property_and_make_absolute( |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
172 projdir, nmake_incpaths) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
173 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
174 nmake_forcedincs = defaultpropgroup.get('NMakeForcedIncludes') |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
175 if nmake_forcedincs: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
176 incfiles += _split_paths_property_and_make_absolute( |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
177 projdir, nmake_forcedincs) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
178 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
179 # 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
|
180 defaultitemgroup = proj.defaultitemgroup(proj_buildenv) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
181 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
|
182 _find_any_possible_item_specific_flags( |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
183 solution, slncache, projdir, clcompileitems, filename, incpaths, incfiles) |
0 | 184 |
185 else: | |
186 # We should definitely support standard VC++ projects here but | |
187 # I don't need it yet :) | |
188 raise Exception("Don't know how to handle configuration type: %s" % | |
189 cfgtype) | |
190 | |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
191 # 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
|
192 # 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
|
193 # 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
|
194 incfiles = _cache_pch_files(incfiles) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
195 |
0 | 196 # Build the clang/YCM flags with what we found. |
197 flags = ['-x', 'c++'] # TODO: check language type from project file. | |
198 | |
199 for symbol in preproc: | |
200 flags.append('-D%s' % symbol) | |
201 for path in incpaths: | |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
202 flagname = '-I' |
0 | 203 if path.startswith("C:\\Program Files"): |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
204 flagname = '-isystem' |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
205 flagval = path.replace('\\', '/') if force_fwd_slashes else path |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
206 if short_flags: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
207 flags.append('%s%s' % (flagname, flagval)) |
0 | 208 else: |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
209 flags.append(flagname) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
210 flags.append(flagval) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
211 # 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
|
212 incfiles = list(reversed(incfiles)) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
213 for path in incfiles: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
214 if force_fwd_slashes: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
215 flags.append('--include=%s' % path.replace('\\', '/')) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
216 else: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
217 flags.append('--include=%s' % path) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
218 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
219 if extraflags: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
220 flags += extraflags |
0 | 221 |
222 return {'flags': flags} | |
223 | |
224 | |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
225 _clang_shadow_pch_suffix = '-for-clang' |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
226 |
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 def _cache_pch_files(paths): |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
229 outpaths = [] |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
230 for path in paths: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
231 name, ext = os.path.splitext(path) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
232 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
|
233 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
234 do_cache = False |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
235 orig_mtime = os.path.getmtime(path) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
236 try: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
237 out_mtime = os.path.getmtime(outpath) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
238 if orig_mtime >= out_mtime: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
239 do_cache = True |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
240 except OSError: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
241 do_cache = True |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
242 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
243 if do_cache: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
244 logger.debug("Creating shadow PCH file: %s" % path) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
245 shutil.copy2(path, outpath) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
246 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
247 outpaths.append(outpath) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
248 return outpaths |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
249 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
250 |
0 | 251 def _build_env_from_vim(client_data): |
252 buildenv = {} | |
253 buildenv['Configuration'] = client_data.get('g:vimcrosoft_current_config', '') | |
254 buildenv['Platform'] = client_data.get('g:vimcrosoft_current_platform', '') | |
255 return buildenv | |
256 | |
257 | |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
258 _dump_debug_file = True |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
259 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
260 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
261 def _do_dump_debug_file(args, flags, debug_filename): |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
262 import pprint |
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 with open(debug_filename, 'w') as fp: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
265 fp.write(" args: \n") |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
266 fp.write("=========\n") |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
267 pp = pprint.PrettyPrinter(indent=2, stream=fp) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
268 pp.pprint(args) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
269 fp.write("\n\n") |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
270 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
271 fp.write(" flags: \n") |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
272 fp.write("==========\n") |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
273 flags = flags.get('flags') |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
274 if flags: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
275 fp.write(flags[0]) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
276 for flag in flags[1:]: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
277 if flag[0] == '-': |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
278 fp.write("\n") |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
279 else: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
280 fp.write(" ") |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
281 fp.write(flag) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
282 else: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
283 fp.write("<no flags found>\n") |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
284 fp.write("\n\n") |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
285 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
286 |
0 | 287 def Settings(**kwargs): |
288 language = kwargs.get('language') | |
289 filename = kwargs.get('filename') | |
290 | |
291 client_data = kwargs.get('client_data', {}) | |
292 from_cli = kwargs.get('from_cli', False) | |
293 if from_cli: | |
294 solution = client_data.get('solution') | |
295 slncache = client_data.get('slncache') | |
296 buildenv = client_data.get('env', {}) | |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
297 extraflags = client_data.get('extra_flags') |
0 | 298 else: |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
299 if not client_data: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
300 raise Exception("No client data provided by Vim host!") |
0 | 301 solution = client_data.get('g:vimcrosoft_current_sln') |
302 slncache = client_data.get('g:vimcrosoft_current_sln_cache') | |
303 buildenv = _build_env_from_vim(client_data) | |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
304 extraflags = client_data.get('g:vimcrosoft_extra_clang_args') |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
305 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
306 extraflags = _expand_extra_flags_with_solution_extra_flags(solution, extraflags) |
0 | 307 |
308 flags = None | |
309 | |
310 if language == 'cfamily': | |
311 try: | |
312 flags = _build_cflags(filename, solution, | |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
313 buildenv=buildenv, slncache=slncache, |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
314 extraflags=extraflags) |
0 | 315 except Exception as exc: |
316 if from_cli: | |
317 raise | |
318 flags = {'error': str(exc)} | |
319 else: | |
320 flags = {'error': f"Unknown language: {language}"} | |
321 | |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
322 if _dump_debug_file: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
323 debug_filename = os.path.join( |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
324 os.path.dirname(solution), '.vimcrosoft', 'debug_flags.txt') |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
325 _do_dump_debug_file(kwargs, flags, debug_filename) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
326 |
0 | 327 return flags |
328 | |
329 | |
330 languages = { | |
331 'cfamily': ['h', 'c', 'hpp', 'cpp', 'inl'] | |
332 } | |
333 | |
334 | |
335 def _get_language(filename): | |
336 _, ext = os.path.splitext(filename) | |
337 ext = ext.lstrip('.') | |
338 for lang, exts in languages.items(): | |
339 if ext in exts: | |
340 return lang | |
341 return None | |
342 | |
343 | |
344 def main(): | |
345 parser = argparse.ArgumentParser() | |
346 parser.add_argument('solution', | |
347 help="The solution file") | |
348 parser.add_argument('filename', | |
349 help="The filename for which to get flags") | |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
350 parser.add_argument('--no-auto-env', |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
351 action='store_true', |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
352 help="Don't read configuration information from Vimcrosoft cache") |
0 | 353 parser.add_argument('-p', '--property', |
354 action="append", | |
355 help="Specifies a build property") | |
356 parser.add_argument('-c', '--cache', | |
357 help="The solution cache to use") | |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
358 parser.add_argument('--cmdline', |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
359 action='store_true', |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
360 help="Output flags in a command-line form") |
0 | 361 parser.add_argument('-v', '--verbose', |
362 action='store_true', | |
363 help="Show debugging information") | |
364 args = parser.parse_args() | |
365 setup_logging(args.verbose) | |
366 | |
367 lang = _get_language(args.filename) | |
368 logger.debug(f"Got language {lang} for {args.filename}") | |
369 | |
370 build_env = {} | |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
371 slncache = args.cache |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
372 if not args.no_auto_env: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
373 load_vimcrosoft_auto_env(args.solution, build_env) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
374 if not slncache: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
375 slncache = find_vimcrosoft_slncache(args.solution) |
0 | 376 if args.property: |
377 for p in args.property: | |
378 pname, pval = p.split('=', 1) | |
379 build_env[pname] = pval | |
380 logger.debug(f"Got build environment: {build_env}") | |
381 client_data = {'solution': args.solution, | |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
382 'slncache': slncache, |
0 | 383 'env': build_env} |
384 | |
385 params = {'from_cli': True, | |
386 'language': lang, | |
387 'filename': args.filename, | |
388 'client_data': client_data | |
389 } | |
390 flags = Settings(**params) | |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
391 if args.cmdline: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
392 import shlex |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
393 if hasattr(shlex, 'join'): |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
394 joinargs = shlex.join |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
395 else: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
396 joinargs = lambda a: ' '.join(a) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
397 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
398 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
|
399 fp.write("%s -fsyntax-only \"%s\"" % ( |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
400 joinargs(sanitizeargs(flags['flags'])), |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
401 args.filename.replace('\\', '/') |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
402 )) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
403 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
|
404 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
|
405 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
406 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
|
407 else: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
408 logger.info("Flags:") |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
409 import pprint |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
410 pp = pprint.PrettyPrinter(indent=2) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
411 pp.pprint(flags) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
412 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
413 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
414 def sanitizeargs(args): |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
415 for arg in args: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
416 if ' ' in arg: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
417 yield '"%s"' % arg |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
418 else: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
419 yield arg |
0 | 420 |
421 | |
422 if __name__ == '__main__': | |
423 main() |