Skip to content
  • skelly-energid's avatar
    QNX: Add support for CMAKE_SYSROOT · 32a6ab1f
    skelly-energid authored and Brad King's avatar Brad King committed
    QCC is a wrapper around GCC, but it is not a fully transparent wrapper.
    Some compile options need to be passed to GCC using a `-Wc` option.
    
    QCC does not support --sysroot, so setting CMAKE_SYSROOT in a toolchain
    file currently does not work.  This means that it is likely that no one
    is setting CMAKE_SYSROOT in existing QNC toolchain files.  Override the
    GCC option for sysroot in the QCC.cmake file with -Wc,-isysroot.
    
    This exposes a further issue in that the QNX SDK does not follow the
    same architectural folder structure as linux uses.  That is, on linux
    systems, architecture-specific libraries might be in
    
        <sysroot>/usr/lib/<arch>
    
    such as
    
        /usr/lib/x86_64-linux-gnu/libcurl.so
    
    CMake models this by suffixing the <arch> onto lib directories when
    searching for libraries.
    
    The QNX SDK is structured differently such that the <arch> should be
    used as a prefix:
    
        <sysroot>/<arch>/usr/lib
    
    such as
    
        <sysroot>/x86_64/usr/lib/libcurl.so
    
    Add a variable for platform configuration to set whether to prefix or
    suffix the <arch> and set that in the QCC.cmake.
    
    Use the directory structure of the QNX SDK to compute the <arch> from
    the implicit library directories.  The assumption is that the arch will
    be a single directory directly below the CMAKE_SYSROOT, below which the
    usr/ prefix occurs.
    
    It would not be appropriate to instruct users to make the <arch> part of
    the sysroot when specified in the toolchain file because:
    
    1.  That would be non-DRY - The QCC wrapper already determines the <arch>
        by the -V argument passed to the compiler, specified in the toolchain
        file as the CMAKE_C_COMPILER_TARGET variable.
    2.  The includes in the QNX SDK are not below the <arch> directory.
    
    So, the location of the <arch> in the full path is different on QNX
    compared to, say an embedded linux platform, but the intent is the same.
    
    Add documentation to recommend the use of CMAKE_SYSROOT in a QNX
    toolchain file.
    
    As the CMAKE_SYSROOT is always the same for QNX, it would be possible to
    simply set it in QCC.cmake.  However, that would change behavior for
    existing users as when CMAKE_SYSROOT is set, files/paths outside of the
    CMAKE_SYSROOT do not get found.
    
    The <arch> prefixing is only enabled in cmSearchPath.cxx if
    CMAKE_SYSROOT is set.  This ensures that the user gets consistency in
    the current state without CMAKE_SYSROOT, and gets better consistency
    when using CMAKE_SYSROOT.
    32a6ab1f