QNX: Introduce QCC compiler id for that QNX platform compiler.
Introduce policy CMP0047 to control resetting the id for compatibility. De-duplicate content in the QNX platform file by including the GNU one. QNX is a form of GNU platform. Do not clear CMAKE_SHARED_LIBRARY_${lang}_FLAGS variables. They are populated again later by the Compiler/GNU.cmake file anyway. Modify the CMAKE_CXX_COMPILE_OBJECT variable only when the QCC compiler id is in use, and the language is CXX. Use the QNX recommended flag for QCC instead of the gcc compatible -x flag. Populate new module files to handle system includes and depfiles when using the QCC compiler. Remove code which unsets the system include and depfiles related variables. When a GNU driver is used instead of the QCC one, the appropriate flags will be used. These variables were previously cleared for lowest-common-denominator compatibility with both drivers.
This commit is contained in:
parent
d2dea79b36
commit
e00db59d6c
|
@ -98,3 +98,4 @@ All Policies
|
||||||
/policy/CMP0044
|
/policy/CMP0044
|
||||||
/policy/CMP0045
|
/policy/CMP0045
|
||||||
/policy/CMP0046
|
/policy/CMP0046
|
||||||
|
/policy/CMP0047
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
CMP0047
|
||||||
|
-------
|
||||||
|
|
||||||
|
Use QCC compiler id for the qcc drivers on QNX.
|
||||||
|
|
||||||
|
CMake 2.8.12 and lower assigned the QNX qcc and QCC compiler drivers the "GNU"
|
||||||
|
compiler id.
|
||||||
|
|
||||||
|
The OLD behavior for this policy is to use the "GNU" compiler id for the qcc
|
||||||
|
and QCC compiler drivers. The NEW behavior for this policy is to use the "QCC"
|
||||||
|
compiler id for those drivers.
|
||||||
|
|
||||||
|
This policy was introduced in CMake version 3.0.0.
|
||||||
|
CMake version |release| warns when the policy is not set and uses
|
||||||
|
OLD behavior. Use the cmake_policy command to set it to OLD or
|
||||||
|
NEW explicitly.
|
|
@ -227,6 +227,10 @@ char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]";
|
||||||
char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]";
|
char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __QNXNTO__
|
||||||
|
char const* qnxnto = "INFO" ":" "qnxnto";
|
||||||
|
#endif
|
||||||
|
|
||||||
@CMAKE_C_COMPILER_ID_PLATFORM_CONTENT@
|
@CMAKE_C_COMPILER_ID_PLATFORM_CONTENT@
|
||||||
@CMAKE_C_COMPILER_ID_ERROR_FOR_TEST@
|
@CMAKE_C_COMPILER_ID_ERROR_FOR_TEST@
|
||||||
|
|
||||||
|
|
|
@ -220,6 +220,10 @@ char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]";
|
||||||
char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]";
|
char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __QNXNTO__
|
||||||
|
char const* qnxnto = "INFO" ":" "qnxnto";
|
||||||
|
#endif
|
||||||
|
|
||||||
@CMAKE_CXX_COMPILER_ID_PLATFORM_CONTENT@
|
@CMAKE_CXX_COMPILER_ID_PLATFORM_CONTENT@
|
||||||
@CMAKE_CXX_COMPILER_ID_ERROR_FOR_TEST@
|
@CMAKE_CXX_COMPILER_ID_ERROR_FOR_TEST@
|
||||||
|
|
||||||
|
|
|
@ -48,6 +48,21 @@ function(CMAKE_DETERMINE_COMPILER_ID lang flagvar src)
|
||||||
CMAKE_DETERMINE_COMPILER_ID_VENDOR(${lang})
|
CMAKE_DETERMINE_COMPILER_ID_VENDOR(${lang})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if (COMPILER_QNXNTO AND CMAKE_${lang}_COMPILER_ID STREQUAL GNU)
|
||||||
|
execute_process(
|
||||||
|
COMMAND "${CMAKE_${lang}_COMPILER}"
|
||||||
|
-V
|
||||||
|
OUTPUT_VARIABLE output ERROR_VARIABLE output
|
||||||
|
RESULT_VARIABLE result
|
||||||
|
TIMEOUT 10
|
||||||
|
)
|
||||||
|
if (output MATCHES "targets available")
|
||||||
|
set(CMAKE_${lang}_COMPILER_ID QCC)
|
||||||
|
# http://community.qnx.com/sf/discussion/do/listPosts/projects.community/discussion.qnx_momentics_community_support.topc3555?_pagenum=2
|
||||||
|
# The qcc driver does not itself have a version.
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
# if the format is unknown after all files have been checked, put "Unknown" in the cache
|
# if the format is unknown after all files have been checked, put "Unknown" in the cache
|
||||||
if(NOT CMAKE_EXECUTABLE_FORMAT)
|
if(NOT CMAKE_EXECUTABLE_FORMAT)
|
||||||
set(CMAKE_EXECUTABLE_FORMAT "Unknown" CACHE INTERNAL "Executable file format")
|
set(CMAKE_EXECUTABLE_FORMAT "Unknown" CACHE INTERNAL "Executable file format")
|
||||||
|
@ -369,6 +384,9 @@ function(CMAKE_DETERMINE_COMPILER_ID_CHECK lang file)
|
||||||
string(REGEX REPLACE "^0+([0-9])" "\\1" SIMULATE_VERSION "${SIMULATE_VERSION}")
|
string(REGEX REPLACE "^0+([0-9])" "\\1" SIMULATE_VERSION "${SIMULATE_VERSION}")
|
||||||
string(REGEX REPLACE "\\.0+([0-9])" ".\\1" SIMULATE_VERSION "${SIMULATE_VERSION}")
|
string(REGEX REPLACE "\\.0+([0-9])" ".\\1" SIMULATE_VERSION "${SIMULATE_VERSION}")
|
||||||
endif()
|
endif()
|
||||||
|
if("${info}" MATCHES ".*INFO:qnxnto")
|
||||||
|
set(COMPILER_QNXNTO 1)
|
||||||
|
endif()
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
# Detect the exact architecture from the PE header.
|
# Detect the exact architecture from the PE header.
|
||||||
|
@ -459,6 +477,7 @@ function(CMAKE_DETERMINE_COMPILER_ID_CHECK lang file)
|
||||||
set(CMAKE_${lang}_SIMULATE_ID "${CMAKE_${lang}_SIMULATE_ID}" PARENT_SCOPE)
|
set(CMAKE_${lang}_SIMULATE_ID "${CMAKE_${lang}_SIMULATE_ID}" PARENT_SCOPE)
|
||||||
set(CMAKE_${lang}_SIMULATE_VERSION "${CMAKE_${lang}_SIMULATE_VERSION}" PARENT_SCOPE)
|
set(CMAKE_${lang}_SIMULATE_VERSION "${CMAKE_${lang}_SIMULATE_VERSION}" PARENT_SCOPE)
|
||||||
set(CMAKE_EXECUTABLE_FORMAT "${CMAKE_EXECUTABLE_FORMAT}" PARENT_SCOPE)
|
set(CMAKE_EXECUTABLE_FORMAT "${CMAKE_EXECUTABLE_FORMAT}" PARENT_SCOPE)
|
||||||
|
set(COMPILER_QNXNTO "${COMPILER_QNXNTO}" PARENT_SCOPE)
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
#-----------------------------------------------------------------------------
|
#-----------------------------------------------------------------------------
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
|
||||||
|
include(Platform/QNX)
|
||||||
|
|
||||||
|
__compiler_qcc(C)
|
|
@ -0,0 +1,4 @@
|
||||||
|
|
||||||
|
include(Platform/QNX)
|
||||||
|
|
||||||
|
__compiler_qcc(CXX)
|
|
@ -1,24 +1,6 @@
|
||||||
set(QNXNTO 1)
|
set(QNXNTO 1)
|
||||||
|
|
||||||
# The QNX GCC does not seem to have -isystem so remove the flag.
|
|
||||||
set(CMAKE_INCLUDE_SYSTEM_FLAG_C)
|
|
||||||
set(CMAKE_INCLUDE_SYSTEM_FLAG_CXX)
|
|
||||||
# ... Nor does the driver support appropriate flags to create depfiles.
|
|
||||||
set(CMAKE_DEPFILE_FLAGS_C)
|
|
||||||
set(CMAKE_DEPFILE_FLAGS_CXX)
|
|
||||||
|
|
||||||
set(CMAKE_DL_LIBS "")
|
set(CMAKE_DL_LIBS "")
|
||||||
set(CMAKE_SHARED_LIBRARY_C_FLAGS "")
|
|
||||||
set(CMAKE_SHARED_LIBRARY_CXX_FLAGS "")
|
|
||||||
set(CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS "-shared")
|
|
||||||
set(CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG "-Wl,-rpath,")
|
|
||||||
set(CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG_SEP ":")
|
|
||||||
set(CMAKE_SHARED_LIBRARY_RPATH_LINK_C_FLAG "-Wl,-rpath-link,")
|
|
||||||
set(CMAKE_SHARED_LIBRARY_SONAME_C_FLAG "-Wl,-soname,")
|
|
||||||
set(CMAKE_EXE_EXPORTS_C_FLAG "-Wl,--export-dynamic")
|
|
||||||
# http://www.qnx.com/developers/docs/6.4.0/neutrino/utilities/q/qcc.html#examples
|
|
||||||
set(CMAKE_C_COMPILE_OPTIONS_TARGET "-V")
|
|
||||||
set(CMAKE_CXX_COMPILE_OPTIONS_TARGET "-V")
|
|
||||||
|
|
||||||
# Shared libraries with no builtin soname may not be linked safely by
|
# Shared libraries with no builtin soname may not be linked safely by
|
||||||
# specifying the file path.
|
# specifying the file path.
|
||||||
|
@ -32,8 +14,22 @@ foreach(type SHARED_LIBRARY SHARED_MODULE EXE)
|
||||||
set(CMAKE_${type}_LINK_STATIC_C_FLAGS "-Wl,-Bstatic")
|
set(CMAKE_${type}_LINK_STATIC_C_FLAGS "-Wl,-Bstatic")
|
||||||
set(CMAKE_${type}_LINK_DYNAMIC_C_FLAGS "-Wl,-Bdynamic")
|
set(CMAKE_${type}_LINK_DYNAMIC_C_FLAGS "-Wl,-Bdynamic")
|
||||||
endforeach()
|
endforeach()
|
||||||
# force the language to be c++ since qnx only has gcc and not g++ and c++?
|
|
||||||
set(CMAKE_CXX_COMPILE_OBJECT
|
|
||||||
"<CMAKE_CXX_COMPILER> -x c++ <DEFINES> <FLAGS> -o <OBJECT> -c <SOURCE>")
|
|
||||||
|
|
||||||
include(Platform/UnixPaths)
|
include(Platform/GNU)
|
||||||
|
unset(CMAKE_LIBRARY_ARCHITECTURE_REGEX)
|
||||||
|
|
||||||
|
macro(__compiler_qcc lang)
|
||||||
|
# http://www.qnx.com/developers/docs/6.4.0/neutrino/utilities/q/qcc.html#examples
|
||||||
|
set(CMAKE_${lang}_COMPILE_OPTIONS_TARGET "-V")
|
||||||
|
|
||||||
|
set(CMAKE_INCLUDE_SYSTEM_FLAG_${lang} "-Wp,-isystem,")
|
||||||
|
set(CMAKE_DEPFILE_FLAGS_${lang} "-Wc,-MMD,<DEPFILE>,-MT,<OBJECT>,-MF,<DEPFILE>")
|
||||||
|
|
||||||
|
if (lang STREQUAL CXX)
|
||||||
|
# If the toolchain uses qcc for CMAKE_CXX_COMPILER instead of QCC, the
|
||||||
|
# default for the driver is not c++.
|
||||||
|
set(CMAKE_CXX_COMPILE_OBJECT
|
||||||
|
"<CMAKE_CXX_COMPILER> -lang-c++ <DEFINES> <FLAGS> -o <OBJECT> -c <SOURCE>")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
endmacro()
|
||||||
|
|
|
@ -748,7 +748,12 @@ void cmGlobalGenerator::CheckCompilerIdCompatibility(cmMakefile* mf,
|
||||||
{
|
{
|
||||||
std::string compilerIdVar = "CMAKE_" + lang + "_COMPILER_ID";
|
std::string compilerIdVar = "CMAKE_" + lang + "_COMPILER_ID";
|
||||||
const char* compilerId = mf->GetDefinition(compilerIdVar.c_str());
|
const char* compilerId = mf->GetDefinition(compilerIdVar.c_str());
|
||||||
if(compilerId && strcmp(compilerId, "AppleClang") == 0)
|
if(!compilerId)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(strcmp(compilerId, "AppleClang") == 0)
|
||||||
{
|
{
|
||||||
cmPolicies* policies = this->CMakeInstance->GetPolicies();
|
cmPolicies* policies = this->CMakeInstance->GetPolicies();
|
||||||
switch(mf->GetPolicyStatus(cmPolicies::CMP0025))
|
switch(mf->GetPolicyStatus(cmPolicies::CMP0025))
|
||||||
|
@ -778,6 +783,37 @@ void cmGlobalGenerator::CheckCompilerIdCompatibility(cmMakefile* mf,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(strcmp(compilerId, "QCC") == 0)
|
||||||
|
{
|
||||||
|
cmPolicies* policies = this->CMakeInstance->GetPolicies();
|
||||||
|
switch(mf->GetPolicyStatus(cmPolicies::CMP0047))
|
||||||
|
{
|
||||||
|
case cmPolicies::WARN:
|
||||||
|
if(!this->CMakeInstance->GetIsInTryCompile())
|
||||||
|
{
|
||||||
|
cmOStringStream w;
|
||||||
|
w << policies->GetPolicyWarning(cmPolicies::CMP0047) << "\n"
|
||||||
|
"Converting " << lang <<
|
||||||
|
" compiler id \"QCC\" to \"GNU\" for compatibility."
|
||||||
|
;
|
||||||
|
mf->IssueMessage(cmake::AUTHOR_WARNING, w.str());
|
||||||
|
}
|
||||||
|
case cmPolicies::OLD:
|
||||||
|
// OLD behavior is to convert QCC to GNU.
|
||||||
|
mf->AddDefinition(compilerIdVar.c_str(), "GNU");
|
||||||
|
break;
|
||||||
|
case cmPolicies::REQUIRED_IF_USED:
|
||||||
|
case cmPolicies::REQUIRED_ALWAYS:
|
||||||
|
mf->IssueMessage(
|
||||||
|
cmake::FATAL_ERROR,
|
||||||
|
policies->GetRequiredPolicyError(cmPolicies::CMP0047)
|
||||||
|
);
|
||||||
|
case cmPolicies::NEW:
|
||||||
|
// NEW behavior is to keep QCC.
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
|
|
|
@ -336,6 +336,11 @@ cmPolicies::cmPolicies()
|
||||||
CMP0046, "CMP0046",
|
CMP0046, "CMP0046",
|
||||||
"Error on non-existent dependency in add_dependencies.",
|
"Error on non-existent dependency in add_dependencies.",
|
||||||
3,0,0,0, cmPolicies::WARN);
|
3,0,0,0, cmPolicies::WARN);
|
||||||
|
|
||||||
|
this->DefinePolicy(
|
||||||
|
CMP0047, "CMP0047",
|
||||||
|
"Use QCC compiler id for the qcc drivers on QNX.",
|
||||||
|
3,0,0,0, cmPolicies::WARN);
|
||||||
}
|
}
|
||||||
|
|
||||||
cmPolicies::~cmPolicies()
|
cmPolicies::~cmPolicies()
|
||||||
|
|
|
@ -100,6 +100,7 @@ public:
|
||||||
CMP0044, ///< Case sensitive <LANG>_COMPILER_ID generator expressions
|
CMP0044, ///< Case sensitive <LANG>_COMPILER_ID generator expressions
|
||||||
CMP0045, ///< Error on non-existent target in get_target_property
|
CMP0045, ///< Error on non-existent target in get_target_property
|
||||||
CMP0046, ///< Error on non-existent dependency in add_dependencies
|
CMP0046, ///< Error on non-existent dependency in add_dependencies
|
||||||
|
CMP0047, ///< Use QCC compiler id for the qcc drivers on QNX.
|
||||||
|
|
||||||
/** \brief Always the last entry.
|
/** \brief Always the last entry.
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in New Issue