[OE-core] [PATCH] cmake.bbclass: pass mandatory compiler flags through CMAKE_<LANG>_COMPILER_ARG1

Nikolai Merinov n.merinov at inango-systems.com
Wed May 15 09:19:39 UTC 2019


Hi Pascal,

I very often saw in proprietary projects the following code

> set(CMAKE_C_FLAGS "list of flags that developer want to add")

where package developer overwrite default CMAKE_C_FLAGS or CMAKE_CXX_FLAGS variables.

There are several examples from github: 
https://github.com/psi4/psi4archive/blob/1.0.x/cmake/compilers/CFlags.cmake
https://github.com/eloraiby/dna-cross-platform/blob/master/src/DNA/native/CMakeLists.txt
https://github.com/JWZepf/bfsdk/blob/master/cmake/CMakeFlags_Native_GCC.txt
https://github.com/redcurrant/metacd-http/blob/master/CMakeLists.txt
https://github.com/HabanaAI/hl-thunk/blob/master/CMakeLists.txt
https://github.com/chrisz/librain/blob/master/CMakeLists.txt
https://github.com/chrishoen/Dev_RisLibLx/blob/master/CMakeLists.txt
https://github.com/Farigh/yasc/blob/master/config/GccCompileOptions.cmake

I suggest my changes in order to reduce risk of failure with such CMake projects.

In same time suggested changes will logically tie this flags to the compiler in same manner as it tied in the CC and CXX variables.

Regards,
Nikolai

----- Original Message -----
From: "Bach, Pascal" <pascal.bach at siemens.com>
To: "n merinov" <n.merinov at inango-systems.com>, openembedded-core at lists.openembedded.org
Sent: Tuesday, May 14, 2019 8:49:57 PM
Subject: RE: [OE-core] [PATCH] cmake.bbclass: pass mandatory compiler flags	through CMAKE_<LANG>_COMPILER_ARG1

Hi Nikolai,

I think this would work. However I would like to understand the problem you are trying to solve with this.
Do you have an example of a recipe this would be needed?

Pascal

> -----Original Message-----
> From: openembedded-core-bounces at lists.openembedded.org
> <openembedded-core-bounces at lists.openembedded.org> On Behalf Of
> Nikolai Merinov
> Sent: Dienstag, 14. Mai 2019 17:04
> To: openembedded-core at lists.openembedded.org
> Subject: [OE-core] [PATCH] cmake.bbclass: pass mandatory compiler flags
> through CMAKE_<LANG>_COMPILER_ARG1
> 
> The CMake takes mandatory compiler arguments from the following
> variables:
> - CMAKE_SYSROOT -- path to sysroot that should be passed to compiler.
> - CMAKE_<LANG>_COMPILER_TARGET -- target architecture, used for
> compilers
>   that supports several targets through command line options.
>   e.g. "clang --target ${CMAKE_C_COMPILER_TARGET}".
> - CMAKE_<LANG>_COMPILER_EXTERNAL_TOOLCHAIN -- path to external
> toolchain,
>   used for compilers that support build with external toolchain.
>   e.g. "clang --gcc-toolchain
> ${CMAKE_C_COMPILER_EXTERNAL_TOOLCHAIN}".
> - CMAKE_<LANG>_COMPILER_ARG1 -- other mandatory arguments to a
> compiler
>   command.
> 
> CMAKE_<LANG>_COMPILER_ARG1 is the most suitable variable to pass
> mandatory arguments, that belongs to CC variable with other build systems,
> to a compiler.
> 
> Additionally usage of CMAKE_<LANG>_COMPILER_ARG1 instead of
> CMAKE_<LANG>_FLAGS reduce the risk that a variable can be overrided by
> CMakeLists.txt files.
> ---
>  meta/classes/cmake.bbclass | 21 +++++++++++++++------
>  1 file changed, 15 insertions(+), 6 deletions(-)
> 
> diff --git a/meta/classes/cmake.bbclass b/meta/classes/cmake.bbclass index
> d3f0d70847..4da4c00a09 100644
> --- a/meta/classes/cmake.bbclass
> +++ b/meta/classes/cmake.bbclass
> @@ -27,27 +27,33 @@ python() {
>          cc_list = d.getVar('CC').split()
>          if cc_list[0] == 'ccache':
>              d.setVar('OECMAKE_C_COMPILER', '%s %s' % (cc_list[0], cc_list[1]))
> +            cc_arg1 = ' '.join(cc_list[2:])
>          else:
>              d.setVar('OECMAKE_C_COMPILER', cc_list[0])
> +            cc_arg1 = ' '.join(cc_list[1:])
> +        if not d.getVar('OECMAKE_C_COMPILER_ARG1'):
> +            d.setVar('OECMAKE_C_COMPILER_ARG1', cc_arg1)
> 
>      if not d.getVar('OECMAKE_CXX_COMPILER'):
>          cxx_list = d.getVar('CXX').split()
>          if cxx_list[0] == 'ccache':
>              d.setVar('OECMAKE_CXX_COMPILER', '%s %s' % (cxx_list[0],
> cxx_list[1]))
> +            cxx_arg1 = ' '.join(cxx_list[2:])
>          else:
>              d.setVar('OECMAKE_CXX_COMPILER', cxx_list[0])
> +            cxx_arg1 = ' '.join(cxx_list[1:])
> +        if not d.getVar('OECMAKE_CXX_COMPILER_ARG1'):
> +            d.setVar('OECMAKE_CXX_COMPILER_ARG1', cxx_arg1)
>  }
>  OECMAKE_AR ?= "${AR}"
> 
>  # Compiler flags
> -OECMAKE_C_FLAGS ?= "${HOST_CC_ARCH} ${TOOLCHAIN_OPTIONS}
> ${CFLAGS}"
> -OECMAKE_CXX_FLAGS ?= "${HOST_CC_ARCH} ${TOOLCHAIN_OPTIONS}
> ${CXXFLAGS}"
> +OECMAKE_C_FLAGS ?= "${CFLAGS}"
> +OECMAKE_CXX_FLAGS ?= "${CXXFLAGS}"
>  OECMAKE_C_FLAGS_RELEASE ?= "-DNDEBUG"
>  OECMAKE_CXX_FLAGS_RELEASE ?= "-DNDEBUG"
> -OECMAKE_C_LINK_FLAGS ?= "${HOST_CC_ARCH} ${TOOLCHAIN_OPTIONS}
> ${CPPFLAGS} ${LDFLAGS}"
> -OECMAKE_CXX_LINK_FLAGS ?= "${HOST_CC_ARCH}
> ${TOOLCHAIN_OPTIONS} ${CXXFLAGS} ${LDFLAGS}"
> -CXXFLAGS += "${HOST_CC_ARCH} ${TOOLCHAIN_OPTIONS}"
> -CFLAGS += "${HOST_CC_ARCH} ${TOOLCHAIN_OPTIONS}"
> +OECMAKE_C_LINK_FLAGS ?= "${CPPFLAGS} ${LDFLAGS}"
> +OECMAKE_CXX_LINK_FLAGS ?= "${CXXFLAGS} ${LDFLAGS}"
> 
>  OECMAKE_RPATH ?= ""
>  OECMAKE_PERLNATIVE_DIR ??= ""
> @@ -85,8 +91,11 @@ $cmake_crosscompiling  set( CMAKE_SYSTEM_NAME
> `echo ${TARGET_OS} | sed -e 's/^./\u&/' -e 's/^\(Linux\).*/\1/'` )  set(
> CMAKE_SYSTEM_PROCESSOR
> ${@map_target_arch_to_uname_arch(d.getVar('TARGET_ARCH'))} )  set(
> CMAKE_C_COMPILER ${OECMAKE_C_COMPILER} )
> +set( CMAKE_C_COMPILER_ARG1 "${OECMAKE_C_COMPILER_ARG1}" )
>  set( CMAKE_CXX_COMPILER ${OECMAKE_CXX_COMPILER} )
> +set( CMAKE_CXX_COMPILER_ARG1 "${OECMAKE_CXX_COMPILER_ARG1}"
> )
>  set( CMAKE_ASM_COMPILER ${OECMAKE_C_COMPILER} )
> +set( CMAKE_ASM_COMPILER_ARG1 "${OECMAKE_C_COMPILER_ARG1}" )
>  set( CMAKE_AR ${OECMAKE_AR} CACHE FILEPATH "Archiver" )  set(
> CMAKE_C_FLAGS "${OECMAKE_C_FLAGS}" CACHE STRING "CFLAGS" )  set(
> CMAKE_CXX_FLAGS "${OECMAKE_CXX_FLAGS}" CACHE STRING "CXXFLAGS"
> )
> --
> 2.17.1
> 
> --
> _______________________________________________
> Openembedded-core mailing list
> Openembedded-core at lists.openembedded.org
> http://lists.openembedded.org/mailman/listinfo/openembedded-core


More information about the Openembedded-core mailing list