Skip to content

Instantly share code, notes, and snippets.

@yoyokko
Last active August 29, 2015 13:57
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yoyokko/9764312 to your computer and use it in GitHub Desktop.
Save yoyokko/9764312 to your computer and use it in GitHub Desktop.
#!/usr/bin/python
import os
import sys
import getopt
template = '''
# This file is NOT licensed under the GPLv3, which is the license for the rest
# of YouCompleteMe.
#
# Here's the license text for this file:
#
# This is free and unencumbered software released into the public domain.
#
# Anyone is free to copy, modify, publish, use, compile, sell, or
# distribute this software, either in source code form or as a compiled
# binary, for any purpose, commercial or non-commercial, and by any
# means.
#
# In jurisdictions that recognize copyright laws, the author or authors
# of this software dedicate any and all copyright interest in the
# software to the public domain. We make this dedication for the benefit
# of the public at large and to the detriment of our heirs and
# successors. We intend this dedication to be an overt act of
# relinquishment in perpetuity of all present and future rights to this
# software under copyright law.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
# IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
# OTHER DEALINGS IN THE SOFTWARE.
#
# For more information, please refer to <http://unlicense.org/>
import os
import ycm_core
from clang_helpers import PrepareClangFlags
# These are the compilation flags that will be used in case there's no
# compilation database set (by default, one is not set).
# CHANGE THIS LIST OF FLAGS. YES, THIS IS THE DROID YOU HAVE BEEN LOOKING FOR.
<##FLAGS##>
# Set this to the absolute path to the folder (NOT the file!) containing the
# compile_commands.json file to use that instead of 'flags'. See here for
# more details: http://clang.llvm.org/docs/JSONCompilationDatabase.html
#
# Most projects will NOT need to set this to anything; you can just change the
# 'flags' list of compilation flags. Notice that YCM itself uses that approach.
compilation_database_folder = ''
if compilation_database_folder:
database = ycm_core.CompilationDatabase( compilation_database_folder )
else:
database = None
def DirectoryOfThisScript():
return os.path.dirname( os.path.abspath( __file__ ) )
def MakeRelativePathsInFlagsAbsolute( flags, working_directory ):
if not working_directory:
return flags
new_flags = []
make_next_absolute = False
path_flags = [ '-isystem', '-I', '-iquote', '--sysroot=' ]
for flag in flags:
new_flag = flag
if make_next_absolute:
make_next_absolute = False
if not flag.startswith( '/' ):
new_flag = os.path.join( working_directory, flag )
for path_flag in path_flags:
if flag == path_flag:
make_next_absolute = True
break
if flag.startswith( path_flag ):
path = flag[ len( path_flag ): ]
new_flag = path_flag + os.path.join( working_directory, path )
break
if new_flag:
new_flags.append( new_flag )
return new_flags
def FlagsForFile( filename ):
if database:
# Bear in mind that compilation_info.compiler_flags_ does NOT return a
# python list, but a "list-like" StringVec object
compilation_info = database.GetCompilationInfoForFile( filename )
final_flags = PrepareClangFlags(
MakeRelativePathsInFlagsAbsolute(
compilation_info.compiler_flags_,
compilation_info.compiler_working_dir_ ),
filename )
else:
relative_to = DirectoryOfThisScript()
final_flags = MakeRelativePathsInFlagsAbsolute( flags, relative_to )
return {
'flags': final_flags,
'do_cache': True
}
'''
flags = [
'-x',
'objective-c',
'-arch i386',
'-fmessage-length=0',
'-std=gnu99',
'-Wno-trigraphs',
'-fpascal-strings',
'-Os',
'-Wno-missing-field-initializers',
'-Wno-missing-prototypes',
'-Wreturn-type',
'-Wno-implicit-atomic-properties',
'-Wno-receiver-is-weak',
'-Wduplicate-method-match',
'-Wformat',
'-Wno-missing-braces',
'-Wparentheses',
'-Wswitch',
'-Wno-unused-function',
'-Wno-unused-label',
'-Wno-unused-parameter',
'-Wunused-variable',
'-Wunused-value',
'-Wempty-body',
'-Wuninitialized',
'-Wno-unknown-pragmas',
'-Wno-shadow',
'-Wno-four-char-constants',
'-Wno-conversion',
'-Wno-constant-conversion',
'-Wno-int-conversion',
'-Wno-enum-conversion',
'-Wno-shorten-64-to-32',
'-Wpointer-sign',
'-Wno-newline-eof',
'-Wno-selector',
'-Wno-strict-selector-match',
'-Wno-undeclared-selector',
'-Wno-deprecated-implementations',
'-fexceptions',
'-fasm-blocks',
'-fstrict-aliasing',
'-Wprotocol',
'-Wdeprecated-declarations',
'-g',
'-fvisibility=hidden',
'-Wno-sign-conversion',
'-fobjc-abi-version=2',
'-fobjc-legacy-dispatch',
'-iquote',
'-DNS_BLOCK_ASSERTIONS=1',
'-MMD',
'-MT',
'-MF'
]
def usage():
print
print 'Usage: ycm_conf_ios_gen [OPTS] <iOS_Project_Folder>'
print
print ' [OPTS]:'
print
print ' -f, -force-no-arc'
print ' Do not build with arc. If your project is not using arc, please add this arg.'
print ' -c, -clang'
print ' Generate .clang_complete file.'
print
def xcode_framework_pathes():
xcode_path = '/Applications/Xcode.app/Contents/Developer'
platform_path = os.path.join(xcode_path, 'Platforms/iPhoneSimulator.platform/Developer/SDKs/')
systemroot = ''
minversionstr = ''
maxversion = 0.0
for dir in [name for name in os.listdir(platform_path)
if os.path.isdir(os.path.join(platform_path, name))]:
if dir.startswith('iPhoneSimulator'):
version = float(dir[15:-4])
if version > maxversion:
maxversion = version
minversionstr = dir[15:-4]
systemroot = dir
if maxversion > 0.0:
systemroot = os.path.join(platform_path, systemroot)
return [
'-isysroot',
systemroot,
'-I%s' % os.path.join(systemroot, 'System/Library/Frameworks/Foundation.framework/Headers'),
'-I%s' % os.path.join(xcode_path, 'Toolchains/XcodeDefault.xctoolchain/usr/include'),
'-mios-simulator-version-min=%s' % minversionstr,
]
def project_pathes(projectfolder):
def directories_contains_source(files):
for f in files:
if f.split(".")[-1] in ("h", "m", "mm", "c", "cpp", "cc"):
return True
return False
folderlist = []
for (path, dirs, files) in os.walk(projectfolder):
if directories_contains_source(files):
folderlist.append('-I%s' % path)
return folderlist
def main(args):
try:
# Short option syntax: "hv:"
# Long option syntax: "help" or "verbose="
opts, args = getopt.getopt(sys.argv[1:], "hfc", [])
except getopt.GetoptError, err:
# Print debug info
print str(err)
sys.exit(0)
use_arc = True
clang_complete = False
for option, argument in opts:
if option in ("-h", "--help"):
usage()
elif option in ("-f", "-fore-no-arc"):
use_arc = False
elif option in ("-c", "-clang"):
clang_complete = True
if len(args) == 0:
usage()
sys.exit(0)
if not os.path.exists(args[0]) and not os.path.isdir(args[0]):
usage()
sys.exit(0)
if use_arc:
flags.append('-fobjc-arc')
flags.extend(xcode_framework_pathes())
flags.extend(project_pathes(args[0]))
output_path = ''
if clang_complete:
output_path = os.path.join(args[0], '.clang_complete')
else:
output_path = os.path.join(args[0], '.ycm_extra_conf.py')
if not clang_complete:
flagsstring = 'flags = '
flagsstring += str(flags)
ycm_extra_conf = template.replace('<##FLAGS##>', flagsstring)
os.system('echo "%s" > %s' % (ycm_extra_conf, output_path))
else:
os.system('echo "%s" > %s' % ('\n'.join(flags), output_path))
print
print 'Generate succeed [%s].' % (output_path)
print
if __name__ == '__main__':
main(sys.argv[1:])
@yoyokko
Copy link
Author

yoyokko commented Mar 25, 2014

a python script to generate .ycm_extra_conf.py or .clang_complete for iOS projects which used in vim plugins YouCompleteMe.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment