LINUX.ORG.RU

Не собирается gcc под Guix

 , , , ,


0

1

Лорушка, только на тебя надежда.

Пытаюсь перенести свои рабочие процессы на Guix, для чего нужно научиться собирать buildroot и coreboot. Общая проблема - не собирается gcc из исходников.

Проблему описал в баг-трекере, там же описал лёгкий способ воспроизведения: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=41091

Ошибки:

In file included from ./bconfig.h:3:0,
                 from ../../gcc/gengtype-lex.c:4:
./auto-host.h:2396:16: error: declaration does not declare anything [-fpermissive]
 #define rlim_t long
                ^
In file included from /d/gcc-8.4.0/gcc-8.4.0/gcc/gengtype-lex.l:30:0:
../../gcc/system.h:488:14: error: conflicting declaration of C function ‘void* sbrk(int)’
 extern void *sbrk (int);

In file included from /d/gcc-8.4.0/gcc-8.4.0/gcc/gengtype-lex.l:30:0:
../../gcc/system.h:496:14: error: ambiguating new declaration of ‘char* strstr(const char*, const char*)’
 extern char *strstr (const char *, const char *);

In file included from /d/gcc-8.4.0/gcc-8.4.0/gcc/gengtype-lex.l:30:0:
../../gcc/system.h:540:20: error: conflicting declaration of C function ‘const char* strsignal(int)’
 extern const char *strsignal (int);

In file included from ../../gcc/system.h:691:0,
                 from /d/gcc-8.4.0/gcc-8.4.0/gcc/gengtype-lex.l:30:
../../gcc/../include/libiberty.h:112:14: error: ambiguating new declaration of ‘char* basename(const char*)’
 extern char *basename (const char *) ATTRIBUTE_RETURNS_NONNULL ATTRIBUTE_NONNULL(1);

Изменения версий компилятора (собираемого или хостового) не особо помогают, ошибки на месте.

Может какой-нибудь опытный пользователь Guix или собиратель GCC знает, как с этим бороться? Ошибка вроде гуглится, но толкового решения я не могу найти.

Помогите, пожалуйста.

Не воспроизводится

Я бы такой тикет закрыл с пометкой «не воспроизводится». Не указано из какого scm собирается, какой версии. Не собирается непонятно какой GCC непонятно где. Ну и пусть не собирается.

Camel ★★★★★ ()
Ответ на: Не воспроизводится от Camel

Утконос говорит жёстко, но справедливо.

В примере пытался собрать gcc 8.4 из состава Buildroot с помощью стандартного хостового gcc 7.4. Кроме того, пробовал собирать 6 и 7 из Buildroot с помощью хостовых 8.4 и 9.3. Ошибка одинаковая.

Воспроизвести легко:

wget https://buildroot.org/downloads/buildroot-2020.02.1.tar.gz
tar -xf buildroot-2020.02.1.tar.gz
cd buildroot-2020.02.1
make menuconfig # save default
make
На других дистрибутивах, которыми я пользуюсь, всё ок.

Конфиг системы: https://pastebin.com/4w6FKtBW

Можешь что-нибудь посоветовать?

happycorsair ()
Ответ на: комментарий от happycorsair

guix побери

Воу-воу-воу, палехчи. Что это за wget и make. Мы же про guix говорили. Я ожидал увидеть что-то такое:

