tech-pkg archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: dealing with inevitable warnings from new compilers on old code



"Greg A. Woods" <woods%planix.ca@localhost> writes:

> So it is actually telling us to use FORCE_C_STD to set the desired
> language level when necessary.

Yes, to work around buggy packages that do not.

> As I said, USE_CC_FEATURES has an _opposite_ purpose to the present need
> to _lower_ the language level and so it is clearly useless for this
> purpose.  Besides it currently only sets the minium compiler for GCC,
> and it doesn't affect any other compiler than GCC, nor does it set
> "-std=".

It is not opposite; it is different.  It intends to require a compiler
capable of what has been asked for, and in theory that is a set, and in
theory would be implemented for compilers.  It does not set --std; that
should be done by the package.  And, a package might build some files
with c++11 and some with c++17.  Yes, that's deviant.

>> FORCE_{C,CXX}_STD adds --std=foo via the wrappers.  As I read the
>> documentation and the code, this is independent of requiring a compiler
>> that needs that.  That reading matches my inuition about how this ought
>> to be.  So a C++17 program that fails to set --std=c++17 needs:
>> 
>> USE_LANGUAGES=		c++
>> USE_CXX_FEATURES=	c++17
>> FORCE_CXX_STD=		c++17
>
> I would guess that pkgsrc would not be workable on any platform where
> the default C compiler was an ancient GCC 3.x release, so in general

I am unclear on how far back we can go and cope.

> it's not likely necessary to ever have to combine USE_CC_FEATURES (as it
> is currently implemented) and FORCE_C_STD to downgrade the language
> level, though obviously there isn't any harm in it either, and I guess
> it could be updated to catch out any compiler that had dropped support
> for legacy language levels.

You are assuming that FORCE_{C,CXX} are downgrade.  They are not.  They
are "add what is specified to the command line".  It could be that a
package needs c++17 but does not set --std and has trouble with a
compiler that could support c++17 but is operating in c++11 mode,
because it was developed on a machine where the compiler defaulted to
c++17.

> The example for legacy code would of course be something more like:
>
> 	USE_LANGUAGES=		c
> 	USE_CC_FEAGTURES=	gnu90
> 	FORCE_C_STD=		gnu90
>
>> If a program is written in some particular C language family member (c11
>> say) and it does not probe for --std=c11 at configure time and pass
>> --std=c11 at compile time, then it is buggy.
>
> Sure, but are you going to fix the package, or tweak the pkgsrc Makefile?

I'm going to use FORCE_*_STD.  But it is important to be clear about
what is buggy and what is not.

> After all the package built just fine before newer compilers came out.
> It's not the package's fault for pkgsrc to be trying to use a newer
> compiler than the package's author ever even heard of.

The author wrote to a standard and should always have had configure that
tried to with build --std=foo and then added it.  Your scenario is a
latent bug in the package.

> The only problem is that it doesn't cleanly deal with the issue of a
> platform upgrade forcing a newer compiler that defaults to a newer
> language standard level and which causes errors on previously "clean"
> code.

It deals fine; this is exposing latent package bugs.

> Ideally there could be a (mostly internal) "DEFAULT_C_STD" setting too
> (i.e. not for use in individual package Makefiles), which would be
> automatically chosen based on the current platform's default compiler
> and some overall assessment of the state of legacy code in all packages.

I don't think that's ideal; I think it would cause more trouble than it
is worth.  Adding FORCE_*_STD is not that hard, and it doesn't happen
all that often.

> Perhaps the problem is small enough to just use FORCE_C_STD in those
> packages that blow up with newer compilers, or maybe a DEFAULT_C_STD is
> a better solution (it would be a better long-term solution I think).

I see the problem as small enough to use FORCE_C_STD, and see simpler as
better.

> I suspect the same applies for C++, so wash, rinse, and repeat with
> _CXX_ as well.

It's much messier there.   The language changes are more frequent and we
run into compilers with varying defaults pretty often.


Home | Main Index | Thread Index | Old Index