annotate scripts/ycm_extra_conf.py @ 15:cfcac4ed7d21 default tip

Improve loading of solution files - New argument to force a rebuild of the cache - Gracefully handle missing projects in a solution - Handle more different xml namespaces - Support more edge cases
author Ludovic Chabant <ludovic@chabant.com>
date Tue, 29 Aug 2023 12:59:54 -0700
parents 096e80c13781
children
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
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
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
117 logger.debug("Found project %s: %s" % (proj.name, proj.abspath))
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
118
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
119 # Get the provided config/platform combo, which represent a solution
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
120 # configuration, and find the corresponding project configuration.
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
121 # For instance, a solution configuration of "Debug|Win64" could map
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
122 # to a "MyDebug|AnyCPU" configuration on a specific project.
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
123 sln_config_platform = '%s|%s' % (buildenv['Configuration'],
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
124 buildenv['Platform'])
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
125 proj_config_platform = cache.slnobj.find_project_configuration(
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
126 proj.guid, sln_config_platform)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
127 if not proj_config_platform:
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
128 raise Exception("Can't find project configuration and platform for "
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
129 "solution configuration and platform: %s" %
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
130 sln_config_platform)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
131
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
132 # Make a build environment for the project, and figure out what
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
133 # kind of project it is.
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
134 proj_config, proj_platform = proj_config_platform.split('|')
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
135
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
136 proj_buildenv = buildenv.copy()
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
137 proj_buildenv['Configuration'] = proj_config
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
138 proj_buildenv['Platform'] = proj_platform
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
139
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
140 cfggroup = proj.propertygroup('Configuration', proj_buildenv)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
141 cfgtype = cfggroup.get('ConfigurationType')
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
142 if not cfgtype:
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
143 raise Exception("Can't find configuration type. Did you specify a "
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
144 "configuration name and platform? Got: %s" %
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
145 proj_buildenv)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
146 logger.debug("Found configuration type: %s" % cfgtype)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
147
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
148 # Let's prepare a list of standard stuff for C++.
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
149 preproc = []
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
150 incpaths = []
10
f444739dd8af Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
151 incfiles = []
0
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
152 projdir = os.path.dirname(proj.abspath)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
153
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
154 if cfgtype == 'Makefile':
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
155 # It's a 'Makefile' project, which means we know as little about
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
156 # compiler flags as whatever information was given to VS. As
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
157 # such, if the solution setup doesn't give enough info, VS
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
158 # intellisense won't work, and neither will YouCompleteMe.
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
159 defaultpropgroup = proj.defaultpropertygroup(proj_buildenv)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
160
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
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
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
168
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
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
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
184
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
185 else:
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
186 # We should definitely support standard VC++ projects here but
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
187 # I don't need it yet :)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
188 raise Exception("Don't know how to handle configuration type: %s" %
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
189 cfgtype)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
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
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
196 # Build the clang/YCM flags with what we found.
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
197 flags = ['-x', 'c++'] # TODO: check language type from project file.
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
198
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
199 for symbol in preproc:
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
200 flags.append('-D%s' % symbol)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
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
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
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
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
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
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
221
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
222 return {'flags': flags}
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
223
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
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
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
251 def _build_env_from_vim(client_data):
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
252 buildenv = {}
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
253 buildenv['Configuration'] = client_data.get('g:vimcrosoft_current_config', '')
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
254 buildenv['Platform'] = client_data.get('g:vimcrosoft_current_platform', '')
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
255 return buildenv
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
256
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
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
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
287 def Settings(**kwargs):
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
288 language = kwargs.get('language')
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
289 filename = kwargs.get('filename')
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
290
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
291 client_data = kwargs.get('client_data', {})
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
292 from_cli = kwargs.get('from_cli', False)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
293 if from_cli:
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
294 solution = client_data.get('solution')
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
295 slncache = client_data.get('slncache')
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
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
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
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
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
301 solution = client_data.get('g:vimcrosoft_current_sln')
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
302 slncache = client_data.get('g:vimcrosoft_current_sln_cache')
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
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
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
307
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
308 flags = None
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
309
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
310 if language == 'cfamily':
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
311 try:
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
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
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
315 except Exception as exc:
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
316 if from_cli:
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
317 raise
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
318 flags = {'error': str(exc)}
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
319 else:
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
320 flags = {'error': f"Unknown language: {language}"}
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
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
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
327 return flags
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
328
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
329
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
330 languages = {
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
331 'cfamily': ['h', 'c', 'hpp', 'cpp', 'inl']
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
332 }
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
333
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
334
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
335 def _get_language(filename):
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
336 _, ext = os.path.splitext(filename)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
337 ext = ext.lstrip('.')
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
338 for lang, exts in languages.items():
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
339 if ext in exts:
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
340 return lang
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
341 return None
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
342
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
343
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
344 def main():
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
345 parser = argparse.ArgumentParser()
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
346 parser.add_argument('solution',
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
347 help="The solution file")
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
348 parser.add_argument('filename',
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
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
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
353 parser.add_argument('-p', '--property',
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
354 action="append",
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
355 help="Specifies a build property")
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
356 parser.add_argument('-c', '--cache',
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
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
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
361 parser.add_argument('-v', '--verbose',
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
362 action='store_true',
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
363 help="Show debugging information")
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
364 args = parser.parse_args()
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
365 setup_logging(args.verbose)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
366
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
367 lang = _get_language(args.filename)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
368 logger.debug(f"Got language {lang} for {args.filename}")
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
369
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
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
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
376 if args.property:
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
377 for p in args.property:
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
378 pname, pval = p.split('=', 1)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
379 build_env[pname] = pval
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
380 logger.debug(f"Got build environment: {build_env}")
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
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
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
383 'env': build_env}
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
384
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
385 params = {'from_cli': True,
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
386 'language': lang,
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
387 'filename': args.filename,
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
388 'client_data': client_data
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
389 }
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
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
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
420
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
421
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
422 if __name__ == '__main__':
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
423 main()