public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
From: "Sergei Trofimovich" <slyfox@gentoo.org>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] proj/gcc-config:master commit in: /
Date: Fri, 24 Aug 2018 00:23:10 +0000 (UTC)	[thread overview]
Message-ID: <1535070167.153b36029749d2635a5b87d40e6cf8100b1340f2.slyfox@gentoo> (raw)

commit:     153b36029749d2635a5b87d40e6cf8100b1340f2
Author:     Sergei Trofimovich <slyfox <AT> gentoo <DOT> org>
AuthorDate: Fri Aug 24 00:22:47 2018 +0000
Commit:     Sergei Trofimovich <slyfox <AT> gentoo <DOT> org>
CommitDate: Fri Aug 24 00:22:47 2018 +0000
URL:        https://gitweb.gentoo.org/proj/gcc-config.git/commit/?id=153b3602

README: add basic description of how gcc-config works

Signed-off-by: Sergei Trofimovich <slyfox <AT> gentoo.org>

 README | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 103 insertions(+)

diff --git a/README b/README
new file mode 100644
index 0000000..06bf8fe
--- /dev/null
+++ b/README
@@ -0,0 +1,103 @@
+What is gcc-config?
+-------------------
+
+Gentoo allows switching gcc as system runs via gcc-config:
+    $ gcc-config x86_64-pc-linux-gnu-8.1.0
+    $ gcc-config x86_64-pc-linux-gnu-7.2.0
+
+Ideally changes should be visible instantly and atomically
+without shell restart. Practially see TODOs and BUGs on PATH/ROOTPATH.
+
+Files, variables, things.
+-------------------------
+
+- Wrappers (copies of /usr/$(libexec)/gcc-config/wrapper)
+    /usr/bin/gcc
+    /usr/bin/g++
+    /usr/bin/${CTARGET}-gcc
+    ...
+    (all files from /usr/${CTARGET}/gcc-bin/$GCC_VERSION/*)
+
+      Wrapper reads env config and re-execs binary from `GCC_PATH`.
+
+      See `gcc-config` script for wrapping details.
+
+- private gcc configs (provided by `toolchain.eclass`, gcc ebuilds)
+
+    /etc/env.d/gcc/.NATIVE -> x86_64-pc-linux-gnu-8.1.0 (link to target config)
+    /etc/env.d/gcc/x86_64-pc-linux-gnu-8.1.0
+
+      Contains variables that describe tolchain layout:
+
+          LDPATH="/usr/lib/gcc/x86_64-pc-linux-gnu/8.1.0"
+          MANPATH="/usr/share/gcc-data/x86_64-pc-linux-gnu/8.1.0/man"
+          INFOPATH="/usr/share/gcc-data/x86_64-pc-linux-gnu/8.1.0/info"
+          STDCXX_INCDIR="g++-v8"
+          CTARGET="x86_64-pc-linux-gnu"
+          GCC_SPECS=""
+          MULTIOSDIRS="../lib64"
+          GCC_PATH="/usr/x86_64-pc-linux-gnu/gcc-bin/8.1.0"
+
+      Used by gcc-config to generate wrappers and 05gcc- env.d files.
+      Used by wrapper to extract GCC_PATH and re-exec().
+
+- gcc env.d cross-compiler entries (provided by gcc-config)
+
+    /etc/env.d/05gcc-${CTARGET}
+
+      Populates paths for cross-compilers
+
+        PATH="/usr/x86_64-pc-linux-gnu/powerpc64le-unknown-linux-gnu/gcc-bin/7.3.0"
+        ROOTPATH="/usr/x86_64-pc-linux-gnu/powerpc64le-unknown-linux-gnu/gcc-bin/7.3.0"
+
+      Used by wrapper to extract PATH and re-exec().
+
+How does gcc-config work?
+-------------------------
+
+/usr/bin/gcc (or /usr/bin/<tool>) is a wrapper (wrapper.c).
+gcc-config allows runtime gcc switch via level of indirection.
+
+Tool name is ${CTARGET}-<tool> or <tool>. TODO: doesn't it break
+on ${CTARGET}-<tool>-<version>? Doesn't ${CTARGET} get misdetected?
+
+Today's resolution order is the following:
+
+1. Searches PATH for <tool> and reexecute if found. Some
+   target paths are ignored:
+   - itself (/usr/bin/<tool>) is ignored to avoid recursion
+   - */gcc-bin/* (/usr/${CHOST}/${CTARGET}/gcc-bin/7.3.0) is ignored
+     as those should precede in PATH to avoid wrapping entirely or be
+     selected via gcc-config.
+2. If [1.] failed search for /etc/env.d/: /etc/env.d/gcc/.NATIVE (native compiler),
+   /etc/env.d/05gcc-${CTARGET} (cross-compiler).
+
+   There GCC_PATH= (native) or PATH= (cross) directory entry is searched.
+
+   Usually it's GCC_PATH="${EPREFIX}/usr/${CHOST}/gcc-bin/<gcc-version>" (native)
+   or GCC_PATH="${EPREFIX}/usr/${CHOST}/${CTARGET}/gcc-bin/<gcc-version>" (cross)
+
+3. If [2.] failed run 'ROOT= gcc-config --get-bin-path' and use it's output.
+
+4. Prepend path fetched from above to PATH environment variable and re-exec().
+
+5. Done
+
+`gcc-config` script maintains binaries in `/usr/bin/` to make the above model work.
+
+To make compiler switchable in active shell `/usr/bin/` path must precede
+'/usr/${CHOST}/gcc-bin/<gcc-version>'. Otherwise wrapper is skipped.
+
+TODOs
+-----
+
+- Write proper `gcc-config` manpage off this readme to be more discoverable.
+
+- Make /usr/bin/<tool> a symlink of /usr/$(libexec)/gcc-config/wrapper,
+  not a file copy. This will make the fact that Gentoo uses wrappers more obvious.
+  It's essential to know for people using ccache cache or similar.
+
+- Move /etc/env.d/05gcc-${CTARGET} and /etc/env.d/04gcc-${CTARGET} after
+  /usr/bin PATH injection to restore gcc-config wrapping.
+
+  See https://bugs.gentoo.org/255695 for some details.


             reply	other threads:[~2018-08-24  0:23 UTC|newest]

Thread overview: 83+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-08-24  0:23 Sergei Trofimovich [this message]
  -- strict thread matches above, loose matches on Subject: below --
2023-05-31  5:55 [gentoo-commits] proj/gcc-config:master commit in: / Sam James
2023-05-31  5:54 Sam James
2023-05-14 17:25 Sam James
2023-04-30  2:59 Sam James
2023-01-05  0:16 Sam James
2022-12-28 19:12 Sam James
2022-12-28 19:12 Sam James
2022-12-28 19:12 Sam James
2022-10-10 14:09 Sam James
2022-10-09 20:55 Sam James
2022-10-08 22:02 Sam James
2022-09-29 22:36 Sam James
2022-09-29 22:36 Sam James
2022-09-22 23:46 Sam James
2021-11-13  4:49 Sam James
2021-11-13  4:49 Sam James
2021-02-26  9:36 Sergei Trofimovich
2021-02-26  9:36 Sergei Trofimovich
2021-02-26  9:36 Sergei Trofimovich
2021-02-26  9:36 Sergei Trofimovich
2021-02-26  8:40 Sergei Trofimovich
2021-01-23 17:51 Sergei Trofimovich
2020-09-05 18:11 Sergei Trofimovich
2020-06-24 20:47 Sergei Trofimovich
2020-06-21 11:53 Sergei Trofimovich
2020-06-21 11:50 Sergei Trofimovich
2020-05-23  7:28 Sergei Trofimovich
2020-05-22 13:23 Sergei Trofimovich
2020-05-22 13:20 Sergei Trofimovich
2020-05-22 11:33 Sergei Trofimovich
2020-05-22 10:39 Sergei Trofimovich
2020-05-22 10:03 Sergei Trofimovich
2020-05-22  9:40 Sergei Trofimovich
2020-04-10 10:08 Sergei Trofimovich
2020-01-26 13:44 Sergei Trofimovich
2020-01-26 13:26 Sergei Trofimovich
2019-09-08  8:37 Sergei Trofimovich
2019-09-08  8:29 Sergei Trofimovich
2019-09-07 22:08 Sergei Trofimovich
2019-09-07  9:39 Sergei Trofimovich
2019-09-07  9:39 Sergei Trofimovich
2019-09-07  9:15 Sergei Trofimovich
2019-09-07  9:01 Sergei Trofimovich
2019-09-07  8:47 Sergei Trofimovich
2019-09-07  8:22 Sergei Trofimovich
2019-09-06  7:29 Sergei Trofimovich
2019-09-06  7:23 Sergei Trofimovich
2019-09-06  6:53 Sergei Trofimovich
2019-09-06  6:53 Sergei Trofimovich
2019-09-05 22:35 Sergei Trofimovich
2019-09-05  7:24 Sergei Trofimovich
2019-09-05  6:47 Sergei Trofimovich
2019-09-05  6:42 Sergei Trofimovich
2019-09-05  6:28 Sergei Trofimovich
2019-09-04 19:00 Sergei Trofimovich
2019-09-04 19:00 Sergei Trofimovich
2018-08-24 16:40 Sergei Trofimovich
2018-08-24  8:50 Sergei Trofimovich
2018-08-13 22:39 Sergei Trofimovich
2018-08-13 21:55 Sergei Trofimovich
2017-12-16 21:11 Andreas Hüttel
2017-12-16 20:15 Andreas Hüttel
2017-12-15  8:33 Fabian Groffen
2015-08-05  8:12 Mike Frysinger
2015-08-05  7:52 Mike Frysinger
2015-05-13  4:26 Ryan Hill
2013-05-22 23:54 Mike Frysinger
2013-01-12 17:20 Mike Frysinger
2013-01-12 17:17 Mike Frysinger
2013-01-12 17:14 Mike Frysinger
2013-01-12 17:05 Mike Frysinger
2013-01-02 18:30 Mike Frysinger
2013-01-02  3:52 Mike Frysinger
2012-12-29 21:08 Mike Frysinger
2012-11-19  6:52 Mike Frysinger
2012-11-19  1:11 Mike Frysinger
2012-11-19  1:11 Mike Frysinger
2012-06-10  4:00 Mike Frysinger
2012-06-10  4:00 Mike Frysinger
2012-04-14  1:22 Mike Frysinger
2012-04-14  1:22 Mike Frysinger
2012-04-14  1:22 Mike Frysinger

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1535070167.153b36029749d2635a5b87d40e6cf8100b1340f2.slyfox@gentoo \
    --to=slyfox@gentoo.org \
    --cc=gentoo-commits@lists.gentoo.org \
    --cc=gentoo-dev@lists.gentoo.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox