Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@doragasu
Last active March 13, 2021 08:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save doragasu/0c433769b7f49fbe89ca0d42f29ca03e to your computer and use it in GitHub Desktop.
Save doragasu/0c433769b7f49fbe89ca0d42f29ca03e to your computer and use it in GitHub Desktop.
from distutils.sysconfig import get_python_inc
import platform
import os.path as p
import os
import subprocess
DIR_OF_THIS_SCRIPT = p.abspath( p.dirname( __file__ ) )
DIR_OF_THIRD_PARTY = p.join( DIR_OF_THIS_SCRIPT, 'third_party' )
DIR_OF_WATCHDOG_DEPS = p.join( DIR_OF_THIRD_PARTY, 'watchdog_deps' )
SOURCE_EXTENSIONS = [ '.cpp', '.cxx', '.cc', '.c', '.m', '.mm' ]
HOME = os.environ['HOME']
GCC_PATH = HOME + '/.espressif/tools/xtensa-esp32-elf/esp-2020r3-8.4.0/xtensa-esp32-elf'
IDF_PATH = HOME + '/dev/esp-idf'
database = None
# 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 = [
'-DCONFIGURED',
'-DHAVE_WEAK_SYMBOLS',
'-DMBEDTLS_CONFIG_FILE="mbedtls/esp_config.h"',
'-DNATIVE_LITTLE_ENDIAN',
'-D__STDC_CONSTANT_MACROS',
'-D__STDC_LIMIT_MACROS',
'-DSSIZE_MAX=2147483647',
'-nostdinc',
'-isystem', GCC_PATH + '/lib/gcc/xtensa-esp32-elf/8.4.0/include',
'-isystem', GCC_PATH + '/lib/gcc/xtensa-esp32-elf/8.4.0/include-fixed',
'-isystem', GCC_PATH + '/xtensa-esp32-elf/include',
'-I' + DIR_OF_THIS_SCRIPT + '/build/config',
'-I' + IDF_PATH + '/components/libsodium/libsodium/src/libsodium/include',
'-I' + IDF_PATH + '/components/libsodium/port_include',
'-I' + IDF_PATH + '/components/libsodium/libsodium/src/libsodium/include/sodium',
'-I' + IDF_PATH + '/components/libsodium/port_include/sodium',
'-I' + IDF_PATH + '/components/libsodium/port',
'-I' + IDF_PATH + '/components/newlib/platform_include',
'-I' + IDF_PATH + '/components/freertos/include',
'-I' + IDF_PATH + '/components/freertos/xtensa/include',
'-I' + IDF_PATH + '/components/heap/include',
'-I' + IDF_PATH + '/components/log/include',
'-I' + IDF_PATH + '/components/lwip/include/apps',
'-I' + IDF_PATH + '/components/lwip/include/apps/sntp',
'-I' + IDF_PATH + '/components/lwip/lwip/src/include',
'-I' + IDF_PATH + '/components/lwip/port/esp32/include',
'-I' + IDF_PATH + '/components/lwip/port/esp32/include/arch',
'-I' + IDF_PATH + '/components/soc/src/esp32/.',
'-I' + IDF_PATH + '/components/soc/src/esp32/include',
'-I' + IDF_PATH + '/components/soc/include',
'-I' + IDF_PATH + '/components/esp_rom/include',
'-I' + IDF_PATH + '/components/esp_common/include',
'-I' + IDF_PATH + '/components/esp_system/include',
'-I' + IDF_PATH + '/components/xtensa/include',
'-I' + IDF_PATH + '/components/xtensa/esp32/include',
'-I' + IDF_PATH + '/components/esp32/include',
'-I' + IDF_PATH + '/components/driver/include',
'-I' + IDF_PATH + '/components/driver/esp32/include',
'-I' + IDF_PATH + '/components/esp_ringbuf/include',
'-I' + IDF_PATH + '/components/efuse/include',
'-I' + IDF_PATH + '/components/efuse/esp32/include',
'-I' + IDF_PATH + '/components/espcoredump/include',
'-I' + IDF_PATH + '/components/esp_timer/include',
'-I' + IDF_PATH + '/components/esp_ipc/include',
'-I' + IDF_PATH + '/components/soc/soc/esp32/include',
'-I' + IDF_PATH + '/components/soc/soc/esp32/../include',
'-I' + IDF_PATH + '/components/soc/soc/esp32/private_include',
'-I' + IDF_PATH + '/components/vfs/include',
'-I' + IDF_PATH + '/components/esp_wifi/include',
'-I' + IDF_PATH + '/components/esp_wifi/esp32/include',
'-I' + IDF_PATH + '/components/esp_event/include',
'-I' + IDF_PATH + '/components/esp_netif/include',
'-I' + IDF_PATH + '/components/esp_eth/include',
'-I' + IDF_PATH + '/components/tcpip_adapter/include',
'-I' + IDF_PATH + '/components/app_trace/include',
'-I' + IDF_PATH + '/components/mbedtls/port/include',
'-I' + IDF_PATH + '/components/mbedtls/mbedtls/include',
'-I' + IDF_PATH + '/components/mbedtls/esp_crt_bundle/include',
'-I' + IDF_PATH + '/components/nvs_flash/include',
'-I' + IDF_PATH + '/components/spi_flash/include',
'-I' + IDF_PATH + '/components/esp_http_client/include',
'-I' + IDF_PATH + '/components/nghttp/port/include',
'-I' + IDF_PATH + '/components/json/cJSON',
'-I' + DIR_OF_THIS_SCRIPT + '/components/bate',
'-I' + DIR_OF_THIS_SCRIPT + '/components/esp32-camera/driver/include',
'-I' + DIR_OF_THIS_SCRIPT + '/components/esp32-camera/conversions/include',
'-I' + DIR_OF_THIS_SCRIPT + '/components/tarablessd1306',
'-mlong-calls',
'-Wno-frame-address',
'-Wall',
'-Wno-error=unused-function',
'-Wno-error=unused-but-set-variable',
'-Wno-error=unused-variable',
'-Wno-error=deprecated-declarations',
'-Wextra',
'-Wno-unused-parameter',
'-Wno-sign-compare',
'-ggdb',
'-std=gnu99',
'-Wno-old-style-declaration',
'-D_GNU_SOURCE',
'-DIDF_VER="v4.2"',
'-DESP_PLATFORM',
]
# 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
#
# You can get CMake to generate this file for you by adding:
# set( CMAKE_EXPORT_COMPILE_COMMANDS 1 )
# to your CMakeLists.txt file.
#
# 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 = ''
def IsHeaderFile( filename ):
extension = p.splitext( filename )[ 1 ]
return extension in [ '.h', '.hxx', '.hpp', '.hh' ]
def FindCorrespondingSourceFile( filename ):
if IsHeaderFile( filename ):
basename = p.splitext( filename )[ 0 ]
for extension in SOURCE_EXTENSIONS:
replacement_file = basename + extension
if p.exists( replacement_file ):
return replacement_file
return filename
def PathToPythonUsedDuringBuild():
try:
filepath = p.join( DIR_OF_THIS_SCRIPT, 'PYTHON_USED_DURING_BUILDING' )
with open( filepath ) as f:
return f.read().strip()
except OSError:
return None
def Settings( **kwargs ):
# Do NOT import ycm_core at module scope.
import ycm_core
global database
if database is None and p.exists( compilation_database_folder ):
database = ycm_core.CompilationDatabase( compilation_database_folder )
language = kwargs[ 'language' ]
if language == 'cfamily':
# If the file is a header, try to find the corresponding source file and
# retrieve its flags from the compilation database if using one. This is
# necessary since compilation databases don't have entries for header files.
# In addition, use this source file as the translation unit. This makes it
# possible to jump from a declaration in the header file to its definition
# in the corresponding source file.
filename = FindCorrespondingSourceFile( kwargs[ 'filename' ] )
if not database:
return {
'flags': flags,
'include_paths_relative_to_dir': DIR_OF_THIS_SCRIPT,
'override_filename': filename
}
compilation_info = database.GetCompilationInfoForFile( filename )
if not compilation_info.compiler_flags_:
return {}
# Bear in mind that compilation_info.compiler_flags_ does NOT return a
# python list, but a "list-like" StringVec object.
final_flags = list( compilation_info.compiler_flags_ )
# NOTE: This is just for YouCompleteMe; it's highly likely that your project
# does NOT need to remove the stdlib flag. DO NOT USE THIS IN YOUR
# ycm_extra_conf IF YOU'RE NOT 100% SURE YOU NEED IT.
try:
final_flags.remove( '-stdlib=libc++' )
except ValueError:
pass
return {
'flags': final_flags,
'include_paths_relative_to_dir': compilation_info.compiler_working_dir_,
'override_filename': filename
}
if language == 'python':
return {
'interpreter_path': PathToPythonUsedDuringBuild()
}
return {}
def PythonSysPath( **kwargs ):
sys_path = kwargs[ 'sys_path' ]
interpreter_path = kwargs[ 'interpreter_path' ]
major_version = subprocess.check_output( [
interpreter_path, '-c', 'import sys; print( sys.version_info[ 0 ] )' ]
).rstrip().decode( 'utf8' )
sys_path[ 0:0 ] = [ p.join( DIR_OF_THIS_SCRIPT ),
p.join( DIR_OF_THIRD_PARTY, 'bottle' ),
p.join( DIR_OF_THIRD_PARTY, 'regex-build' ),
p.join( DIR_OF_THIRD_PARTY, 'frozendict' ),
p.join( DIR_OF_THIRD_PARTY, 'jedi_deps', 'jedi' ),
p.join( DIR_OF_THIRD_PARTY, 'jedi_deps', 'parso' ),
p.join( DIR_OF_THIRD_PARTY, 'requests_deps', 'requests' ),
p.join( DIR_OF_THIRD_PARTY, 'requests_deps',
'urllib3',
'src' ),
p.join( DIR_OF_THIRD_PARTY, 'requests_deps',
'chardet' ),
p.join( DIR_OF_THIRD_PARTY, 'requests_deps',
'certifi' ),
p.join( DIR_OF_THIRD_PARTY, 'requests_deps',
'idna' ),
p.join( DIR_OF_WATCHDOG_DEPS, 'watchdog', 'build', 'lib3' ),
p.join( DIR_OF_WATCHDOG_DEPS, 'pathtools' ),
p.join( DIR_OF_THIRD_PARTY, 'waitress' ) ]
sys_path.append( p.join( DIR_OF_THIRD_PARTY, 'jedi_deps', 'numpydoc' ) )
return sys_path
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment