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