Skip to content

testing/install removes -Werror blindly, leaving any arguments hanging (test fails) #3775

@drew-parsons

Description

@drew-parsons

The configuration file for testing/install removes -Werror (and -Wall) blindly from CFLAGS (CXXFLAGS),

# Remove -Wall -Werror in this scope

# Remove -Wall -Werror in this scope
if(CMAKE_C_FLAGS)
  string(REPLACE "-Wall"    " " CMAKE_C_FLAGS   ${CMAKE_C_FLAGS})
  string(REPLACE "-Werror"  " " CMAKE_C_FLAGS   ${CMAKE_C_FLAGS})
endif()

if(CMAKE_CXX_FLAGS)
  string(REPLACE "-Wall"    " " CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
  string(REPLACE "-Werror"  " " CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
endif()

The problem is that these flags may have arguments (values). Since the replacement is simple, any such value is left hanging.

For instance debian packages are built with standard CFLAGS intended to improve security (build hardening), determined by dpkg-buildflags, for instance

CFLAGS=-g -O2 -ffile-prefix-map=/home/drew=. -fstack-protector-strong -Wformat -Werror=format-security

In cmake builds this is passed to CMAKE_C_FLAGS (and CMAKE_CXX_FLAGS etc). So adios2 gets built with -Werror=format-security. Then, once testing/install/CMakeLists.txt has had its way, the compilation line gets rendered with c++ -Wformat =format-security, which obviously fails. The error message is

cc: warning: =format-security: linker input file unused because linking not done
cc: error: =format-security: linker input file not found: No such file or directory

from trying to interpret =format-security on its own as a valid linker flag.

There are a handful of options for fixing it, depending on what the intention for removing -Werror was in the first place.
If it's just -Werror itself, add a tailing space "-Werror " (and likewise "-Wall "). If any -Werror is meant to be removed then use a wildcard "-Werror*" (or .*, whatever the wildcard syntax needs to be in this context)

A more robust solution might be to parse the flags individually, e.g. using add_definitions and remove_definitions.

Another option is to append -Wno-error rather than removing -Werror (likewise -Wno-all)

To Reproduce

  1. export CMAKE_CXX_FLAGS="-Werror=format-security"
  2. cmake configure, build
  3. ctest
  4. See error

Expected behavior
tests should pass. The names of CFLAGS should not be removed leaving their values hanging in place.

Desktop (please complete the following information):

  • OS/Platform: Debian unstable (linux)
  • Build gcc 13.2.0, cmake 3.27.2, shared library build

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions