Mercurial > vim-crosoft
annotate scripts/ycm_extra_conf.py @ 14:0aa61944e518
Add utility script to print the contents of a solution's cache.
| author | Ludovic Chabant <ludovic@chabant.com> |
|---|---|
| date | Tue, 29 Aug 2023 12:52:12 -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() |
