# SPDX-License-Identifier: Apache-2.0 # cmake: Eclipse CDT4 generator amendment # #1. The generator handles just the COMPILE_DEFINITIONS. # (See: __ZEPHYR_SUPERVISOR__) # For the defines in INTERFACE_COMPILE_DEFINITIONS # a special handling is necessary. # # Solution: # The amendment function generates a macro header file # ${CMAKE_BINARY_DIR}/zephyr/include/generated/cmake_intdef.h # based on INTERFACE_COMPILE_DEFINITIONS and appends the # defines from the file to # CMAKE_EXTRA_GENERATOR_C_SYSTEM_DEFINED_MACROS. # #2. Eclipse CDT4 indexer has problems with CMake 'Eclipse CDT4 - x' # generator projects that use mixed C/C++. # The Eclipse CDT4 indexer is showing a lot of unresolved symbol # errors, when the project was created with CMake generator and # the code is a mix of C and C++. # The root cause of the problem is the g++ built-in __cplusplus macro, # that is passed by CMake generator in the '.cproject' file. # The defines in '.cproject' are always the same for C and C++. # In mixed C/C++ projects, the header files often contain the following # lines to let C++ code call the C functions: # # #ifdef __cplusplus # extern "C" { # #endif # # < header content > # # #ifdef __cplusplus # } # #endif # # Whenever the Eclipse CDT4 indexer compiles the code for # code analysis, it has the macro __cplusplus set, # independent of whether standard C or C++ source files are compiled. # The 'extern "C"' confuses the standard C compilation and the indexer # is messed up. # # Solution: # The amendment function deletes the __cplusplus entry from # CMAKE_EXTRA_GENERATOR_CXX_SYSTEM_DEFINED_MACROS. # #3. The amendment function appends the defines from # ${CMAKE_BINARY_DIR}/zephyr/include/generated/autoconf.h to # CMAKE_EXTRA_GENERATOR_C_SYSTEM_DEFINED_MACROS. # function(eclipse_cdt4_generator_amendment _param_defs) # # _param_defs handled values: # # 1 - work mode: "C and CXX includes, defines in .cproject without __cplusplus" # 2 - work mode: "C and CXX includes, defines in .cproject with __cplusplus" # 5 - work mode: "C and CXX includes, defines in Eclipse with project defines" # # In any other case, # the C and CXX includes, defines setting in Eclipse is the user task. # ## EXPERIMENTAL: ## 3 - work mode: "C and CXX includes, defines in .settings - [EXPERIMENTAL]" ## 4 - work mode: "C and CXX includes, defines in .settings with project defines - [EXPERIMENTAL]" # message(" Eclipse CDT4 generator amendment mode:") if (${_param_defs} EQUAL 1) set(_work_mode "C and CXX includes, defines in .cproject without __cplusplus") message(" ${_work_mode}") message(" with project includes and defines") elseif (${_param_defs} EQUAL 2) set(_work_mode "C and CXX includes, defines in .cproject with __cplusplus") message(" ${_work_mode}") message(" with project includes and defines") #elseif (${_param_defs} EQUAL 3) # set(_work_mode "C and CXX includes, defines in .settings - [EXPERIMENTAL]") # message(" ${_work_mode}") # message(" without project defines") #elseif (${_param_defs} EQUAL 4) # set(_work_mode "C and CXX includes, defines in .settings with project defines - [EXPERIMENTAL]") # message(" ${_work_mode}") elseif (${_param_defs} EQUAL 5) set(_work_mode "C and CXX includes, defines in Eclipse with project defines") message(" ${_work_mode}") else(${_param_defs} EQUAL 1) set(_work_mode "C and CXX includes, defines setting in Eclipse is the user task") message(" ${_work_mode}") endif(${_param_defs} EQUAL 1) set(OUTPUT_FILE ${CMAKE_BINARY_DIR}/zephyr/include/generated/cmake_intdef.h) file(WRITE ${OUTPUT_FILE} "/* Generated by eclipse_cd4_generator_amendment.cmake */\n") file(APPEND ${OUTPUT_FILE} "/* The header contains the defines collected from the */\n") file(APPEND ${OUTPUT_FILE} "/* INTERFACE_COMPILE_DEFINITIONS target property */\n") file(APPEND ${OUTPUT_FILE} "/* corresponding to zephyr_interface */\n") get_target_property(_int_comp_def zephyr_interface INTERFACE_COMPILE_DEFINITIONS) foreach( d ${_int_comp_def} ) string(REGEX MATCH "([A-Za-z_][A-Za-z0-9_]*) *=* *(.*) *$" _dummy "${d}") file(APPEND ${OUTPUT_FILE} "#define ${CMAKE_MATCH_1} ${CMAKE_MATCH_2}\n") endforeach() if (${_work_mode} STREQUAL "C and CXX includes, defines in Eclipse with project defines") message("") message(" -------------------------------------------------------------------------") message(" Add the following two command line parameters:") message("") message(" -imacros ${CMAKE_BINARY_DIR}/zephyr/include/generated/cmake_intdef.h") message(" -imacros ${AUTOCONF_H}") message("") message(" to 'CDT cross GCC Built-in Compiler Settings' provider command definition") message(" -------------------------------------------------------------------------") message("") endif() if ( (${_work_mode} STREQUAL "C and CXX includes, defines in .settings - [EXPERIMENTAL]") OR (${_work_mode} STREQUAL "C and CXX includes, defines in .settings with project defines - [EXPERIMENTAL]") ) set(OUTPUT_FILE ${CMAKE_BINARY_DIR}/.settings/language.settings.xml) file(WRITE ${OUTPUT_FILE} "\n") file(APPEND ${OUTPUT_FILE} "\n") file(APPEND ${OUTPUT_FILE} "\t\n") file(APPEND ${OUTPUT_FILE} "\t\t\n") file(APPEND ${OUTPUT_FILE} "\t\t\t\n") file(APPEND ${OUTPUT_FILE} "\t\t\t\n") file(APPEND ${OUTPUT_FILE} "\t\t\t\n") if (${_work_mode} STREQUAL "C and CXX includes, defines in .settings with project defines - [EXPERIMENTAL]") file(APPEND ${OUTPUT_FILE} "\t\t\t\n") else () file(APPEND ${OUTPUT_FILE} "\t\t\t\n") endif () file(APPEND ${OUTPUT_FILE} "\t\t\t\t\n") file(APPEND ${OUTPUT_FILE} "\t\t\t\t\n") file(APPEND ${OUTPUT_FILE} "\t\t\t\n") file(APPEND ${OUTPUT_FILE} "\t\t\n") file(APPEND ${OUTPUT_FILE} "\t\n") file(APPEND ${OUTPUT_FILE} "\n") endif () if ( (${_work_mode} STREQUAL "C and CXX includes, defines in .cproject without __cplusplus") OR (${_work_mode} STREQUAL "C and CXX includes, defines in .cproject with __cplusplus") OR (${_work_mode} STREQUAL "C and CXX includes, defines in .settings - [EXPERIMENTAL]") ) if ( (${_work_mode} STREQUAL "C and CXX includes, defines in .cproject without __cplusplus") OR (${_work_mode} STREQUAL "C and CXX includes, defines in .cproject with __cplusplus") ) if (${_work_mode} STREQUAL "C and CXX includes, defines in .cproject without __cplusplus") # Delete __cplusplus define set(TEMP_VAR "${CMAKE_EXTRA_GENERATOR_CXX_SYSTEM_DEFINED_MACROS}") STRING(REGEX REPLACE "__cplusplus;.*;" "" TEMP_VAR "${TEMP_VAR}") set(CMAKE_EXTRA_GENERATOR_CXX_SYSTEM_DEFINED_MACROS "${TEMP_VAR}" CACHE INTERNAL "CXX compiler system defined macros") endif() else() # Wiping C compiler system defined macros and include directories if (CMAKE_C_COMPILER_ID MATCHES GNU) set(CMAKE_EXTRA_GENERATOR_C_SYSTEM_INCLUDE_DIRS "" CACHE INTERNAL "C compiler system include directories") set(CMAKE_EXTRA_GENERATOR_C_SYSTEM_DEFINED_MACROS "" CACHE INTERNAL "C compiler system defined macros") endif () # Wiping CXX compiler system defined macros and include directories if ("${CMAKE_CXX_COMPILER_ID}" MATCHES GNU) set(CMAKE_EXTRA_GENERATOR_CXX_SYSTEM_INCLUDE_DIRS "" CACHE INTERNAL "CXX compiler system include directories") set(CMAKE_EXTRA_GENERATOR_CXX_SYSTEM_DEFINED_MACROS "" CACHE INTERNAL "CXX compiler system defined macros") endif () endif() file(STRINGS ${CMAKE_BINARY_DIR}/zephyr/include/generated/cmake_intdef.h _int_comp_def) set (_resultDefines "${CMAKE_EXTRA_GENERATOR_C_SYSTEM_DEFINED_MACROS}") foreach( d ${_int_comp_def} ) string(REGEX MATCH "^#define +([A-Za-z_][A-Za-z0-9_]*) *(.*) *$" _dummy "${d}") if (NOT ("${CMAKE_MATCH_1}" STREQUAL "") ) list(APPEND _resultDefines "${CMAKE_MATCH_1}") if ("${CMAKE_MATCH_2}" STREQUAL "") list(APPEND _resultDefines "") else() list(APPEND _resultDefines "${CMAKE_MATCH_2}") endif() endif() endforeach() set (CMAKE_EXTRA_GENERATOR_C_SYSTEM_DEFINED_MACROS "${_resultDefines}" CACHE INTERNAL "C compiler system defined macros") file(STRINGS ${AUTOCONF_H} _auto_conf) set (_resultDefines "${CMAKE_EXTRA_GENERATOR_C_SYSTEM_DEFINED_MACROS}") foreach( d ${_auto_conf} ) string(REGEX MATCH "^#define +([A-Za-z_][A-Za-z0-9_]*) *(.*) *$" _dummy "${d}") if (NOT ("${CMAKE_MATCH_1}" STREQUAL "") ) list(APPEND _resultDefines "${CMAKE_MATCH_1}") if ("${CMAKE_MATCH_2}" STREQUAL "") list(APPEND _resultDefines " ") else() list(APPEND _resultDefines "${CMAKE_MATCH_2}") endif() endif() endforeach() set (CMAKE_EXTRA_GENERATOR_C_SYSTEM_DEFINED_MACROS "${_resultDefines}" CACHE INTERNAL "C compiler system defined macros") endif() endfunction(eclipse_cdt4_generator_amendment _param_defs)