cc1plus: warning: command line option "-Wstrict-prototypes" is valid for Ada/C/ObjC but not for C++
I can answer part of the question, why you're getting the message.
Something in your build process is invoking gcc on a C++ source file with the option -Wstrict-prototypes
. For C and Objective-C, this causes the compiler to warn about old-style function declarations that don't declare the types of arguments.
For C++, this option doesn't make sense; such declarations aren't even allowed by the language (prototypes are mandatory).
(I don't know why the message mentions Ada; -Wstrict-prototypes
makes even less sense for Ada than for C++. It's not a huge deal, but I've submitted this bug report, marked as RESOLVED/FIXED as of 2015-12-06.)
The solution should be to remove the -Wstrict-prototypes
option from the invocation of gcc. But since you're not invoking gcc directly, it's difficult to know how to do that.
I was able to reproduce the warning using your setup.py
, after manually creating a dummy example_wrap.cxx
file:
% python setup.py build_ext -i
running build_ext
building '_foolib' extension
gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -I/usr/include/python2.7 -c example_wrap.cxx -o build/temp.linux-i686-2.7/example_wrap.o
cc1plus: warning: command line option "-Wstrict-prototypes" is valid for Ada/C/ObjC but not for C++
...
So it's probably a minor bug in Python's build_ext
.
But since it's only a warning, not a fatal error, I'd say you can safely ignore it. gcc warns about the meaningless option, but then it just ignores it.
EDIT:
Looking through the Python-2.7.2 sources, this section of configure.in
might be the culprit:
case $GCC in
yes)
if test "$CC" != 'g++' ; then
STRICT_PROTO="-Wstrict-prototypes"
fi
(I'm assuming that's invoked when using build_ext
.)
It turns on the -Wstrict-prototypes
option only if the compiler is not being invoked as g++
-- but in your case it's using the gcc
command to compile C++ source code. And in Lib/distutils/command/build_ext.py
, build_extension()
doesn't pay attention to the source file language when invoking self.compiler.compile()
, only when invoking self.compiler.link_shared_object()
. (Which seems odd; for compilers other than gcc, you wouldn't necessarily be able to use the same command to compile C and C++ -- and it makes more sense to use the g++
command anyway, even if you're not linking.)
UPDATE: A Python bug report was submitted: https://bugs.python.org/issue9031, and closed as a duplicate of this one: https://bugs.python.org/issue1222585, which is still open as I write this.
But as I said, it's only a warning and you can probably safely ignore it. Perhaps the Python maintainers can use the above information to fix the problem in a future release.
Removing -Wstrict-prototypes from the OPT environment variable has no effect. What works is to subclass build_ext
as follows:
from distutils.command.build_ext import build_ext
from distutils.sysconfig import customize_compiler
class my_build_ext(build_ext):
def build_extensions(self):
customize_compiler(self.compiler)
try:
self.compiler.compiler_so.remove("-Wstrict-prototypes")
except (AttributeError, ValueError):
pass
build_ext.build_extensions(self)
and then use my_build_ext
inside the setup
function:
setup(cmdclass = {'build_ext': my_build_ext})
-Wstrict-prototypes
option is read by distutils from /usr/lib/pythonX.Y/config/Makefile
as part of OPT variable. It seems hackish, but you can override it by setting os.environ['OPT']
in your setup.py.
Here is a code that seems not too harmful:
import os
from distutils.sysconfig import get_config_vars
(opt,) = get_config_vars('OPT')
os.environ['OPT'] = " ".join(
flag for flag in opt.split() if flag != '-Wstrict-prototypes'
)