1# This file is NOT licensed under the GPLv3, which is the license for the rest 2# of YouCompleteMe. 3# 4# Here's the license text for this file: 5# 6# This is free and unencumbered software released into the public domain. 7# 8# Anyone is free to copy, modify, publish, use, compile, sell, or 9# distribute this software, either in source code form or as a compiled 10# binary, for any purpose, commercial or non-commercial, and by any 11# means. 12# 13# In jurisdictions that recognize copyright laws, the author or authors 14# of this software dedicate any and all copyright interest in the 15# software to the public domain. We make this dedication for the benefit 16# of the public at large and to the detriment of our heirs and 17# successors. We intend this dedication to be an overt act of 18# relinquishment in perpetuity of all present and future rights to this 19# software under copyright law. 20# 21# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 22# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 23# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 24# IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR 25# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 26# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 27# OTHER DEALINGS IN THE SOFTWARE. 28# 29# For more information, please refer to <http://unlicense.org/> 30 31import os 32import ycm_core 33 34# These are the compilation flags that will be used in case there's no 35# compilation database set (by default, one is not set). 36# CHANGE THIS LIST OF FLAGS. YES, THIS IS THE DROID YOU HAVE BEEN LOOKING FOR. 37flags = [ 38'-Wall', 39'-Wextra', 40'-Werror', 41'-fopenmp', 42'-Wno-long-long', 43'-Wno-variadic-macros', 44'-Wno-unused-variable', 45'-DDEBUG', 46'-DDEBUGGREEDY', 47'-DCBC', 48'-I/home/haroldo/prog/include/coin/', 49'-I/usr/lib/gcc/x86_64-pc-linux-gnu/8.2.0/include/', 50'-I../../../CoinUtils/CoinUtils/src/', 51'-I../../../Clp/Clp/src/', 52'-I../../../Clp/Clp/src/OsiClp/', 53'-I../../../Osi/Osi/src/Osi/', 54'-I../../../Cgl/Cgl/src/', 55'-I/usr/include/coin', 56'-I/usr/include/coin/ThirdParty', 57# You 100% do NOT need -DUSE_CLANG_COMPLETER in your flags; only the YCM 58# source code needs it. 59#'-DUSE_CLANG_COMPLETER', 60# THIS IS IMPORTANT! Without a "-std=<something>" flag, clang won't know which 61# language to use when compiling headers. So it will guess. Badly. So C++ 62# headers will be compiled as C headers. You don't want that so ALWAYS specify 63# a "-std=<something>". 64# For a C project, you would set this to something like 'c99' instead of 65# 'c++11'. 66'-std=c99', 67# ...and the same thing goes for the magic -x option which specifies the 68# language that the files to be compiled are written in. This is mostly 69# relevant for c++ headers. 70# For a C project, you would set this to 'c' instead of 'c++'. 71'-x', 72'c++', 73# This path will only work on OS X, but extra paths that don't exist are not 74# harmful 75] 76 77 78# Set this to the absolute path to the folder (NOT the file!) containing the 79# compile_commands.json file to use that instead of 'flags'. See here for 80# more details: http://clang.llvm.org/docs/JSONCompilationDatabase.html 81# 82# You can get CMake to generate this file for you by adding: 83# set( CMAKE_EXPORT_COMPILE_COMMANDS 1 ) 84# to your CMakeLists.txt file. 85# 86# Most projects will NOT need to set this to anything; you can just change the 87# 'flags' list of compilation flags. Notice that YCM itself uses that approach. 88compilation_database_folder = '' 89 90if os.path.exists( compilation_database_folder ): 91 database = ycm_core.CompilationDatabase( compilation_database_folder ) 92else: 93 database = None 94 95SOURCE_EXTENSIONS = [ '.cpp', '.cxx', '.cc', '.c', '.m', '.mm' ] 96 97def DirectoryOfThisScript(): 98 return os.path.dirname( os.path.abspath( __file__ ) ) 99 100 101def MakeRelativePathsInFlagsAbsolute( flags, working_directory ): 102 if not working_directory: 103 return list( flags ) 104 new_flags = [] 105 make_next_absolute = False 106 path_flags = [ '-isystem', '-I', '-iquote', '--sysroot=' ] 107 for flag in flags: 108 new_flag = flag 109 110 if make_next_absolute: 111 make_next_absolute = False 112 if not flag.startswith( '/' ): 113 new_flag = os.path.join( working_directory, flag ) 114 115 for path_flag in path_flags: 116 if flag == path_flag: 117 make_next_absolute = True 118 break 119 120 if flag.startswith( path_flag ): 121 path = flag[ len( path_flag ): ] 122 new_flag = path_flag + os.path.join( working_directory, path ) 123 break 124 125 if new_flag: 126 new_flags.append( new_flag ) 127 return new_flags 128 129 130def IsHeaderFile( filename ): 131 extension = os.path.splitext( filename )[ 1 ] 132 return extension in [ '.h', '.hxx', '.hpp', '.hh' ] 133 134 135def GetCompilationInfoForFile( filename ): 136 # The compilation_commands.json file generated by CMake does not have entries 137 # for header files. So we do our best by asking the db for flags for a 138 # corresponding source file, if any. If one exists, the flags for that file 139 # should be good enough. 140 if IsHeaderFile( filename ): 141 basename = os.path.splitext( filename )[ 0 ] 142 for extension in SOURCE_EXTENSIONS: 143 replacement_file = basename + extension 144 if os.path.exists( replacement_file ): 145 compilation_info = database.GetCompilationInfoForFile( 146 replacement_file ) 147 if compilation_info.compiler_flags_: 148 return compilation_info 149 return None 150 return database.GetCompilationInfoForFile( filename ) 151 152 153def FlagsForFile( filename, **kwargs ): 154 if database: 155 # Bear in mind that compilation_info.compiler_flags_ does NOT return a 156 # python list, but a "list-like" StringVec object 157 compilation_info = GetCompilationInfoForFile( filename ) 158 if not compilation_info: 159 return None 160 161 final_flags = MakeRelativePathsInFlagsAbsolute( 162 compilation_info.compiler_flags_, 163 compilation_info.compiler_working_dir_ ) 164 165 # NOTE: This is just for YouCompleteMe; it's highly likely that your project 166 # does NOT need to remove the stdlib flag. DO NOT USE THIS IN YOUR 167 # ycm_extra_conf IF YOU'RE NOT 100% SURE YOU NEED IT. 168 try: 169 final_flags.remove( '-stdlib=libc++' ) 170 except ValueError: 171 pass 172 else: 173 relative_to = DirectoryOfThisScript() 174 final_flags = MakeRelativePathsInFlagsAbsolute( flags, relative_to ) 175 176 return { 'flags': final_flags } 177