(define* (make-gcc-toolchain gcc
                            #:optional
                            (libc #f))
  "Return a complete toolchain for GCC. If LIBC is specified, target that libc."
  (let ((gcc (if libc (make-gcc-libc gcc libc) gcc))
        (libc (if libc libc glibc-final)))
    (package
      (name (string-append (package-name gcc) "-toolchain"))
      (version (package-version gcc))
      (source #f)
      (build-system trivial-build-system)
      (arguments
       '(#:modules ((guix build union))
         #:builder (begin
                     (use-modules (ice-9 match)
                                  (srfi srfi-26)
                                  (guix build union))

                     (let ((out (assoc-ref %outputs "out")))

                       (match %build-inputs
                         (((names . directories) ...)
                          (union-build out directories)))

                       (union-build (assoc-ref %outputs "debug")
                                    (list (assoc-ref %build-inputs
                                                     "libc-debug")))
                       (union-build (assoc-ref %outputs "static")
                                    (list (assoc-ref %build-inputs
                                                     "libc-static")))
                       #t))))

      (native-search-paths (package-native-search-paths gcc))
      (search-paths (package-search-paths gcc))

      (license (package-license gcc))
      (synopsis "Complete GCC tool chain for C/C++ development")
      (description
       "This package provides a complete GCC tool chain for C/C++ development to
be installed in user profiles.  This includes GCC, as well as libc (headers and
binaries, plus debugging symbols in the @code{debug} output), and Binutils.")
      (home-page "https://gcc.gnu.org/")
      (outputs '("out" "debug" "static"))

      ;; The main raison d'être of this "meta-package" is (1) to conveniently
      ;; install everything that we need, and (2) to make sure ld-wrapper comes
      ;; before Binutils' ld in the user's profile.
      (inputs `(("gcc" ,gcc)
                ("ld-wrapper" ,(car (assoc-ref %final-inputs "ld-wrapper")))
                ("binutils" ,binutils-final)
                ("libc" ,libc)
                ("libc-debug" ,libc "debug")
                ("libc-static" ,libc "static"))))))

Camel ★★★★★ ()

gcc ожидает, что все хедеры будут свалены в одну кучу по закомпиленному в него пути, что в случае guix не соответствует реальности. Чтоб gcc работал, в guix экспортируется переменная окружения CPATH. К сожалению, при сборке тулчейнов её наличие приводит к какому-то безумию. В общем, до чего в buildroot дошёл я.

Введение:

> guix --version
guix (GNU Guix) 2bee789a47eb61d17945d6cb87700c9719ebe887

> ls
buildroot  buildroot.manifest

> git --work-tree=buildroot --git-dir=buildroot/.git describe
2020.05-rc1-9-ga896be19de

Файл манифеста:

> cat buildroot.manifest
(packages->manifest
(map specification->package
 (list
  "bash"
  "coreutils"
  "glibc-utf8-locales"
  "grep"
  "less"
  "sed"

  "bc"
  "bzip2"
  "cpio"
  "diffutils"
  "file"
  "findutils"
  "gawk"
  "gcc-toolchain"
  "glibc"
  "gzip"
  "help2man"
  "make"
  "ncurses"
  "patch"
  "perl"
  "python"
  "rsync"
  "tar"
  "texinfo"
  "unzip"
  "util-linux"
  "wget"
  "which"
  )))

Конфигурим, в дефолтном конфиге я ничего не трогал:

> guix environment --pure -m ./buildroot.manifest -- env TERM=xterm make -C buildroot menuconfig

Собираем, пока оно не упадёт с твоими ошибками:

> guix environment --pure -m ./buildroot.manifest -- make -C buildroot

Сносим каталог сборки хостового gcc, потому что во время его конфигура что-то пошло не так

> rm -rf buildroot/output/build/host-gcc-initial-8.4.0

Продолжаем сборку с инклудами linux-libre-headers и glibc в CPATH (кстати, если на той же версии guix пути будут отличаться - пиши):

> guix environment --pure -m ./buildroot.manifest -- env CPATH=/gnu/store/7czrqpi0kwazras6pgyx0bhdn89pg0jl-linux-libre-headers-4.19.56/include:/gnu/store/ahqgl4h89xqj695lgqvsaf6zh2nhy4pj-glibc-2.29/include/ make -C buildroot

Кросс-gcc собран, теперь оно падает на сборке libc.

> ./buildroot/output/build/host-gcc-initial-8.4.0/build/./gcc/xgcc --version
xgcc (Buildroot 2020.05-rc1) 8.4.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Дальше разбираться не стал, потому что в моей работе (нечто, производное от buildroot) я этот этап ещё не прошёл.

Если придумаешь более прямые способы, пиши.

Laz ★★★★ ()