Add --with-nonshared-cflags option to configure

Message ID 20180704093557.3723F43994575@oldenburg.str.redhat.com
State New
Headers show
Series
  • Add --with-nonshared-cflags option to configure
Related show

Commit Message

Florian Weimer July 4, 2018, 9:35 a.m.
2018-07-04  Florian Weimer  <fweimer@redhat.com>

	* configure.ac: Add --with-nonshared-cflags option.
	* config.make.in (extra-nonshared-cflags): Set variable.
	* Makeconfig (CFLAGS-.oS): Use it.
	* manual/install.texi (Configuring and compiling): Document
	--with-nonshared-cflags.
	* configure: Regenerate.
	* INSTALL: Likewise.

Comments

Florian Weimer Aug. 14, 2018, 3:59 p.m. | #1
On 07/04/2018 11:35 AM, Florian Weimer wrote:
> 2018-07-04  Florian Weimer<fweimer@redhat.com>
> 
> 	* configure.ac: Add --with-nonshared-cflags option.
> 	* config.make.in (extra-nonshared-cflags): Set variable.
> 	* Makeconfig (CFLAGS-.oS): Use it.
> 	* manual/install.texi (Configuring and compiling): Document
> 	--with-nonshared-cflags.
> 	* configure: Regenerate.
> 	* INSTALL: Likewise.

Ping?

<https://sourceware.org/ml/libc-alpha/2018-07/msg00071.html>

Thanks,
Florian
Carlos O'Donell Aug. 16, 2018, 5:19 p.m. | #2
On 07/04/2018 05:35 AM, Florian Weimer wrote:
> 2018-07-04  Florian Weimer  <fweimer@redhat.com>
> 
> 	* configure.ac: Add --with-nonshared-cflags option.
> 	* config.make.in (extra-nonshared-cflags): Set variable.
> 	* Makeconfig (CFLAGS-.oS): Use it.
> 	* manual/install.texi (Configuring and compiling): Document
> 	--with-nonshared-cflags.
> 	* configure: Regenerate.
> 	* INSTALL: Likewise.
> 

OK for master if you add an example to --with-nonshared-cflags install.texi
text showing what it might be used for.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>

> diff --git a/Makeconfig b/Makeconfig
> index 608ffe648c..b0b27f0113 100644
> --- a/Makeconfig
> +++ b/Makeconfig
> @@ -1038,7 +1038,7 @@ object-suffixes-for-libc += .oS
>  # Must build the routines as PIC, though, because they can end up in (users')
>  # shared objects.  We don't want to use CFLAGS-os because users may, for
>  # example, make that processor-specific.
> -CFLAGS-.oS = $(CFLAGS-.o) $(PIC-ccflag)
> +CFLAGS-.oS = $(CFLAGS-.o) $(PIC-ccflag) $(extra-nonshared-cflags)

OK.

>  CPPFLAGS-.oS = $(CPPFLAGS-.o) -DPIC -DLIBC_NONSHARED=1
>  libtype.oS = lib%_nonshared.a
>  endif
> diff --git a/config.make.in b/config.make.in
> index d9891b2cd8..a6fe48d31f 100644
> --- a/config.make.in
> +++ b/config.make.in
> @@ -110,6 +110,7 @@ BUILD_CC = @BUILD_CC@
>  CFLAGS = @CFLAGS@
>  CPPFLAGS-config = @CPPFLAGS@
>  CPPUNDEFS = @CPPUNDEFS@
> +extra-nonshared-cflags = @extra_nonshared_cflags@

OK.

>  ASFLAGS-config = @ASFLAGS_config@
>  AR = @AR@
>  NM = @NM@

> diff --git a/configure.ac b/configure.ac
> index dc517017f5..154185d70d 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -154,6 +154,14 @@ AC_ARG_WITH([default-link],
>  	    [use_default_link=$withval],
>  	    [use_default_link=default])
>  
> +dnl Additional build flags injection.
> +AC_ARG_WITH([nonshared-cflags],
> +	    AC_HELP_STRING([--with-nonshared-cflags=FLAGS],
> +			   [build nonshared libraries with additional FLAGS]),

s/FLAGS/CFLAGS/g

> +	    [extra_nonshared_cflags=$withval],
> +	    [extra_nonshared_cflags=])
> +AC_SUBST(extra_nonshared_cflags)

OK.

> +
>  AC_ARG_ENABLE([sanity-checks],
>  	      AC_HELP_STRING([--disable-sanity-checks],
>  			     [really do not use threads (should not be used except in special situations) @<:@default=yes@:>@]),
> diff --git a/manual/install.texi b/manual/install.texi
> index 422da1447e..eaf0cd09e7 100644
> --- a/manual/install.texi
> +++ b/manual/install.texi
> @@ -117,6 +117,15 @@ problem and suppress these constructs, so that the library will still be
>  usable, but functionality may be lost---for example, you can't build a
>  shared libc with old binutils.
>  
> +@item --with-nonshared-cflags=@var{cflags}
> +Use additional compiler flags @var{cflags} to build the parts of the
> +library which are always statically linked into applications and
> +libraries even with shared linking (that is, the object files contained
> +in @file{lib*_nonshared.a} libraries).  The build process will
> +automatically use the appropriate flags, but this option can be used to
> +set additional flags required for building applications and libraries,
> +to match local policy.
> +

I'd like to see an example added to this to show what the flag is used for.

Suggest:

... to match local policy e.g. <Reason why with flag>

>  @c disable static doesn't work currently
>  @c @item --disable-static
>  @c Don't build static libraries.  Static libraries aren't that useful these
>
Florian Weimer Aug. 16, 2018, 5:45 p.m. | #3
On 08/16/2018 07:19 PM, Carlos O'Donell wrote:

>> +@item --with-nonshared-cflags=@var{cflags}
>> +Use additional compiler flags @var{cflags} to build the parts of the
>> +library which are always statically linked into applications and
>> +libraries even with shared linking (that is, the object files contained
>> +in @file{lib*_nonshared.a} libraries).  The build process will
>> +automatically use the appropriate flags, but this option can be used to
>> +set additional flags required for building applications and libraries,
>> +to match local policy.
>> +
> 
> I'd like to see an example added to this to show what the flag is used for.

Our use-case is to compile with -Wp,-D_FORTIFY_SOURCE=2, which does not 
change the compiled code, only the metadata embedded in the nonshared 
objects.  Which makes this feature *really* obscure, of course.

> P.S. Is there any way I can convince you to fix bug 17248 given that you're
> looking at CFLAGS? :-)

Can we do anything else but remove the sorting and deduplication?  This 
was added such a long time ago that we don't have a record why this was 
needed.

I can check that the binaries on x86_64 do not change.

Thanks,
Florian
Carlos O'Donell Aug. 16, 2018, 5:59 p.m. | #4
On 08/16/2018 01:45 PM, Florian Weimer wrote:
> On 08/16/2018 07:19 PM, Carlos O'Donell wrote:
> 
>>> +@item --with-nonshared-cflags=@var{cflags} +Use additional
>>> compiler flags @var{cflags} to build the parts of the +library
>>> which are always statically linked into applications and 
>>> +libraries even with shared linking (that is, the object files
>>> contained +in @file{lib*_nonshared.a} libraries).  The build
>>> process will +automatically use the appropriate flags, but this
>>> option can be used to +set additional flags required for building
>>> applications and libraries, +to match local policy. +
>> 
>> I'd like to see an example added to this to show what the flag is
>> used for.
> 
> Our use-case is to compile with -Wp,-D_FORTIFY_SOURCE=2, which does
> not change the compiled code, only the metadata embedded in the
> nonshared objects.  Which makes this feature *really* obscure, of
> course.

Please add this as a comment or description in install.texi, much
like CFLAGS sorting, I want to come back to this 10 years later,
read the comment and understand the intent.
 
>> P.S. Is there any way I can convince you to fix bug 17248 given
>> that you're looking at CFLAGS? :-)
> 
> Can we do anything else but remove the sorting and deduplication?
> This was added such a long time ago that we don't have a record why
> this was needed.
> 
> I can check that the binaries on x86_64 do not change.

Right, I think that's the only solution, and what we should do.
This leaves CFLAGS as expected without sorting (which might
change based on locale?).

Patch

diff --git a/INSTALL b/INSTALL
index 0a22aa7d01..0f80d9d615 100644
--- a/INSTALL
+++ b/INSTALL
@@ -90,6 +90,15 @@  if 'CFLAGS' is specified it must enable optimization.  For example:
      library will still be usable, but functionality may be lost--for
      example, you can't build a shared libc with old binutils.
 
+'--with-nonshared-cflags=CFLAGS'
+     Use additional compiler flags CFLAGS to build the parts of the
+     library which are always statically linked into applications and
+     libraries even with shared linking (that is, the object files
+     contained in 'lib*_nonshared.a' libraries).  The build process will
+     automatically use the appropriate flags, but this option can be
+     used to set additional flags required for building applications and
+     libraries, to match local policy.
+
 '--disable-shared'
      Don't build shared libraries even if it is possible.  Not all
      systems support shared libraries; you need ELF support and
