ALT Linux Team development discussions
 help / color / mirror / Atom feed
From: Alexander Bokovoy <a.bokovoy@sam-solutions.net>
To: devel@altlinux.ru
Cc: force@altlinux.org, ldv@altlinux.org
Subject: [devel] ccache support in gcc-common
Date: Wed, 17 Sep 2003 19:13:32 +0300
Message-ID: <20030917161332.GB15174@sam-solutions.net> (raw)

Greetings!

Предлагаю следующее добавление в gcc_wrapper, которое позволит наиболее
элегантным путем (как мне кажется) интегрировать ccache в сборочные
системы. Дело в том, что в текущий момент времени у нас есть следующие
проблемы с интеграцией в BTE:

1. Мы используем альтернативы для подмены gcc/g++/cpp на ccache так, чтобы
пакеты, которые не умеют смотреть на переменные окружения (например, CC)
работали с ccache.

2. Мы вынуждены прикладывать небольшой патч на ccache, чтобы вычислять,
кого же вызывать для реального выполнения задания (gcc/g++/cpp).

Однако у нас в системе уже есть gcc-common, а в нем gcc_wrapper, который
выполняет вызов архитектурно-зависимого компилятора (i586-alt-linux). 
Делает он следующее:

1. Вычисляет имя архитектурно-зависимого компилятора, по умолчанию считая,
что вызывают gcc (i586-alt-linux-gcc).

2. Если установлена переменная окружения GCC_VERSION, то добавляет к этому
имени указанную версию и %bindir.

3. Вызывает получившуюся программу, передавая ей те же параметры, что и
были получены самим gcc_wrapper.

Что при этом происходит, можно понять по strace:

$ strace -e trace=process gcc_wrapper -V 3.2 -v
execve("/usr/bin/gcc_wrapper", ["gcc_wrapper", "-V", "3.2", "-v"], [/* 49 vars */]) = 0
execve("/usr/bin/i586-alt-linux-gcc", ["i586-alt-linux-gcc", "-V", "3.2", "-v"], [/* 49 vars */]) = 0
Using builtin specs.
gcc driver version 2.96 20000731 (ALT Linux, build 2.96-alt3) executing
gcc version 3.2
_exit(0)

Поскольку ccache работает по похожему принципу, можно вместо запуска
вычисленной программы (%bindir/%targetplatform-<gcc>-$GCC_VERSION)
запускать ccache, подставляя ему в качестве имени программы
архитектурно-зависимое имя компилятора -- i586-alt-linux-gcc-$GCC_VERSION

Получается следующее:

$ GCC_USE_CCACHE=1 strace -e trace=process ./gcc_wrapper -V 3.2 -v
execve("./gcc_wrapper", ["./gcc_wrapper", "-V", "3.2", "-v"], [/* 50 vars */]) = 0
execve("/usr/bin/ccache", ["i586-alt-linux-gcc", "-V", "3.2", "-v"], [/* 50 vars */]) = 0
execve("/usr/bin/i586-alt-linux-gcc", ["/usr/bin/i586-alt-linux-gcc", "-V", "3.2", "-v"], [/* 50 vars */]) = 0
Using builtin specs.
gcc driver version 2.96 20000731 (ALT Linux, build 2.96-alt3) executing
gcc version 3.2
_exit(0) 

То есть, мы производим прозрачный запуск ccache, который уже сам
расправляется с тем, кого же надо будет запустить, по переданному ему
имени программы (i586-alt-linux-gcc в данном случае). Механизм сработает, 
поскольку архитектурно-зависимые компиляторы представляют собой нормальные
исполняемые файлы, а не символические ссылки, управляемые альтернативами.

Заметьте, что в указанном примере я специально использовал опцию -V у gcc
для показа возможности интеграции с gcc-драйвером по вызову компилятора,
отличного по версии от запускаемого. То есть, все возможности
оригинального gcc при этом сохранены, для него все прозрачно -- он даже не
будет знать, что запускается с кэшированием.

Что при этом мы получаем:

1. ccache не требует модификаций.

2. Не требуется модификация альтернатив для подстановки ccache перед gcc.

3. ccache интегрируется в любое окружение, не только в BTE -- достаточно
поставить пакет ccache и выставить переменную окружения GCC_USE_CCACHE.

4. Не возникает ограничений по использованию ccache вместе с distcc на
одной и той же платформе -- в новом ccache (2.2) используется специальный
механизм CCACHE_PREFIX для интеграции с distcc. Если бы мы использовали
этот же подход для интеграции с BTE, то мы бы лишились возможности легко
интегрироваться с distcc и фактически породили бы аналог gcc_wrapper,
запускаемый из ccache.

В чем мы себе отказываем:

А ни в чем :) Запуск компилятора с архитектурой, отличной от архитектуры
по умолчанию, по-прежнему возможен посредством опции -b <machine> в gcc.

Вот патч:

--- gcc_wrapper.c.orig	2002-11-28 14:44:31 +0200
+++ gcc_wrapper.c	2003-09-17 18:31:02 +0300
@@ -14,6 +14,7 @@
 	char *suffix = "", *name, *path;
 	const char *progname = strcmp (__progname, "gcc_wrapper") ? __progname : "gcc";
 	const char *version = getenv ("GCC_VERSION");
+	const char *use_ccache = getenv ("GCC_USE_CCACHE");
 
 	if (version)
 	{
@@ -29,7 +30,7 @@
 
 	if (asprintf (&name, "%s-%s%s", TARGET, progname, suffix) < 0)
 		error (EXIT_FAILURE, errno, "asprintf");
-	if (asprintf (&path, "%s/%s", BINDIR, name) < 0)
+	if (asprintf (&path, "%s/%s", BINDIR, (use_ccache) ? "ccache" : name) < 0)
 		error (EXIT_FAILURE, errno, "asprintf");
 
 	argv[0] = name;

Что нужно кроме него?

1. Убрать поддержку __ccache_cc/__ccache_cxx из rpm-build, они больше не
нужны.

2. Добавить выставление GCC_USE_CCACHE=1 в обработку __ccache_dir в
rpm-build.

Все. После этого исчезнет необходимость существования пакета ccache-bte и
все будет делаться в рамках gcc-common/ccache (без патчей!)/rpm-build.
Для того, чтобы активировать поддержку ccache в RPM надо будет только в
~/.macros поставить:

%__ccache_dir ~/.ccache или любой другой путь

-- 
/ Alexander Bokovoy
---
"He was a modest, good-humored boy.  It was Oxford that made him insufferable."


             reply	other threads:[~2003-09-17 16:13 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-09-17 16:13 Alexander Bokovoy [this message]
2003-09-17 16:21 ` [devel] " Alexey Tourbin
2003-09-17 12:41   ` Sergey Vlasov
2003-09-17 16:48   ` Alexander Bokovoy
2003-09-17 17:19     ` Alexey Tourbin
2003-09-17 17:29       ` Alexander Bokovoy
2003-09-18 10:28   ` Dmitry V. Levin
2003-09-22 14:08   ` Michael Shigorin
2003-09-17 18:23 ` [devel] " Dmitry V. Levin
2003-09-18  8:29   ` Alexander Bokovoy
2003-09-23  8:12     ` Dmitry V. Levin
2003-09-23  8:21       ` Alexander Bokovoy
2003-09-23  8:28         ` Dmitry V. Levin
2003-09-23  8:50           ` Alexander Bokovoy
2003-09-30 16:43             ` Dmitry V. Levin
2003-09-30 16:48               ` Alexander Bokovoy
2003-09-30 16:58                 ` Dmitry V. Levin
2003-10-02 14:02                   ` Alexander Bokovoy
2003-10-02 17:09                     ` Dmitry V. Levin
2003-10-16 11:18 ` Dmitry V. Levin

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=20030917161332.GB15174@sam-solutions.net \
    --to=a.bokovoy@sam-solutions.net \
    --cc=devel@altlinux.ru \
    --cc=force@altlinux.org \
    --cc=ldv@altlinux.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

ALT Linux Team development discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \
		devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru
	public-inbox-index devel

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.devel


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git