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.
next 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