diff --git a/Makeconfig b/Makeconfig
index 608ffe648c..b0b27f0113 100644
--- a/Makeconfig
+++ b/Makeconfig
@@ -1038,7 +1038,7 @@  object-suffixes-for-libc += .oS
 # Must build the routines as PIC, though, because they can end up in (users')
 # shared objects.  We don't want to use CFLAGS-os because users may, for
 # example, make that processor-specific.
-CFLAGS-.oS = $(CFLAGS-.o) $(PIC-ccflag)
+CFLAGS-.oS = $(CFLAGS-.o) $(PIC-ccflag) $(extra-nonshared-cflags)
 CPPFLAGS-.oS = $(CPPFLAGS-.o) -DPIC -DLIBC_NONSHARED=1
 libtype.oS = lib%_nonshared.a
 endif
diff --git a/config.make.in b/config.make.in
index d9891b2cd8..a6fe48d31f 100644
--- a/config.make.in
+++ b/config.make.in
@@ -110,6 +110,7 @@  BUILD_CC = @BUILD_CC@
 CFLAGS = @CFLAGS@
 CPPFLAGS-config = @CPPFLAGS@
 CPPUNDEFS = @CPPUNDEFS@
+extra-nonshared-cflags = @extra_nonshared_cflags@
 ASFLAGS-config = @ASFLAGS_config@
 AR = @AR@
 NM = @NM@
diff --git a/configure b/configure
index ef18302215..fec0efff82 100755
--- a/configure
+++ b/configure
@@ -684,6 +684,7 @@  force_install
 bindnow
 hardcoded_path_in_tests
 enable_timezone_tools
+extra_nonshared_cflags
 use_default_link
 sysheaders
 ac_ct_CXX
@@ -762,6 +763,7 @@  with_binutils
 with_selinux
 with_headers
 with_default_link
+with_nonshared_cflags
 enable_sanity_checks
 enable_shared
 enable_profile
@@ -1479,6 +1481,8 @@  Optional Packages:
   --with-headers=PATH     location of system headers to use (for example
                           /usr/src/linux/include) [default=compiler default]
   --with-default-link     do not use explicit linker scripts
+  --with-nonshared-cflags=FLAGS
+                          build nonshared libraries with additional FLAGS
   --with-cpu=CPU          select code for CPU variant
 
 Some influential environment variables:
@@ -3336,6 +3340,16 @@  else
 fi
 
 
+
+# Check whether --with-nonshared-cflags was given.
+if test "${with_nonshared_cflags+set}" = set; then :
+  withval=$with_nonshared_cflags; extra_nonshared_cflags=$withval
+else
+  extra_nonshared_cflags=
+fi
+
+
+
 # Check whether --enable-sanity-checks was given.
 if test "${enable_sanity_checks+set}" = set; then :
   enableval=$enable_sanity_checks; enable_sanity=$enableval
diff --git a/configure.ac b/configure.ac
index dc517017f5..154185d70d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -154,6 +154,14 @@  AC_ARG_WITH([default-link],
 	    [use_default_link=$withval],
 	    [use_default_link=default])
 
+dnl Additional build flags injection.
+AC_ARG_WITH([nonshared-cflags],
+	    AC_HELP_STRING([--with-nonshared-cflags=FLAGS],
+			   [build nonshared libraries with additional FLAGS]),
+	    [extra_nonshared_cflags=$withval],
+	    [extra_nonshared_cflags=])
+AC_SUBST(extra_nonshared_cflags)
+
 AC_ARG_ENABLE([sanity-checks],
 	      AC_HELP_STRING([--disable-sanity-checks],
 			     [really do not use threads (should not be used except in special situations) @<:@default=yes@:>@]),
diff --git a/manual/install.texi b/manual/install.texi
index 422da1447e..eaf0cd09e7 100644
--- a/manual/install.texi
+++ b/manual/install.texi
@@ -117,6 +117,15 @@  problem and suppress these constructs, so that the library will still be
 usable, but functionality may be lost---for example, you can't build a
 shared libc with old binutils.
 
+@item --with-nonshared-cflags=@var{cflags}
+Use additional compiler flags @var{cflags} to build the parts of the
+library which are always statically linked into applications and
+libraries even with shared linking (that is, the object files contained
+in @file{lib*_nonshared.a} libraries).  The build process will
+automatically use the appropriate flags, but this option can be used to
+set additional flags required for building applications and libraries,
+to match local policy.
+
 @c disable static doesn't work currently
 @c @item --disable-static
 @c Don't build static libraries.  Static libraries aren't that useful these