* ‘core-updates’ is back! @ 2017-08-28 22:01 Ludovic Courtès 2017-08-29 8:44 ` Efraim Flashner 2017-08-29 9:14 ` Andy Wingo 0 siblings, 2 replies; 20+ messages in thread From: Ludovic Courtès @ 2017-08-28 22:01 UTC (permalink / raw) To: guix-devel Hello Guix! Yup, I just created a new ‘core-updates’ branch by pushing <https://bugs.gnu.org/27849>. Enjoy! Let’s freeze in one month, say Oct. 1st? Ludo’. ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: ‘core-updates’ is back! 2017-08-28 22:01 ‘core-updates’ is back! Ludovic Courtès @ 2017-08-29 8:44 ` Efraim Flashner 2017-08-30 9:30 ` Efraim Flashner 2017-08-29 9:14 ` Andy Wingo 1 sibling, 1 reply; 20+ messages in thread From: Efraim Flashner @ 2017-08-29 8:44 UTC (permalink / raw) To: Ludovic Courtès; +Cc: guix-devel [-- Attachment #1: Type: text/plain, Size: 753 bytes --] On Tue, Aug 29, 2017 at 12:01:40AM +0200, Ludovic Courtès wrote: > Hello Guix! > > Yup, I just created a new ‘core-updates’ branch by pushing > <https://bugs.gnu.org/27849>. Enjoy! > > Let’s freeze in one month, say Oct. 1st? > > Ludo’. > Lets also have a reminder about a week before to make sure we get things like tzdata. I'm currently test building texinfo@6.4. I tried a blind update of glibc, binutils, texinfo and grep but it failed during building a gcc, so now i'm breaking it into smaller chunks. -- Efraim Flashner <efraim@flashner.co.il> אפרים פלשנר GPG key = A28B F40C 3E55 1372 662D 14F7 41AA E7DC CA3D 8351 Confidentiality cannot be guaranteed on emails sent or received unencrypted [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 833 bytes --] ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: ‘core-updates’ is back! 2017-08-29 8:44 ` Efraim Flashner @ 2017-08-30 9:30 ` Efraim Flashner 2017-08-30 19:10 ` Marius Bakke 0 siblings, 1 reply; 20+ messages in thread From: Efraim Flashner @ 2017-08-30 9:30 UTC (permalink / raw) To: Ludovic Courtès; +Cc: guix-devel [-- Attachment #1: Type: text/plain, Size: 1192 bytes --] On Tue, Aug 29, 2017 at 11:44:53AM +0300, Efraim Flashner wrote: > On Tue, Aug 29, 2017 at 12:01:40AM +0200, Ludovic Courtès wrote: > > Hello Guix! > > > > Yup, I just created a new ‘core-updates’ branch by pushing > > <https://bugs.gnu.org/27849>. Enjoy! > > > > Let’s freeze in one month, say Oct. 1st? > > > > Ludo’. > > > > Lets also have a reminder about a week before to make sure we get things > like tzdata. > > I'm currently test building texinfo@6.4. I tried a blind update of > glibc, binutils, texinfo and grep but it failed during building a gcc, > so now i'm breaking it into smaller chunks. > It looks like binutils@2.29.1 is coming mid-September¹ so I'm not touching binutils for now. I'm not sure why updating glibc is causing gcc to fail to build. Also, in gnu/packages/commencement, should we change package/inherit back to 'package (inherit...'? ¹ https://sourceware.org/ml/binutils/2017-08/msg00176.html -- Efraim Flashner <efraim@flashner.co.il> אפרים פלשנר GPG key = A28B F40C 3E55 1372 662D 14F7 41AA E7DC CA3D 8351 Confidentiality cannot be guaranteed on emails sent or received unencrypted [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 833 bytes --] ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: ‘core-updates’ is back! 2017-08-30 9:30 ` Efraim Flashner @ 2017-08-30 19:10 ` Marius Bakke 2017-08-30 20:16 ` Efraim Flashner 2017-08-30 21:17 ` Ricardo Wurmus 0 siblings, 2 replies; 20+ messages in thread From: Marius Bakke @ 2017-08-30 19:10 UTC (permalink / raw) To: Efraim Flashner, Ludovic Courtès; +Cc: guix-devel [-- Attachment #1: Type: text/plain, Size: 1337 bytes --] Efraim Flashner <efraim@flashner.co.il> writes: > On Tue, Aug 29, 2017 at 11:44:53AM +0300, Efraim Flashner wrote: >> On Tue, Aug 29, 2017 at 12:01:40AM +0200, Ludovic Courtès wrote: >> > Hello Guix! >> > >> > Yup, I just created a new ‘core-updates’ branch by pushing >> > <https://bugs.gnu.org/27849>. Enjoy! >> > >> > Let’s freeze in one month, say Oct. 1st? >> > >> > Ludo’. >> > >> >> Lets also have a reminder about a week before to make sure we get things >> like tzdata. >> >> I'm currently test building texinfo@6.4. I tried a blind update of >> glibc, binutils, texinfo and grep but it failed during building a gcc, >> so now i'm breaking it into smaller chunks. >> > > It looks like binutils@2.29.1 is coming mid-September¹ so I'm not > touching binutils for now. I'm not sure why updating glibc is causing > gcc to fail to build. Can you post the glibc update patch? Probably unrelated, but we also have to change the '--enable-kernel' configure flag to say '3.2.0' since that is the minimum supported by glibc 2.26. Also, one month, yay! Hopefully a shorter schedule will reduce the amount of build issues during each round. Since we're on the topic, I would like to switch to GCC 6 or 7 soon... Are we agile enough to use the very latest GCC by default yet? :-) [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 487 bytes --] ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: ‘core-updates’ is back! 2017-08-30 19:10 ` Marius Bakke @ 2017-08-30 20:16 ` Efraim Flashner 2017-08-30 20:37 ` Marius Bakke 2017-08-30 21:17 ` Ricardo Wurmus 1 sibling, 1 reply; 20+ messages in thread From: Efraim Flashner @ 2017-08-30 20:16 UTC (permalink / raw) To: Marius Bakke; +Cc: guix-devel [-- Attachment #1: Type: text/plain, Size: 2094 bytes --] On Wed, Aug 30, 2017 at 09:10:42PM +0200, Marius Bakke wrote: > Efraim Flashner <efraim@flashner.co.il> writes: > > > On Tue, Aug 29, 2017 at 11:44:53AM +0300, Efraim Flashner wrote: > >> On Tue, Aug 29, 2017 at 12:01:40AM +0200, Ludovic Courtès wrote: > >> > Hello Guix! > >> > > >> > Yup, I just created a new ‘core-updates’ branch by pushing > >> > <https://bugs.gnu.org/27849>. Enjoy! > >> > > >> > Let’s freeze in one month, say Oct. 1st? > >> > > >> > Ludo’. > >> > > >> > >> Lets also have a reminder about a week before to make sure we get things > >> like tzdata. > >> > >> I'm currently test building texinfo@6.4. I tried a blind update of > >> glibc, binutils, texinfo and grep but it failed during building a gcc, > >> so now i'm breaking it into smaller chunks. > >> > > > > It looks like binutils@2.29.1 is coming mid-September¹ so I'm not > > touching binutils for now. I'm not sure why updating glibc is causing > > gcc to fail to build. > > Can you post the glibc update patch? I didn't actually keep a patch of the update. 2.25->2.26, the 3 CVE patches and the memchr-overflow and vectorized-strcspn get dropped. in gnu/packages/commencement.scm I changed the two 'package/inherit' to 'package (inherit '. > > Probably unrelated, but we also have to change the '--enable-kernel' > configure flag to say '3.2.0' since that is the minimum supported by > glibc 2.26. I didn't change this in my patch. > > Also, one month, yay! Hopefully a shorter schedule will reduce the > amount of build issues during each round. > > Since we're on the topic, I would like to switch to GCC 6 or 7 soon... > Are we agile enough to use the very latest GCC by default yet? :-) That would be nice to at least move to GCC 6. My aarch64 board is currently idle, I can see how well it works on my machine. -- Efraim Flashner <efraim@flashner.co.il> אפרים פלשנר GPG key = A28B F40C 3E55 1372 662D 14F7 41AA E7DC CA3D 8351 Confidentiality cannot be guaranteed on emails sent or received unencrypted [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 833 bytes --] ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: ‘core-updates’ is back! 2017-08-30 20:16 ` Efraim Flashner @ 2017-08-30 20:37 ` Marius Bakke 2017-08-31 14:44 ` Ludovic Courtès 0 siblings, 1 reply; 20+ messages in thread From: Marius Bakke @ 2017-08-30 20:37 UTC (permalink / raw) To: Efraim Flashner; +Cc: guix-devel [-- Attachment #1: Type: text/plain, Size: 530 bytes --] Efraim Flashner <efraim@flashner.co.il> writes: > On Wed, Aug 30, 2017 at 09:10:42PM +0200, Marius Bakke wrote: >> Since we're on the topic, I would like to switch to GCC 6 or 7 soon... >> Are we agile enough to use the very latest GCC by default yet? :-) > > That would be nice to at least move to GCC 6. My aarch64 board is > currently idle, I can see how well it works on my machine. The main issue with GCC 6 is that we need to port the SOURCE_DATE_EPOCH patches again. But we might want to do that even if switching to 7. [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 487 bytes --] ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: ‘core-updates’ is back! 2017-08-30 20:37 ` Marius Bakke @ 2017-08-31 14:44 ` Ludovic Courtès 2017-08-31 16:23 ` Marius Bakke 0 siblings, 1 reply; 20+ messages in thread From: Ludovic Courtès @ 2017-08-31 14:44 UTC (permalink / raw) To: Marius Bakke; +Cc: guix-devel Marius Bakke <mbakke@fastmail.com> skribis: > Efraim Flashner <efraim@flashner.co.il> writes: > >> On Wed, Aug 30, 2017 at 09:10:42PM +0200, Marius Bakke wrote: >>> Since we're on the topic, I would like to switch to GCC 6 or 7 soon... >>> Are we agile enough to use the very latest GCC by default yet? :-) >> >> That would be nice to at least move to GCC 6. My aarch64 board is >> currently idle, I can see how well it works on my machine. > > The main issue with GCC 6 is that we need to port the SOURCE_DATE_EPOCH > patches again. But we might want to do that even if switching to 7. I think we should upgrade. My preference would be GCC 6, which I think may trigger fewer build failures than GCC 7, but maybe GCC 7 would be fine. Are you sure the SOURCE_DATE_EPOCH thing isn’t already in GCC 6? Thanks, Ludo’. ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: ‘core-updates’ is back! 2017-08-31 14:44 ` Ludovic Courtès @ 2017-08-31 16:23 ` Marius Bakke 2017-08-31 17:18 ` Marius Bakke 2017-09-02 21:01 ` Ludovic Courtès 0 siblings, 2 replies; 20+ messages in thread From: Marius Bakke @ 2017-08-31 16:23 UTC (permalink / raw) To: Ludovic Courtès; +Cc: guix-devel [-- Attachment #1.1: Type: text/plain, Size: 1290 bytes --] Ludovic Courtès <ludo@gnu.org> writes: > Marius Bakke <mbakke@fastmail.com> skribis: > >> Efraim Flashner <efraim@flashner.co.il> writes: >> >>> On Wed, Aug 30, 2017 at 09:10:42PM +0200, Marius Bakke wrote: >>>> Since we're on the topic, I would like to switch to GCC 6 or 7 soon... >>>> Are we agile enough to use the very latest GCC by default yet? :-) >>> >>> That would be nice to at least move to GCC 6. My aarch64 board is >>> currently idle, I can see how well it works on my machine. >> >> The main issue with GCC 6 is that we need to port the SOURCE_DATE_EPOCH >> patches again. But we might want to do that even if switching to 7. > > I think we should upgrade. My preference would be GCC 6, which I think > may trigger fewer build failures than GCC 7, but maybe GCC 7 would be > fine. > > Are you sure the SOURCE_DATE_EPOCH thing isn’t already in GCC 6? I just checked out the gcc-6_4_0-release tag and ran `git grep SOURCE_DATE_EPOCH`. No results :/ However I tried cherry-picking the two commits and there was only one trivial conflict in gcc/c-family/c-common.h (apart from ChangeLog updates, which were omitted). Patch attached and building! I also prefer going through GCC 6 before 7. Let's go for it, assuming this patch works. [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #1.2: 0001-gnu-gcc-6-Respect-SOURCE_DATE_EPOCH-in-__DATE__-and-.patch --] [-- Type: text/x-patch, Size: 22877 bytes --] From 329e016e35c51426ccf30aa2335bfd3ef12678a6 Mon Sep 17 00:00:00 2001 From: Marius Bakke <mbakke@fastmail.com> Date: Thu, 31 Aug 2017 18:13:08 +0200 Subject: [PATCH] gnu: gcc@6: Respect SOURCE_DATE_EPOCH in __DATE__ and __TIME__ macros. * gnu/packages/patches/gcc-6-source-date-epoch-1.patch, gnu/packages/patches/gcc-6-source-date-epoch-2.patch: New files. * gnu/local.mk (dist_patch_DATA): Register them. * gnu/packages/gcc.scm (gcc-6)[source]: Use them. --- gnu/local.mk | 2 + gnu/packages/gcc.scm | 2 + .../patches/gcc-6-source-date-epoch-1.patch | 187 +++++++++++ .../patches/gcc-6-source-date-epoch-2.patch | 346 +++++++++++++++++++++ 4 files changed, 537 insertions(+) create mode 100644 gnu/packages/patches/gcc-6-source-date-epoch-1.patch create mode 100644 gnu/packages/patches/gcc-6-source-date-epoch-2.patch diff --git a/gnu/local.mk b/gnu/local.mk index 175434bcd..0bc64179f 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -628,6 +628,8 @@ dist_patch_DATA = \ %D%/packages/patches/gcc-5-source-date-epoch-2.patch \ %D%/packages/patches/gcc-6-arm-none-eabi-multilib.patch \ %D%/packages/patches/gcc-6-cross-environment-variables.patch \ + %D%/packages/patches/gcc-6-source-date-epoch-1.patch \ + %D%/packages/patches/gcc-6-source-date-epoch-2.patch \ %D%/packages/patches/gcr-disable-failing-tests.patch \ %D%/packages/patches/gcr-fix-collection-tests-to-work-with-gpg-21.patch \ %D%/packages/patches/gdk-pixbuf-list-dir.patch \ diff --git a/gnu/packages/gcc.scm b/gnu/packages/gcc.scm index da4d66ce3..e8efb0e42 100644 --- a/gnu/packages/gcc.scm +++ b/gnu/packages/gcc.scm @@ -402,6 +402,8 @@ Go. It also includes runtime support libraries for these languages.") (base32 "1m0lr7938lw5d773dkvwld90hjlcq2282517d1gwvrfzmwgg42w5")) (patches (search-patches "gcc-strmov-store-file-names.patch" + "gcc-6-source-date-epoch-1.patch" + "gcc-6-source-date-epoch-2.patch" "gcc-5.0-libvtv-runpath.patch")))))) (define-public gcc-7 (package diff --git a/gnu/packages/patches/gcc-6-source-date-epoch-1.patch b/gnu/packages/patches/gcc-6-source-date-epoch-1.patch new file mode 100644 index 000000000..26f62bc9f --- /dev/null +++ b/gnu/packages/patches/gcc-6-source-date-epoch-1.patch @@ -0,0 +1,187 @@ +Make GCC respect SOURCE_DATE_EPOCH in __DATE__ and __TIME__ macros. + +Cherry-picked from upstream commit: + +https://gcc.gnu.org/git/?p=gcc.git;a=commitdiff;h=e3e8c48c4a494d9da741c1c8ea6c4c0b7c4ff934 + +diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c +index 6cf8c610b4e..b5daea65ba7 100644 +--- a/gcc/c-family/c-common.c ++++ b/gcc/c-family/c-common.c +@@ -12750,4 +12750,37 @@ valid_array_size_p (location_t loc, tree type, tree name) + return true; + } + ++/* Read SOURCE_DATE_EPOCH from environment to have a deterministic ++ timestamp to replace embedded current dates to get reproducible ++ results. Returns -1 if SOURCE_DATE_EPOCH is not defined. */ ++time_t ++get_source_date_epoch () ++{ ++ char *source_date_epoch; ++ long long epoch; ++ char *endptr; ++ ++ source_date_epoch = getenv ("SOURCE_DATE_EPOCH"); ++ if (!source_date_epoch) ++ return (time_t) -1; ++ ++ errno = 0; ++ epoch = strtoll (source_date_epoch, &endptr, 10); ++ if ((errno == ERANGE && (epoch == LLONG_MAX || epoch == LLONG_MIN)) ++ || (errno != 0 && epoch == 0)) ++ fatal_error (UNKNOWN_LOCATION, "environment variable $SOURCE_DATE_EPOCH: " ++ "strtoll: %s\n", xstrerror(errno)); ++ if (endptr == source_date_epoch) ++ fatal_error (UNKNOWN_LOCATION, "environment variable $SOURCE_DATE_EPOCH: " ++ "no digits were found: %s\n", endptr); ++ if (*endptr != '\0') ++ fatal_error (UNKNOWN_LOCATION, "environment variable $SOURCE_DATE_EPOCH: " ++ "trailing garbage: %s\n", endptr); ++ if (epoch < 0) ++ fatal_error (UNKNOWN_LOCATION, "environment variable $SOURCE_DATE_EPOCH: " ++ "value must be nonnegative: %lld \n", epoch); ++ ++ return (time_t) epoch; ++} ++ + #include "gt-c-family-c-common.h" +diff --git a/gcc/c-family/c-common.h b/gcc/c-family/c-common.h +index dd74d0dd62e..c6e0ed12b55 100644 +--- a/gcc/c-family/c-common.h ++++ b/gcc/c-family/c-common.h +@@ -1467,4 +1467,9 @@ extern bool reject_gcc_builtin (const_tree, location_t = UNKNOWN_LOCATION); + extern void warn_duplicated_cond_add_or_warn (location_t, tree, vec<tree> **); + extern bool valid_array_size_p (location_t, tree, tree); + ++/* Read SOURCE_DATE_EPOCH from environment to have a deterministic ++ timestamp to replace embedded current dates to get reproducible ++ results. Returns -1 if SOURCE_DATE_EPOCH is not defined. */ ++extern time_t get_source_date_epoch (void); ++ + #endif /* ! GCC_C_COMMON_H */ +diff --git a/gcc/c-family/c-lex.c b/gcc/c-family/c-lex.c +index 96da4fc974e..bf1db6c0252 100644 +--- a/gcc/c-family/c-lex.c ++++ b/gcc/c-family/c-lex.c +@@ -385,6 +385,9 @@ c_lex_with_flags (tree *value, location_t *loc, unsigned char *cpp_flags, + enum cpp_ttype type; + unsigned char add_flags = 0; + enum overflow_type overflow = OT_NONE; ++ time_t source_date_epoch = get_source_date_epoch (); ++ ++ cpp_init_source_date_epoch (parse_in, source_date_epoch); + + timevar_push (TV_CPP); + retry: +diff --git a/gcc/doc/cppenv.texi b/gcc/doc/cppenv.texi +index 22c8cb37624..e958e93e97e 100644 +--- a/gcc/doc/cppenv.texi ++++ b/gcc/doc/cppenv.texi +@@ -79,4 +79,21 @@ main input file is omitted. + @ifclear cppmanual + @xref{Preprocessor Options}. + @end ifclear ++ ++@item SOURCE_DATE_EPOCH ++ ++If this variable is set, its value specifies a UNIX timestamp to be ++used in replacement of the current date and time in the @code{__DATE__} ++and @code{__TIME__} macros, so that the embedded timestamps become ++reproducible. ++ ++The value of @env{SOURCE_DATE_EPOCH} must be a UNIX timestamp, ++defined as the number of seconds (excluding leap seconds) since ++01 Jan 1970 00:00:00 represented in ASCII, identical to the output of ++@samp{@command{date +%s}}. ++ ++The value should be a known timestamp such as the last modification ++time of the source or package and it should be set by the build ++process. ++ + @end vtable +diff --git a/libcpp/include/cpplib.h b/libcpp/include/cpplib.h +index 35b0375c09c..4998b3a8ab8 100644 +--- a/libcpp/include/cpplib.h ++++ b/libcpp/include/cpplib.h +@@ -784,6 +784,9 @@ extern void cpp_init_special_builtins (cpp_reader *); + /* Set up built-ins like __FILE__. */ + extern void cpp_init_builtins (cpp_reader *, int); + ++/* Initialize the source_date_epoch value. */ ++extern void cpp_init_source_date_epoch (cpp_reader *, time_t); ++ + /* This is called after options have been parsed, and partially + processed. */ + extern void cpp_post_options (cpp_reader *); +diff --git a/libcpp/init.c b/libcpp/init.c +index 4343075ba85..f5ff85b3bae 100644 +--- a/libcpp/init.c ++++ b/libcpp/init.c +@@ -533,8 +533,15 @@ cpp_init_builtins (cpp_reader *pfile, int hosted) + _cpp_define_builtin (pfile, "__OBJC__ 1"); + } + ++/* Initialize the source_date_epoch value. */ ++void ++cpp_init_source_date_epoch (cpp_reader *pfile, time_t source_date_epoch) ++{ ++ pfile->source_date_epoch = source_date_epoch; ++} ++ + /* Sanity-checks are dependent on command-line options, so it is +- called as a subroutine of cpp_read_main_file (). */ ++ called as a subroutine of cpp_read_main_file. */ + #if CHECKING_P + static void sanity_checks (cpp_reader *); + static void sanity_checks (cpp_reader *pfile) +diff --git a/libcpp/internal.h b/libcpp/internal.h +index 9ce870738cc..e3eb26b1f27 100644 +--- a/libcpp/internal.h ++++ b/libcpp/internal.h +@@ -502,6 +502,10 @@ struct cpp_reader + const unsigned char *date; + const unsigned char *time; + ++ /* Externally set timestamp to replace current date and time useful for ++ reproducibility. */ ++ time_t source_date_epoch; ++ + /* EOF token, and a token forcing paste avoidance. */ + cpp_token avoid_paste; + cpp_token eof; +diff --git a/libcpp/macro.c b/libcpp/macro.c +index c2515534504..c2a83764660 100644 +--- a/libcpp/macro.c ++++ b/libcpp/macro.c +@@ -357,13 +357,20 @@ _cpp_builtin_macro_text (cpp_reader *pfile, cpp_hashnode *node, + time_t tt; + struct tm *tb = NULL; + +- /* (time_t) -1 is a legitimate value for "number of seconds +- since the Epoch", so we have to do a little dance to +- distinguish that from a genuine error. */ +- errno = 0; +- tt = time(NULL); +- if (tt != (time_t)-1 || errno == 0) +- tb = localtime (&tt); ++ /* Set a reproducible timestamp for __DATE__ and __TIME__ macro ++ usage if SOURCE_DATE_EPOCH is defined. */ ++ if (pfile->source_date_epoch != (time_t) -1) ++ tb = gmtime (&pfile->source_date_epoch); ++ else ++ { ++ /* (time_t) -1 is a legitimate value for "number of seconds ++ since the Epoch", so we have to do a little dance to ++ distinguish that from a genuine error. */ ++ errno = 0; ++ tt = time (NULL); ++ if (tt != (time_t)-1 || errno == 0) ++ tb = localtime (&tt); ++ } + + if (tb) + { +-- +2.14.1 + diff --git a/gnu/packages/patches/gcc-6-source-date-epoch-2.patch b/gnu/packages/patches/gcc-6-source-date-epoch-2.patch new file mode 100644 index 000000000..cd5b09867 --- /dev/null +++ b/gnu/packages/patches/gcc-6-source-date-epoch-2.patch @@ -0,0 +1,346 @@ +Cherry-picked from upstream commit: + +https://gcc.gnu.org/git/?p=gcc.git;a=commitdiff;h=dfa5c0d3f3e23e4fdb14857a42de376d9ff8601c + +diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c +index b5daea65ba7..a4539da15ce 100644 +--- a/gcc/c-family/c-common.c ++++ b/gcc/c-family/c-common.c +@@ -12753,8 +12753,9 @@ valid_array_size_p (location_t loc, tree type, tree name) + /* Read SOURCE_DATE_EPOCH from environment to have a deterministic + timestamp to replace embedded current dates to get reproducible + results. Returns -1 if SOURCE_DATE_EPOCH is not defined. */ ++ + time_t +-get_source_date_epoch () ++cb_get_source_date_epoch (cpp_reader *pfile ATTRIBUTE_UNUSED) + { + char *source_date_epoch; + long long epoch; +@@ -12766,19 +12767,14 @@ get_source_date_epoch () + + errno = 0; + epoch = strtoll (source_date_epoch, &endptr, 10); +- if ((errno == ERANGE && (epoch == LLONG_MAX || epoch == LLONG_MIN)) +- || (errno != 0 && epoch == 0)) +- fatal_error (UNKNOWN_LOCATION, "environment variable $SOURCE_DATE_EPOCH: " +- "strtoll: %s\n", xstrerror(errno)); +- if (endptr == source_date_epoch) +- fatal_error (UNKNOWN_LOCATION, "environment variable $SOURCE_DATE_EPOCH: " +- "no digits were found: %s\n", endptr); +- if (*endptr != '\0') +- fatal_error (UNKNOWN_LOCATION, "environment variable $SOURCE_DATE_EPOCH: " +- "trailing garbage: %s\n", endptr); +- if (epoch < 0) +- fatal_error (UNKNOWN_LOCATION, "environment variable $SOURCE_DATE_EPOCH: " +- "value must be nonnegative: %lld \n", epoch); ++ if (errno != 0 || endptr == source_date_epoch || *endptr != '\0' ++ || epoch < 0 || epoch > MAX_SOURCE_DATE_EPOCH) ++ { ++ error_at (input_location, "environment variable SOURCE_DATE_EPOCH must " ++ "expand to a non-negative integer less than or equal to %wd", ++ MAX_SOURCE_DATE_EPOCH); ++ return (time_t) -1; ++ } + + return (time_t) epoch; + } +diff --git a/gcc/c-family/c-common.h b/gcc/c-family/c-common.h +index c6e0ed12b55..44699f716e0 100644 +--- a/gcc/c-family/c-common.h ++++ b/gcc/c-family/c-common.h +@@ -1084,6 +1084,16 @@ extern vec<tree, va_gc> *make_tree_vector_copy (const vec<tree, va_gc> *); + c_register_builtin_type. */ + extern GTY(()) tree registered_builtin_types; + ++/* Read SOURCE_DATE_EPOCH from environment to have a deterministic ++ timestamp to replace embedded current dates to get reproducible ++ results. Returns -1 if SOURCE_DATE_EPOCH is not defined. */ ++extern time_t cb_get_source_date_epoch (cpp_reader *pfile); ++ ++/* The value (as a unix timestamp) corresponds to date ++ "Dec 31 9999 23:59:59 UTC", which is the latest date that __DATE__ and ++ __TIME__ can store. */ ++#define MAX_SOURCE_DATE_EPOCH HOST_WIDE_INT_C (253402300799) ++ + /* In c-gimplify.c */ + extern void c_genericize (tree); + extern int c_gimplify_expr (tree *, gimple_seq *, gimple_seq *); +@@ -1467,9 +1477,4 @@ extern bool reject_gcc_builtin (const_tree, location_t = UNKNOWN_LOCATION); + extern void warn_duplicated_cond_add_or_warn (location_t, tree, vec<tree> **); + extern bool valid_array_size_p (location_t, tree, tree); + +-/* Read SOURCE_DATE_EPOCH from environment to have a deterministic +- timestamp to replace embedded current dates to get reproducible +- results. Returns -1 if SOURCE_DATE_EPOCH is not defined. */ +-extern time_t get_source_date_epoch (void); +- + #endif /* ! GCC_C_COMMON_H */ +diff --git a/gcc/c-family/c-lex.c b/gcc/c-family/c-lex.c +index bf1db6c0252..42a4135d339 100644 +--- a/gcc/c-family/c-lex.c ++++ b/gcc/c-family/c-lex.c +@@ -80,6 +80,7 @@ init_c_lex (void) + cb->valid_pch = c_common_valid_pch; + cb->read_pch = c_common_read_pch; + cb->has_attribute = c_common_has_attribute; ++ cb->get_source_date_epoch = cb_get_source_date_epoch; + + /* Set the debug callbacks if we can use them. */ + if ((debug_info_level == DINFO_LEVEL_VERBOSE +@@ -385,9 +386,6 @@ c_lex_with_flags (tree *value, location_t *loc, unsigned char *cpp_flags, + enum cpp_ttype type; + unsigned char add_flags = 0; + enum overflow_type overflow = OT_NONE; +- time_t source_date_epoch = get_source_date_epoch (); +- +- cpp_init_source_date_epoch (parse_in, source_date_epoch); + + timevar_push (TV_CPP); + retry: +diff --git a/gcc/doc/cppenv.texi b/gcc/doc/cppenv.texi +index e958e93e97e..8cefd529aa3 100644 +--- a/gcc/doc/cppenv.texi ++++ b/gcc/doc/cppenv.texi +@@ -81,7 +81,6 @@ main input file is omitted. + @end ifclear + + @item SOURCE_DATE_EPOCH +- + If this variable is set, its value specifies a UNIX timestamp to be + used in replacement of the current date and time in the @code{__DATE__} + and @code{__TIME__} macros, so that the embedded timestamps become +@@ -89,8 +88,9 @@ reproducible. + + The value of @env{SOURCE_DATE_EPOCH} must be a UNIX timestamp, + defined as the number of seconds (excluding leap seconds) since +-01 Jan 1970 00:00:00 represented in ASCII, identical to the output of +-@samp{@command{date +%s}}. ++01 Jan 1970 00:00:00 represented in ASCII; identical to the output of ++@samp{@command{date +%s}} on GNU/Linux and other systems that support the ++@code{%s} extension in the @code{date} command. + + The value should be a known timestamp such as the last modification + time of the source or package and it should be set by the build +diff --git a/gcc/gcc.c b/gcc/gcc.c +index cfa074d4e43..f88596219bc 100644 +--- a/gcc/gcc.c ++++ b/gcc/gcc.c +@@ -3541,6 +3541,29 @@ save_switch (const char *opt, size_t n_args, const char *const *args, + n_switches++; + } + ++/* Set the SOURCE_DATE_EPOCH environment variable to the current time if it is ++ not set already. */ ++ ++static void ++set_source_date_epoch_envvar () ++{ ++ /* Array size is 21 = ceil(log_10(2^64)) + 1 to hold string representations ++ of 64 bit integers. */ ++ char source_date_epoch[21]; ++ time_t tt; ++ ++ errno = 0; ++ tt = time (NULL); ++ if (tt < (time_t) 0 || errno != 0) ++ tt = (time_t) 0; ++ ++ snprintf (source_date_epoch, 21, "%llu", (unsigned long long) tt); ++ /* Using setenv instead of xputenv because we want the variable to remain ++ after finalizing so that it's still set in the second run when using ++ -fcompare-debug. */ ++ setenv ("SOURCE_DATE_EPOCH", source_date_epoch, 0); ++} ++ + /* Handle an option DECODED that is unknown to the option-processing + machinery. */ + +@@ -3840,6 +3863,7 @@ driver_handle_option (struct gcc_options *opts, + else + compare_debug_opt = arg; + save_switch (compare_debug_replacement_opt, 0, NULL, validated, true); ++ set_source_date_epoch_envvar (); + return true; + + case OPT_fdiagnostics_color_: +diff --git a/gcc/testsuite/gcc.dg/cpp/source_date_epoch-1.c b/gcc/testsuite/gcc.dg/cpp/source_date_epoch-1.c +new file mode 100644 +index 00000000000..f6aa1a360ff +--- /dev/null ++++ b/gcc/testsuite/gcc.dg/cpp/source_date_epoch-1.c +@@ -0,0 +1,11 @@ ++/* { dg-do run } */ ++/* { dg-set-compiler-env-var SOURCE_DATE_EPOCH "630333296" } */ ++ ++int ++main(void) ++{ ++ __builtin_printf ("%s %s\n", __DATE__, __TIME__); ++ return 0; ++} ++ ++/* { dg-output "^Dec 22 1989 12:34:56\n$" } */ +diff --git a/gcc/testsuite/gcc.dg/cpp/source_date_epoch-2.c b/gcc/testsuite/gcc.dg/cpp/source_date_epoch-2.c +new file mode 100644 +index 00000000000..ae18362ae87 +--- /dev/null ++++ b/gcc/testsuite/gcc.dg/cpp/source_date_epoch-2.c +@@ -0,0 +1,12 @@ ++/* { dg-do compile } */ ++/* { dg-set-compiler-env-var SOURCE_DATE_EPOCH "AAA" } */ ++ ++/* Make sure that SOURCE_DATE_EPOCH is only parsed once */ ++ ++int ++main(void) ++{ ++ __builtin_printf ("%s %s\n", __DATE__, __TIME__); /* { dg-error "SOURCE_DATE_EPOCH must expand" } */ ++ __builtin_printf ("%s %s\n", __DATE__, __TIME__); ++ return 0; ++} +diff --git a/gcc/testsuite/lib/gcc-dg.exp b/gcc/testsuite/lib/gcc-dg.exp +index 9dd909b0985..822d2fbb3b9 100644 +--- a/gcc/testsuite/lib/gcc-dg.exp ++++ b/gcc/testsuite/lib/gcc-dg.exp +@@ -450,6 +450,38 @@ proc restore-target-env-var { } { + } + } + ++proc dg-set-compiler-env-var { args } { ++ global set_compiler_env_var ++ global saved_compiler_env_var ++ if { [llength $args] != 3 } { ++ error "dg-set-compiler-env-var: need two arguments" ++ return ++ } ++ set var [lindex $args 1] ++ set value [lindex $args 2] ++ if [info exists ::env($var)] { ++ lappend saved_compiler_env_var [list $var 1 $::env($var)] ++ } else { ++ lappend saved_compiler_env_var [list $var 0] ++ } ++ setenv $var $value ++ lappend set_compiler_env_var [list $var $value] ++} ++ ++proc restore-compiler-env-var { } { ++ global saved_compiler_env_var ++ for { set env_vari [llength $saved_compiler_env_var] } { ++ [incr env_vari -1] >= 0 } {} { ++ set env_var [lindex $saved_compiler_env_var $env_vari] ++ set var [lindex $env_var 0] ++ if [lindex $env_var 1] { ++ setenv $var [lindex $env_var 2] ++ } else { ++ unsetenv $var ++ } ++ } ++} ++ + # Utility routines. + + # +@@ -873,6 +905,11 @@ if { [info procs saved-dg-test] == [list] } { + if [info exists set_target_env_var] { + unset set_target_env_var + } ++ if [info exists set_compiler_env_var] { ++ restore-compiler-env-var ++ unset set_compiler_env_var ++ unset saved_compiler_env_var ++ } + if [info exists keep_saved_temps_suffixes] { + unset keep_saved_temps_suffixes + } +diff --git a/libcpp/include/cpplib.h b/libcpp/include/cpplib.h +index 4998b3a8ab8..9d70cc856ef 100644 +--- a/libcpp/include/cpplib.h ++++ b/libcpp/include/cpplib.h +@@ -594,6 +594,9 @@ struct cpp_callbacks + + /* Callback that can change a user builtin into normal macro. */ + bool (*user_builtin_macro) (cpp_reader *, cpp_hashnode *); ++ ++ /* Callback to parse SOURCE_DATE_EPOCH from environment. */ ++ time_t (*get_source_date_epoch) (cpp_reader *); + }; + + #ifdef VMS +@@ -784,9 +787,6 @@ extern void cpp_init_special_builtins (cpp_reader *); + /* Set up built-ins like __FILE__. */ + extern void cpp_init_builtins (cpp_reader *, int); + +-/* Initialize the source_date_epoch value. */ +-extern void cpp_init_source_date_epoch (cpp_reader *, time_t); +- + /* This is called after options have been parsed, and partially + processed. */ + extern void cpp_post_options (cpp_reader *); +diff --git a/libcpp/init.c b/libcpp/init.c +index f5ff85b3bae..e78b3206def 100644 +--- a/libcpp/init.c ++++ b/libcpp/init.c +@@ -257,6 +257,9 @@ cpp_create_reader (enum c_lang lang, cpp_hash_table *table, + /* Do not force token locations by default. */ + pfile->forced_token_location_p = NULL; + ++ /* Initialize source_date_epoch to -2 (not yet set). */ ++ pfile->source_date_epoch = (time_t) -2; ++ + /* The expression parser stack. */ + _cpp_expand_op_stack (pfile); + +@@ -533,13 +536,6 @@ cpp_init_builtins (cpp_reader *pfile, int hosted) + _cpp_define_builtin (pfile, "__OBJC__ 1"); + } + +-/* Initialize the source_date_epoch value. */ +-void +-cpp_init_source_date_epoch (cpp_reader *pfile, time_t source_date_epoch) +-{ +- pfile->source_date_epoch = source_date_epoch; +-} +- + /* Sanity-checks are dependent on command-line options, so it is + called as a subroutine of cpp_read_main_file. */ + #if CHECKING_P +diff --git a/libcpp/internal.h b/libcpp/internal.h +index e3eb26b1f27..cea32ec73c6 100644 +--- a/libcpp/internal.h ++++ b/libcpp/internal.h +@@ -503,7 +503,8 @@ struct cpp_reader + const unsigned char *time; + + /* Externally set timestamp to replace current date and time useful for +- reproducibility. */ ++ reproducibility. It should be initialized to -2 (not yet set) and ++ set to -1 to disable it or to a non-negative value to enable it. */ + time_t source_date_epoch; + + /* EOF token, and a token forcing paste avoidance. */ +diff --git a/libcpp/macro.c b/libcpp/macro.c +index c2a83764660..a3b8348a23f 100644 +--- a/libcpp/macro.c ++++ b/libcpp/macro.c +@@ -358,9 +358,13 @@ _cpp_builtin_macro_text (cpp_reader *pfile, cpp_hashnode *node, + struct tm *tb = NULL; + + /* Set a reproducible timestamp for __DATE__ and __TIME__ macro +- usage if SOURCE_DATE_EPOCH is defined. */ +- if (pfile->source_date_epoch != (time_t) -1) +- tb = gmtime (&pfile->source_date_epoch); ++ if SOURCE_DATE_EPOCH is defined. */ ++ if (pfile->source_date_epoch == (time_t) -2 ++ && pfile->cb.get_source_date_epoch != NULL) ++ pfile->source_date_epoch = pfile->cb.get_source_date_epoch (pfile); ++ ++ if (pfile->source_date_epoch >= (time_t) 0) ++ tb = gmtime (&pfile->source_date_epoch); + else + { + /* (time_t) -1 is a legitimate value for "number of seconds +-- +2.14.1 + -- 2.14.1 [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 487 bytes --] ^ permalink raw reply related [flat|nested] 20+ messages in thread
* Re: ‘core-updates’ is back! 2017-08-31 16:23 ` Marius Bakke @ 2017-08-31 17:18 ` Marius Bakke 2017-09-02 11:18 ` Marius Bakke 2017-09-02 21:01 ` Ludovic Courtès 1 sibling, 1 reply; 20+ messages in thread From: Marius Bakke @ 2017-08-31 17:18 UTC (permalink / raw) To: Ludovic Courtès; +Cc: guix-devel [-- Attachment #1: Type: text/plain, Size: 2023 bytes --] Marius Bakke <mbakke@fastmail.com> writes: > Ludovic Courtès <ludo@gnu.org> writes: > >> Marius Bakke <mbakke@fastmail.com> skribis: >> >>> Efraim Flashner <efraim@flashner.co.il> writes: >>> >>>> On Wed, Aug 30, 2017 at 09:10:42PM +0200, Marius Bakke wrote: >>>>> Since we're on the topic, I would like to switch to GCC 6 or 7 soon... >>>>> Are we agile enough to use the very latest GCC by default yet? :-) >>>> >>>> That would be nice to at least move to GCC 6. My aarch64 board is >>>> currently idle, I can see how well it works on my machine. >>> >>> The main issue with GCC 6 is that we need to port the SOURCE_DATE_EPOCH >>> patches again. But we might want to do that even if switching to 7. >> >> I think we should upgrade. My preference would be GCC 6, which I think >> may trigger fewer build failures than GCC 7, but maybe GCC 7 would be >> fine. >> >> Are you sure the SOURCE_DATE_EPOCH thing isn’t already in GCC 6? > > I just checked out the gcc-6_4_0-release tag and ran `git grep > SOURCE_DATE_EPOCH`. No results :/ > > However I tried cherry-picking the two commits and there was only one > trivial conflict in gcc/c-family/c-common.h (apart from ChangeLog > updates, which were omitted). Patch attached and building! It works! $ cat sde.c #include <stdio.h> int main() { printf( "__DATE__ says: %s \n", __DATE__ ); printf( "__TIME__ says: %s \n", __TIME__ ); return 0; } $ ./pre-inst-env guix environment --pure --ad-hoc gcc@6 binutils glibc bash: tty: command not found [env]$ gcc sde.c && ./a.out __DATE__ says: Aug 31 2017 __TIME__ says: 17:09:07 [env]$ SOURCE_DATE_EPOCH=1 gcc sde.c && ./a.out __DATE__ says: Jan 1 1970 __TIME__ says: 00:00:01 [env]$ SOURCE_DATE_EPOCH=-1 gcc sde.c && ./a.out sde.c: In function 'main': sde.c:4:5: error: environment variable SOURCE_DATE_EPOCH must expand to a non-negative integer less than or equal to 253402300799 printf( "__DATE__ says: %s \n", __DATE__ ); ^~~~~~ \o/ [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 487 bytes --] ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: ‘core-updates’ is back! 2017-08-31 17:18 ` Marius Bakke @ 2017-09-02 11:18 ` Marius Bakke 0 siblings, 0 replies; 20+ messages in thread From: Marius Bakke @ 2017-09-02 11:18 UTC (permalink / raw) To: Ludovic Courtès; +Cc: guix-devel [-- Attachment #1: Type: text/plain, Size: 1438 bytes --] Marius Bakke <mbakke@fastmail.com> writes: > Marius Bakke <mbakke@fastmail.com> writes: > >> Ludovic Courtès <ludo@gnu.org> writes: >> >>> Marius Bakke <mbakke@fastmail.com> skribis: >>> >>>> Efraim Flashner <efraim@flashner.co.il> writes: >>>> >>>>> On Wed, Aug 30, 2017 at 09:10:42PM +0200, Marius Bakke wrote: >>>>>> Since we're on the topic, I would like to switch to GCC 6 or 7 soon... >>>>>> Are we agile enough to use the very latest GCC by default yet? :-) >>>>> >>>>> That would be nice to at least move to GCC 6. My aarch64 board is >>>>> currently idle, I can see how well it works on my machine. >>>> >>>> The main issue with GCC 6 is that we need to port the SOURCE_DATE_EPOCH >>>> patches again. But we might want to do that even if switching to 7. >>> >>> I think we should upgrade. My preference would be GCC 6, which I think >>> may trigger fewer build failures than GCC 7, but maybe GCC 7 would be >>> fine. >>> >>> Are you sure the SOURCE_DATE_EPOCH thing isn’t already in GCC 6? >> >> I just checked out the gcc-6_4_0-release tag and ran `git grep >> SOURCE_DATE_EPOCH`. No results :/ >> >> However I tried cherry-picking the two commits and there was only one >> trivial conflict in gcc/c-family/c-common.h (apart from ChangeLog >> updates, which were omitted). Patch attached and building! > > It works! Is it okay to push this GCC-6 SOURCE_DATE_EPOCH patch to 'master'? [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 487 bytes --] ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: ‘core-updates’ is back! 2017-08-31 16:23 ` Marius Bakke 2017-08-31 17:18 ` Marius Bakke @ 2017-09-02 21:01 ` Ludovic Courtès 1 sibling, 0 replies; 20+ messages in thread From: Ludovic Courtès @ 2017-09-02 21:01 UTC (permalink / raw) To: Marius Bakke; +Cc: guix-devel Hey Marius, Marius Bakke <mbakke@fastmail.com> skribis: > However I tried cherry-picking the two commits and there was only one > trivial conflict in gcc/c-family/c-common.h (apart from ChangeLog > updates, which were omitted). Patch attached and building! Woohoo! > I also prefer going through GCC 6 before 7. Let's go for it, assuming > this patch works. > > From 329e016e35c51426ccf30aa2335bfd3ef12678a6 Mon Sep 17 00:00:00 2001 > From: Marius Bakke <mbakke@fastmail.com> > Date: Thu, 31 Aug 2017 18:13:08 +0200 > Subject: [PATCH] gnu: gcc@6: Respect SOURCE_DATE_EPOCH in __DATE__ and > __TIME__ macros. > > * gnu/packages/patches/gcc-6-source-date-epoch-1.patch, > gnu/packages/patches/gcc-6-source-date-epoch-2.patch: New files. > * gnu/local.mk (dist_patch_DATA): Register them. > * gnu/packages/gcc.scm (gcc-6)[source]: Use them. Looks OK to me for your favorite branch! (Could be both ‘master’ and ‘core-updates’ after all.) For the switch to GCC 6 in ‘core-updates’, you can get inspiration from commit b810a85019ab3c4ee1f889d0751b8eb06157dadc, and then do something like “guix build sed” for testing. Ludo’. ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: ‘core-updates’ is back! 2017-08-30 19:10 ` Marius Bakke 2017-08-30 20:16 ` Efraim Flashner @ 2017-08-30 21:17 ` Ricardo Wurmus 2017-08-30 21:51 ` Marius Bakke 1 sibling, 1 reply; 20+ messages in thread From: Ricardo Wurmus @ 2017-08-30 21:17 UTC (permalink / raw) To: Marius Bakke; +Cc: guix-devel Marius Bakke <mbakke@fastmail.com> writes: > Probably unrelated, but we also have to change the '--enable-kernel' > configure flag to say '3.2.0' since that is the minimum supported by > glibc 2.26. Does this mean that binaries built with Guix will need at least Linux 3.2.0 to be executed? -- Ricardo GPG: BCA6 89B6 3655 3801 C3C6 2150 197A 5888 235F ACAC https://elephly.net ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: ‘core-updates’ is back! 2017-08-30 21:17 ` Ricardo Wurmus @ 2017-08-30 21:51 ` Marius Bakke 0 siblings, 0 replies; 20+ messages in thread From: Marius Bakke @ 2017-08-30 21:51 UTC (permalink / raw) To: Ricardo Wurmus; +Cc: guix-devel [-- Attachment #1: Type: text/plain, Size: 640 bytes --] Ricardo Wurmus <rekado@elephly.net> writes: > Marius Bakke <mbakke@fastmail.com> writes: > >> Probably unrelated, but we also have to change the '--enable-kernel' >> configure flag to say '3.2.0' since that is the minimum supported by >> glibc 2.26. > > Does this mean that binaries built with Guix will need at least Linux > 3.2.0 to be executed? I believe so, according to the release notes[0]: * Linux kernel 3.2 or later is required at runtime, on all architectures supported by that kernel. (This is a change from version 2.25 only for x86-32 and x86-64.) [0] https://lists.gnu.org/archive/html/info-gnu/2017-08/msg00000.html [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 487 bytes --] ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: ‘core-updates’ is back! 2017-08-28 22:01 ‘core-updates’ is back! Ludovic Courtès 2017-08-29 8:44 ` Efraim Flashner @ 2017-08-29 9:14 ` Andy Wingo 2017-08-29 10:01 ` Ricardo Wurmus ` (2 more replies) 1 sibling, 3 replies; 20+ messages in thread From: Andy Wingo @ 2017-08-29 9:14 UTC (permalink / raw) To: Ludovic Courtès; +Cc: guix-devel On Tue 29 Aug 2017 00:01, ludo@gnu.org (Ludovic Courtès) writes: > Yup, I just created a new ‘core-updates’ branch by pushing > <https://bugs.gnu.org/27849>. Enjoy! > > Let’s freeze in one month, say Oct. 1st? It would be pretty cool if we could fix our O(n^2) problems in search paths in this core-updates -- basically whenever you go to create an environment, instead of making e.g. VAR=A:B:C:..., for all VARs (LIBRARY_PATH, PKG_CONFIG_PATH, etc), instead we make a union directory Z containing the union of A, B, C, etc and set VAR=Z. The goal would be to fix quadratic run-time lookup costs by replacing it with a compile-time computation. This applies to many lookups: PATH, -rpath, etc. For specific variables we might also have to rewrite some internal references, for example to replace the -L line in pkg-config files to point to the union directory. Dunno if there are more examples or if PKG_CONFIG_PATH is the only one. Andy ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: ‘core-updates’ is back! 2017-08-29 9:14 ` Andy Wingo @ 2017-08-29 10:01 ` Ricardo Wurmus 2017-08-29 13:36 ` 宋文武 2017-08-30 9:58 ` Ludovic Courtès 2 siblings, 0 replies; 20+ messages in thread From: Ricardo Wurmus @ 2017-08-29 10:01 UTC (permalink / raw) To: Andy Wingo; +Cc: guix-devel Andy Wingo <wingo@igalia.com> writes: > On Tue 29 Aug 2017 00:01, ludo@gnu.org (Ludovic Courtès) writes: > >> Yup, I just created a new ‘core-updates’ branch by pushing >> <https://bugs.gnu.org/27849>. Enjoy! >> >> Let’s freeze in one month, say Oct. 1st? > > It would be pretty cool if we could fix our O(n^2) problems in search > paths in this core-updates I agree, this would be very nice! -- Ricardo GPG: BCA6 89B6 3655 3801 C3C6 2150 197A 5888 235F ACAC https://elephly.net ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: ‘core-updates’ is back! 2017-08-29 9:14 ` Andy Wingo 2017-08-29 10:01 ` Ricardo Wurmus @ 2017-08-29 13:36 ` 宋文武 2017-08-30 9:58 ` Ludovic Courtès 2017-08-30 9:58 ` Ludovic Courtès 2 siblings, 1 reply; 20+ messages in thread From: 宋文武 @ 2017-08-29 13:36 UTC (permalink / raw) To: Andy Wingo; +Cc: guix-devel Andy Wingo <wingo@igalia.com> writes: > On Tue 29 Aug 2017 00:01, ludo@gnu.org (Ludovic Courtès) writes: > >> Yup, I just created a new ‘core-updates’ branch by pushing >> <https://bugs.gnu.org/27849>. Enjoy! >> >> Let’s freeze in one month, say Oct. 1st? > > It would be pretty cool if we could fix our O(n^2) problems in search > paths in this core-updates -- basically whenever you go to create an > environment, instead of making e.g. VAR=A:B:C:..., for all VARs > (LIBRARY_PATH, PKG_CONFIG_PATH, etc), instead we make a union directory > Z containing the union of A, B, C, etc and set VAR=Z. The goal would be > to fix quadratic run-time lookup costs by replacing it with a > compile-time computation. This applies to many lookups: PATH, -rpath, > etc. The runtime references scanner of daemon will be inefficient if the union gets recorded with all the inputs contained, and we likely won't apply this to packages with multiple outputs (eg: fcitx) which will make every output including the union into its runtime reference. ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: ‘core-updates’ is back! 2017-08-29 13:36 ` 宋文武 @ 2017-08-30 9:58 ` Ludovic Courtès 0 siblings, 0 replies; 20+ messages in thread From: Ludovic Courtès @ 2017-08-30 9:58 UTC (permalink / raw) To: 宋文武; +Cc: guix-devel iyzsong@member.fsf.org (宋文武) skribis: > Andy Wingo <wingo@igalia.com> writes: > >> On Tue 29 Aug 2017 00:01, ludo@gnu.org (Ludovic Courtès) writes: >> >>> Yup, I just created a new ‘core-updates’ branch by pushing >>> <https://bugs.gnu.org/27849>. Enjoy! >>> >>> Let’s freeze in one month, say Oct. 1st? >> >> It would be pretty cool if we could fix our O(n^2) problems in search >> paths in this core-updates -- basically whenever you go to create an >> environment, instead of making e.g. VAR=A:B:C:..., for all VARs >> (LIBRARY_PATH, PKG_CONFIG_PATH, etc), instead we make a union directory >> Z containing the union of A, B, C, etc and set VAR=Z. The goal would be >> to fix quadratic run-time lookup costs by replacing it with a >> compile-time computation. This applies to many lookups: PATH, -rpath, >> etc. > > The runtime references scanner of daemon will be inefficient if the > union gets recorded with all the inputs contained, and we likely won't > apply this to packages with multiple outputs (eg: fcitx) which will make > every output including the union into its runtime reference. Indeed, good point. Ludo’. ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: ‘core-updates’ is back! 2017-08-29 9:14 ` Andy Wingo 2017-08-29 10:01 ` Ricardo Wurmus 2017-08-29 13:36 ` 宋文武 @ 2017-08-30 9:58 ` Ludovic Courtès 2017-09-05 13:21 ` Ricardo Wurmus 2 siblings, 1 reply; 20+ messages in thread From: Ludovic Courtès @ 2017-08-30 9:58 UTC (permalink / raw) To: Andy Wingo; +Cc: guix-devel Andy Wingo <wingo@igalia.com> skribis: > On Tue 29 Aug 2017 00:01, ludo@gnu.org (Ludovic Courtès) writes: > >> Yup, I just created a new ‘core-updates’ branch by pushing >> <https://bugs.gnu.org/27849>. Enjoy! >> >> Let’s freeze in one month, say Oct. 1st? > > It would be pretty cool if we could fix our O(n^2) problems in search > paths in this core-updates -- basically whenever you go to create an > environment, instead of making e.g. VAR=A:B:C:..., for all VARs > (LIBRARY_PATH, PKG_CONFIG_PATH, etc), instead we make a union directory > Z containing the union of A, B, C, etc and set VAR=Z. The goal would be > to fix quadratic run-time lookup costs by replacing it with a > compile-time computation. This applies to many lookups: PATH, -rpath, > etc. A possible alternative solution for ld.so is at <https://bugs.gnu.org/26048>. I’m not entirely sure about the idea of creating union directories everywhere. A problem is that we’d be retaining lots of union directories, and even if they’re cheap, that could become non-negligible (for every package we’d have to download/build an extra derivation). It would also add an extra level of symlinks to go through when one is debugging things. Also, some tools might not notice that /abc…/lib/libfoo, /def…/lib/libfoo, and /123…/lib/libfoo actually are the same thing. Thoughts? Ludo’. ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: ‘core-updates’ is back! 2017-08-30 9:58 ` Ludovic Courtès @ 2017-09-05 13:21 ` Ricardo Wurmus 2017-09-05 14:57 ` bug#26048: " Ludovic Courtès 0 siblings, 1 reply; 20+ messages in thread From: Ricardo Wurmus @ 2017-09-05 13:21 UTC (permalink / raw) To: Ludovic Courtès; +Cc: guix-devel Andy wrote: > It would be pretty cool if we could fix our O(n^2) problems in search > paths in this core-updates -- basically whenever you go to create an > environment, instead of making e.g. VAR=A:B:C:..., for all VARs > (LIBRARY_PATH, PKG_CONFIG_PATH, etc), instead we make a union directory > Z containing the union of A, B, C, etc and set VAR=Z. The goal would be > to fix quadratic run-time lookup costs by replacing it with a > compile-time computation. This applies to many lookups: PATH, -rpath, > etc. Ludo wrote: > A possible alternative solution for ld.so is at > <https://bugs.gnu.org/26048>. Do you know of any negative side effects this would have? For example, would it not become impossible to override libraries at runtime with LD_LIBRARY_PATH or LD_PRELOAD when “-lfoo” is replaced by the absolute file name of the “foo” library? -- Ricardo GPG: BCA6 89B6 3655 3801 C3C6 2150 197A 5888 235F ACAC https://elephly.net ^ permalink raw reply [flat|nested] 20+ messages in thread
* bug#26048: ‘core-updates’ is back! 2017-09-05 13:21 ` Ricardo Wurmus @ 2017-09-05 14:57 ` Ludovic Courtès 0 siblings, 0 replies; 20+ messages in thread From: Ludovic Courtès @ 2017-09-05 14:57 UTC (permalink / raw) To: Ricardo Wurmus; +Cc: Andy Wingo, guix-devel, 26048 Ricardo Wurmus <rekado@elephly.net> skribis: > Andy wrote: > >> It would be pretty cool if we could fix our O(n^2) problems in search >> paths in this core-updates -- basically whenever you go to create an >> environment, instead of making e.g. VAR=A:B:C:..., for all VARs >> (LIBRARY_PATH, PKG_CONFIG_PATH, etc), instead we make a union directory >> Z containing the union of A, B, C, etc and set VAR=Z. The goal would be >> to fix quadratic run-time lookup costs by replacing it with a >> compile-time computation. This applies to many lookups: PATH, -rpath, >> etc. > > Ludo wrote: > >> A possible alternative solution for ld.so is at >> <https://bugs.gnu.org/26048>. > > Do you know of any negative side effects this would have? For example, > would it not become impossible to override libraries at runtime with > LD_LIBRARY_PATH or LD_PRELOAD when “-lfoo” is replaced by the absolute > file name of the “foo” library? Good question. Per the ELF v1.2 spec¹ (page 82), setting DT_NEEDED to an absolute file name would prevent overriding via LD_LIBRARY_PATH, which is not desirable. It turns out we cannot even set DT_NEEDED to an absolute file name in the first place, because ld records the DT_SONAME of the library, when it’s available (which is the case most of the time), rather than its file name. IOW, the approach suggested in <https://bugs.gnu.org/26048> isn’t really applicable. :-/ Ludo’. ¹ http://refspecs.linuxbase.org/elf/elf.pdf ^ permalink raw reply [flat|nested] 20+ messages in thread
end of thread, other threads:[~2017-09-05 14:57 UTC | newest] Thread overview: 20+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2017-08-28 22:01 ‘core-updates’ is back! Ludovic Courtès 2017-08-29 8:44 ` Efraim Flashner 2017-08-30 9:30 ` Efraim Flashner 2017-08-30 19:10 ` Marius Bakke 2017-08-30 20:16 ` Efraim Flashner 2017-08-30 20:37 ` Marius Bakke 2017-08-31 14:44 ` Ludovic Courtès 2017-08-31 16:23 ` Marius Bakke 2017-08-31 17:18 ` Marius Bakke 2017-09-02 11:18 ` Marius Bakke 2017-09-02 21:01 ` Ludovic Courtès 2017-08-30 21:17 ` Ricardo Wurmus 2017-08-30 21:51 ` Marius Bakke 2017-08-29 9:14 ` Andy Wingo 2017-08-29 10:01 ` Ricardo Wurmus 2017-08-29 13:36 ` 宋文武 2017-08-30 9:58 ` Ludovic Courtès 2017-08-30 9:58 ` Ludovic Courtès 2017-09-05 13:21 ` Ricardo Wurmus 2017-09-05 14:57 ` bug#26048: " Ludovic Courtès
Code repositories for project(s) associated with this public inbox https://git.savannah.gnu.org/cgit/guix.git This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).