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. Signed-off-by: Istvan Bisz <istvan.bisz@t-online.hu>
This commit is contained in:
parent
4ccf075d3b
commit
26e6162a82
2 changed files with 208 additions and 0 deletions
|
@ -350,3 +350,11 @@ foreach(boilerplate_lib ${ZEPHYR_INTERFACE_LIBS_PROPERTY})
|
|||
${boilerplate_lib}
|
||||
)
|
||||
endforeach()
|
||||
|
||||
if("${CMAKE_EXTRA_GENERATOR}" STREQUAL "Eclipse CDT4")
|
||||
# Call the amendment function before .project and .cproject generation
|
||||
# C and CXX includes, defines in .cproject without __cplusplus
|
||||
# with project includes and defines
|
||||
include(${ZEPHYR_BASE}/cmake/ide/eclipse_cdt4_generator_amendment.cmake)
|
||||
eclipse_cdt4_generator_amendment(1)
|
||||
endif()
|
||||
|
|
200
cmake/ide/eclipse_cdt4_generator_amendment.cmake
Normal file
200
cmake/ide/eclipse_cdt4_generator_amendment.cmake
Normal file
|
@ -0,0 +1,200 @@
|
|||
# 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} "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n")
|
||||
|
||||
file(APPEND ${OUTPUT_FILE} "<project>\n")
|
||||
file(APPEND ${OUTPUT_FILE} "\t<configuration id=\"org.eclipse.cdt.core.default.config.1\" name=\"Configuration\">\n")
|
||||
file(APPEND ${OUTPUT_FILE} "\t\t<extension point=\"org.eclipse.cdt.core.LanguageSettingsProvider\">\n")
|
||||
file(APPEND ${OUTPUT_FILE} "\t\t\t<provider copy-of=\"extension\" id=\"org.eclipse.cdt.ui.UserLanguageSettingsProvider\"/>\n")
|
||||
file(APPEND ${OUTPUT_FILE} "\t\t\t<provider-reference id=\"org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider\" ref=\"shared-provider\"/>\n")
|
||||
file(APPEND ${OUTPUT_FILE} "\t\t\t<provider-reference id=\"org.eclipse.cdt.core.PathEntryScannerInfoLanguageSettingsProvider\" ref=\"shared-provider\"/>\n")
|
||||
if (${_work_mode} STREQUAL "C and CXX includes, defines in .settings with project defines - [EXPERIMENTAL]")
|
||||
file(APPEND ${OUTPUT_FILE} "\t\t\t<provider class=\"org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector\" console=\"false\" id=\"org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetector\" keep-relative-paths=\"false\" name=\"Zephyr autoconf and SDK Compiler Settings\" parameter=\"${CROSS_COMPILE}\${COMMAND} \${FLAGS} -imacros ${CMAKE_BINARY_DIR}/zephyr/include/generated/cmake_intdef.h -imacros ${AUTOCONF_H} -E -P -v -dD "\${INPUTS}"\" store-entries-with-project=\"true\">\n")
|
||||
else ()
|
||||
file(APPEND ${OUTPUT_FILE} "\t\t\t<provider class=\"org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector\" console=\"false\" id=\"org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetector\" keep-relative-paths=\"false\" name=\"Zephyr autoconf and SDK Compiler Settings\" parameter=\"${CROSS_COMPILE}\${COMMAND} \${FLAGS} -E -P -v -dD "\${INPUTS}"\" store-entries-with-project=\"true\">\n")
|
||||
endif ()
|
||||
file(APPEND ${OUTPUT_FILE} "\t\t\t\t<language-scope id=\"org.eclipse.cdt.core.gcc\"/>\n")
|
||||
file(APPEND ${OUTPUT_FILE} "\t\t\t\t<language-scope id=\"org.eclipse.cdt.core.g++\"/>\n")
|
||||
file(APPEND ${OUTPUT_FILE} "\t\t\t</provider>\n")
|
||||
file(APPEND ${OUTPUT_FILE} "\t\t</extension>\n")
|
||||
file(APPEND ${OUTPUT_FILE} "\t</configuration>\n")
|
||||
file(APPEND ${OUTPUT_FILE} "</project>\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)
|
Loading…
Add table
Add a link
Reference in a new issue