xref: /llvm-project/third-party/benchmark/.ycm_extra_conf.py (revision a5b797172cc902db166e9a695716fb81405f86e4)
1a290770fSMircea Trofinimport os
2*a5b79717SMircea Trofin
3a290770fSMircea Trofinimport ycm_core
4a290770fSMircea Trofin
5a290770fSMircea Trofin# These are the compilation flags that will be used in case there's no
6a290770fSMircea Trofin# compilation database set (by default, one is not set).
7a290770fSMircea Trofin# CHANGE THIS LIST OF FLAGS. YES, THIS IS THE DROID YOU HAVE BEEN LOOKING FOR.
8a290770fSMircea Trofinflags = [
9f98ee40fSTobias Hieta    "-Wall",
10f98ee40fSTobias Hieta    "-Werror",
11f98ee40fSTobias Hieta    "-pedantic-errors",
12f98ee40fSTobias Hieta    "-std=c++0x",
13f98ee40fSTobias Hieta    "-fno-strict-aliasing",
14f98ee40fSTobias Hieta    "-O3",
15f98ee40fSTobias Hieta    "-DNDEBUG",
16a290770fSMircea Trofin    # ...and the same thing goes for the magic -x option which specifies the
17a290770fSMircea Trofin    # language that the files to be compiled are written in. This is mostly
18a290770fSMircea Trofin    # relevant for c++ headers.
19a290770fSMircea Trofin    # For a C project, you would set this to 'c' instead of 'c++'.
20f98ee40fSTobias Hieta    "-x",
21f98ee40fSTobias Hieta    "c++",
22f98ee40fSTobias Hieta    "-I",
23f98ee40fSTobias Hieta    "include",
24f98ee40fSTobias Hieta    "-isystem",
25f98ee40fSTobias Hieta    "/usr/include",
26f98ee40fSTobias Hieta    "-isystem",
27f98ee40fSTobias Hieta    "/usr/local/include",
28a290770fSMircea Trofin]
29a290770fSMircea Trofin
30a290770fSMircea Trofin
31a290770fSMircea Trofin# Set this to the absolute path to the folder (NOT the file!) containing the
32a290770fSMircea Trofin# compile_commands.json file to use that instead of 'flags'. See here for
33a290770fSMircea Trofin# more details: http://clang.llvm.org/docs/JSONCompilationDatabase.html
34a290770fSMircea Trofin#
35a290770fSMircea Trofin# Most projects will NOT need to set this to anything; you can just change the
36a290770fSMircea Trofin# 'flags' list of compilation flags. Notice that YCM itself uses that approach.
37f98ee40fSTobias Hietacompilation_database_folder = ""
38a290770fSMircea Trofin
39a290770fSMircea Trofinif os.path.exists(compilation_database_folder):
40a290770fSMircea Trofin    database = ycm_core.CompilationDatabase(compilation_database_folder)
41a290770fSMircea Trofinelse:
42a290770fSMircea Trofin    database = None
43a290770fSMircea Trofin
44f98ee40fSTobias HietaSOURCE_EXTENSIONS = [".cc"]
45f98ee40fSTobias Hieta
46a290770fSMircea Trofin
47a290770fSMircea Trofindef DirectoryOfThisScript():
48a290770fSMircea Trofin    return os.path.dirname(os.path.abspath(__file__))
49a290770fSMircea Trofin
50a290770fSMircea Trofin
51a290770fSMircea Trofindef MakeRelativePathsInFlagsAbsolute(flags, working_directory):
52a290770fSMircea Trofin    if not working_directory:
53a290770fSMircea Trofin        return list(flags)
54a290770fSMircea Trofin    new_flags = []
55a290770fSMircea Trofin    make_next_absolute = False
56f98ee40fSTobias Hieta    path_flags = ["-isystem", "-I", "-iquote", "--sysroot="]
57a290770fSMircea Trofin    for flag in flags:
58a290770fSMircea Trofin        new_flag = flag
59a290770fSMircea Trofin
60a290770fSMircea Trofin        if make_next_absolute:
61a290770fSMircea Trofin            make_next_absolute = False
62f98ee40fSTobias Hieta            if not flag.startswith("/"):
63a290770fSMircea Trofin                new_flag = os.path.join(working_directory, flag)
64a290770fSMircea Trofin
65a290770fSMircea Trofin        for path_flag in path_flags:
66a290770fSMircea Trofin            if flag == path_flag:
67a290770fSMircea Trofin                make_next_absolute = True
68a290770fSMircea Trofin                break
69a290770fSMircea Trofin
70a290770fSMircea Trofin            if flag.startswith(path_flag):
71a290770fSMircea Trofin                path = flag[len(path_flag) :]
72a290770fSMircea Trofin                new_flag = path_flag + os.path.join(working_directory, path)
73a290770fSMircea Trofin                break
74a290770fSMircea Trofin
75a290770fSMircea Trofin        if new_flag:
76a290770fSMircea Trofin            new_flags.append(new_flag)
77a290770fSMircea Trofin    return new_flags
78a290770fSMircea Trofin
79a290770fSMircea Trofin
80a290770fSMircea Trofindef IsHeaderFile(filename):
81a290770fSMircea Trofin    extension = os.path.splitext(filename)[1]
82f98ee40fSTobias Hieta    return extension in [".h", ".hxx", ".hpp", ".hh"]
83a290770fSMircea Trofin
84a290770fSMircea Trofin
85a290770fSMircea Trofindef GetCompilationInfoForFile(filename):
86a290770fSMircea Trofin    # The compilation_commands.json file generated by CMake does not have entries
87a290770fSMircea Trofin    # for header files. So we do our best by asking the db for flags for a
88a290770fSMircea Trofin    # corresponding source file, if any. If one exists, the flags for that file
89a290770fSMircea Trofin    # should be good enough.
90a290770fSMircea Trofin    if IsHeaderFile(filename):
91a290770fSMircea Trofin        basename = os.path.splitext(filename)[0]
92a290770fSMircea Trofin        for extension in SOURCE_EXTENSIONS:
93a290770fSMircea Trofin            replacement_file = basename + extension
94a290770fSMircea Trofin            if os.path.exists(replacement_file):
95*a5b79717SMircea Trofin                compilation_info = database.GetCompilationInfoForFile(
96*a5b79717SMircea Trofin                    replacement_file
97*a5b79717SMircea Trofin                )
98a290770fSMircea Trofin                if compilation_info.compiler_flags_:
99a290770fSMircea Trofin                    return compilation_info
100a290770fSMircea Trofin        return None
101a290770fSMircea Trofin    return database.GetCompilationInfoForFile(filename)
102a290770fSMircea Trofin
103a290770fSMircea Trofin
104a290770fSMircea Trofindef FlagsForFile(filename, **kwargs):
105a290770fSMircea Trofin    if database:
106a290770fSMircea Trofin        # Bear in mind that compilation_info.compiler_flags_ does NOT return a
107a290770fSMircea Trofin        # python list, but a "list-like" StringVec object
108a290770fSMircea Trofin        compilation_info = GetCompilationInfoForFile(filename)
109a290770fSMircea Trofin        if not compilation_info:
110a290770fSMircea Trofin            return None
111a290770fSMircea Trofin
112a290770fSMircea Trofin        final_flags = MakeRelativePathsInFlagsAbsolute(
113*a5b79717SMircea Trofin            compilation_info.compiler_flags_,
114*a5b79717SMircea Trofin            compilation_info.compiler_working_dir_,
115f98ee40fSTobias Hieta        )
116a290770fSMircea Trofin    else:
117a290770fSMircea Trofin        relative_to = DirectoryOfThisScript()
118a290770fSMircea Trofin        final_flags = MakeRelativePathsInFlagsAbsolute(flags, relative_to)
119a290770fSMircea Trofin
120f98ee40fSTobias Hieta    return {"flags": final_flags, "do_cache": True}
121