gccのソースはどこ

9-1.ソース・ビルド・インストール

本記事はリライト中です。

apt sourceでgccのソースを引っ張る

gccのソースが読みたくなりました。
ソースはどこでしょうか。
apt-get で引っ張れるでしょうか。

takk@deb9:~/gcc$ apt-get source gcc

~省略~

dpkg-source: info: extracting gcc-defaults in gcc-defaults-1.168
dpkg-source: info: unpacking gcc-defaults_1.168.tar.gz
takk@deb9:~/gcc$

なんか落ちてきました。

ファイルは自動で解凍されます。

takk@deb9:~/gcc$ ls
gcc-defaults-1.168  gcc-defaults_1.168.dsc  gcc-defaults_1.168.tar.gz
takk@deb9:~/gcc$ cd

展開されたディレクトリへ進んで中身をみてみます。

takk@deb9:~/gcc$ cd gcc-defaults-1.168/
takk@deb9:~/gcc/gcc-defaults-1.168$ ls
c89  c89.1  c99  c99.1  classpath.security  debian  gfdl.7  gpl.7
takk@deb9:~/gcc/gcc-defaults-1.168$

各ファイルの概要です。

takk@deb9:~/gcc/gcc-defaults-1.168$ file *
c89:                POSIX shell script, ASCII text executable
c89.1:              troff or preprocessor input, ASCII text
c99:                POSIX shell script, ASCII text executable
c99.1:              troff or preprocessor input, ASCII text
classpath.security: ASCII text
debian:             directory
gfdl.7:             troff or preprocessor input, ASCII text
gpl.7:              troff or preprocessor input, ASCII text
takk@deb9:~/gcc/gcc-defaults-1.168$

gccのソースは、debiandってディレクトリにあるのかなあ。

takk@deb9:~/gcc/gcc-defaults-1.168$ ls debian
README.Debian          control.source           gcc.prerm
README.Debian.m4       copyright                gdc.preinst
aot-compile            copyright.libgcj-common  generate-cacerts.pl.in
aotcompile.py          cpp.postinst             gfortran.postinst.in
changelog              cpp.prerm                gfortran.prerm
classfile.py           dh_javadoc               gij.prerm
compat                 dh_nativejava            libgcj-bc.overrides
control                disable_64_gcc           libgcj-common.postinst
control.cross-ada.in   g++.postinst.in          libgcj-common.preinst
control.cross-ml.in    g++.prerm                libgcj-common.prerm
control.cross.in       g77-doc.prerm            postinst-rebuild-gcj-db
control.doc            g77.postinst.in          postrm-rebuild-gcj-db
control.hppa64.in      g77.prerm                rebuild-gcj-db
control.native.in      gcc.postinst.in          rebuild-security-providers
control.pkg-config.in  gcc.preinst              rules
takk@deb9:~/gcc/gcc-defaults-1.168$

なんかいっぱいありますね。
めんどいので、c言語のソースを、探します。

takk@deb9:~/gcc/gcc-defaults-1.168$ find -name *.c
takk@deb9:~/gcc/gcc-defaults-1.168$

あれっ、見つかりません。
*.cで探しているので、cもなければ、cxxもないということでしょう。

apt-cache searchでgccソースを探す

前回gccのソースが見つかりませんでしたが、探し方が悪かったです。
もちろん、ネットを探せばすぐ見つかると思いますが、コマンドの達人を目指すため敢えて、コマンドだけで探したいです。

今回はapt-cacheで探してみます。

takk@deb9:~$ apt-cache search gcc | head
gcc-6-hppa64-linux-gnu - GNU C compiler (cross compiler for hppa64)
gcc-6-locales - GCC, the GNU compiler collection (native language support files)
gcc-6-multilib - GNU C compiler (multilib support)
gcc-6-source - Source of the GNU Compiler Collection
gcc-6-test-results - Test results for the GCC test suite
gccgo-6-multilib - GNU Go compiler (multilib support)
gcj-6 - GCJ byte code and native compiler for Java(TM)
gcj-6-jdk - GCJ and Classpath development tools for Java(TM)
gdc-6-multilib - GNU D compiler (version 2, multilib support)
gfortran-6-multilib - GNU Fortran compiler (multilib support)
takk@deb9:~$

gcc-6-sourceってのが怪しいです。落としてきましょう。

takk@deb9:~/gcc$ apt-get source gcc-6-source
パッケージリストを読み込んでいます... 完了
'gcc-6-source' の代わりに 'gcc-6' をソースパッケージとして選出しています
注意: 'gcc-6' パッケージは以下の場所の 'Svn' バージョン制御システムで保守されています:
svn://anonscm.debian.org/gcccvs/branches/sid/gcc-6
83.7 MB のソースアーカイブを取得する必要があります。
取得:1 http://security.debian.org/debian-security stretch/updates/main gcc-6 6.3.0-18+deb9u1 (dsc) [27.1 kB]
取得:2 http://security.debian.org/debian-security stretch/updates/main gcc-6 6.3.0-18+deb9u1 (tar) [81.6 MB]
19% [2 gcc-6 13.1 MB/81.6 MB 16%]

おっと、なんかサイズが大きそうです。期待できます。

ディレクトリはgccのバージョンがついているので、たぶん当たりです。すぐ見つかりましたね。

takk@deb9:~/gcc$ ls
gcc-6-6.3.0                    gcc-6_6.3.0-18+deb9u1.dsc
gcc-6_6.3.0-18+deb9u1.diff.gz  gcc-6_6.3.0.orig.tar.gz
takk@deb9:~/gcc$

さらにcd。

takk@deb9:~/gcc$ cd gcc-6-6.3.0/
takk@deb9:~/gcc/gcc-6-6.3.0$ ls
debian  gcc-6.3.0-dfsg.tar.xz  gdc-20161222.tar.xz
takk@deb9:~/gcc/gcc-6-6.3.0$

cソースを探してみます。

takk@deb9:~/gcc/gcc-6-6.3.0$ find -name *.c
takk@deb9:~/gcc/gcc-6-6.3.0$

見つかりませんでした。圧縮されている他のファイルっぽいですね。
解凍します。

takk@deb9:~/gcc/gcc-6-6.3.0$ tar xJf gcc-6.3.0-dfsg.tar.xz
takk@deb9:~/gcc/gcc-6-6.3.0$ ls
debian  gcc-6.3.0  gcc-6.3.0-dfsg.tar.xz  gdc-20161222.tar.xz
takk@deb9:~/gcc/gcc-6-6.3.0$ cd gcc-6.3.0/
takk@deb9:~/gcc/gcc-6-6.3.0/gcc-6.3.0$

lsを見ると、gccで間違いないさそうです。

takk@deb9:~/gcc/gcc-6-6.3.0/gcc-6.3.0$ ls
ABOUT-NLS           config        libcc1           libtool.m4
COPYING             config-ml.in  libcilkrts       libvtv
COPYING.LIB         config.guess  libcpp           ltgcc.m4
COPYING.RUNTIME     config.rpath  libdecnumber     ltmain.sh
COPYING3            config.sub    libffi           lto-plugin
COPYING3.LIB        configure     libgcc           ltoptions.m4
ChangeLog           configure.ac  libgfortran      ltsugar.m4
ChangeLog.jit       contrib       libgo            ltversion.m4
ChangeLog.tree-ssa  depcomp       libgomp          lt~obsolete.m4
INSTALL             fixincludes   libiberty        maintainer-scripts
LAST_UPDATED        gcc           libitm           missing
MAINTAINERS         gnattools     libjava          mkdep
MD5SUMS             gotools       libmpx           mkinstalldirs
Makefile.def        include       libobjc          move-if-change
Makefile.in         install-sh    liboffloadmic    symlink-tree
Makefile.tpl        intl          libquadmath      ylwrap
NEWS                libada        libsanitizer     zlib
README              libasan       libssp
boehm-gc            libatomic     libstdc++-v3
compile             libbacktrace  libtool-ldflags
takk@deb9:~/gcc/gcc-6-6.3.0/gcc-6.3.0$

最初に見るソースはどこがいいでしょうか。main.cソースとかあるでしょうか。
探してみます。

takk@deb9:~/gcc/gcc-6-6.3.0/gcc-6.3.0$ find -name main.c
./libgfortran/runtime/main.c
./gcc/main.c
./gcc/testsuite/gcc.c-torture/execute/builtins/lib/main.c
takk@deb9:~/gcc/gcc-6-6.3.0/gcc-6.3.0$

ありました。直観ですが、mainから見れば、きっと読みやすいに違いありません。
行数を確認。

takk@deb9:~/gcc/gcc-6-6.3.0/gcc-6.3.0$ wc -l gcc/main.c
40 gcc/main.c
takk@deb9:~/gcc/gcc-6-6.3.0/gcc-6.3.0$

大した処理はなさそうです。コマンド解析とかでしょうか。
行数が少ないので全文見てみます。

takk@deb9:~/gcc/gcc-6-6.3.0/gcc-6.3.0$ cat -n !$
cat -n gcc/main.c
     1  /* main.c: defines main() for cc1, cc1plus, etc.
     2     Copyright (C) 2007-2016 Free Software Foundation, Inc.
     3
     4  This file is part of GCC.
     5
     6  GCC is free software; you can redistribute it and/or modify it under
     7  the terms of the GNU General Public License as published by the Free
     8  Software Foundation; either version 3, or (at your option) any later
     9  version.
    10
    11  GCC is distributed in the hope that it will be useful, but WITHOUT ANY
    12  WARRANTY; without even the implied warranty of MERCHANTABILITY or
    13  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    14  for more details.
    15
    16  You should have received a copy of the GNU General Public License
    17  along with GCC; see the file COPYING3.  If not see
    18  <http://www.gnu.org/licenses/>.  */
    19
    20  #include "config.h"
    21  #include "system.h"
    22  #include "coretypes.h"
    23  #include "tm.h"
    24  #include "diagnostic-core.h"
    25  #include "toplev.h"
    26
    27  int main (int argc, char **argv);
    28
    29  /* We define main() to call toplev::main(), which is defined in toplev.c.
    30     We do this in a separate file in order to allow the language front-end
    31     to define a different main(), if it so desires.  */
    32
    33  int
    34  main (int argc, char **argv)
    35  {
    36    toplev toplev (NULL, /* external_timer */
    37                   true /* init_signals */);
    38
    39    return toplev.main (argc, argv);
    40  }
takk@deb9:~/gcc/gcc-6-6.3.0/gcc-6.3.0$

コマンド解析もしてませんでした。関数呼び出ししてるだけでしたね。

toplev.cを探す

gccつづきです。
前回main関数から、toplevを呼び出ししているところまで見ました。
ということで、toplev.cを探します。

takk@deb9:~/gcc/gcc-6-6.3.0/gcc-6.3.0$ find -name toplev.c
./gcc/toplev.c
takk@deb9:~/gcc/gcc-6-6.3.0/gcc-6.3.0$

短いソースでしょうか。

takk@deb9:~/gcc/gcc-6-6.3.0/gcc-6.3.0$ wc -l gcc/toplev.c
2150 gcc/toplev.c
takk@deb9:~/gcc/gcc-6-6.3.0/gcc-6.3.0$

なかなか長編です。となると見るのはヘッダが先でしょうか。

ヘッダの行数を確認。

takk@deb9:~/gcc/gcc-6-6.3.0/gcc-6.3.0$ find -name toplev.h
./gcc/toplev.h
takk@deb9:~/gcc/gcc-6-6.3.0/gcc-6.3.0$ wc -l gcc/toplev.h
101 gcc/toplev.h
takk@deb9:~/gcc/gcc-6-6.3.0/gcc-6.3.0$

短いので全文見てみます。
ソースを読むのは、アニメを見たり、ゲームをしたりするのと同じぐらい楽しいです。

takk@deb9:~/gcc/gcc-6-6.3.0/gcc-6.3.0$ cat -n gcc/toplev.h
     1  /* toplev.h - Various declarations for functions found in toplev.c
     2     Copyright (C) 1998-2016 Free Software Foundation, Inc.
     3
     4  This file is part of GCC.
     5
     6  GCC is free software; you can redistribute it and/or modify it under
     7  the terms of the GNU General Public License as published by the Free
     8  Software Foundation; either version 3, or (at your option) any later
     9  version.
    10
    11  GCC is distributed in the hope that it will be useful, but WITHOUT ANY
    12  WARRANTY; without even the implied warranty of MERCHANTABILITY or
    13  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    14  for more details.
    15
    16  You should have received a copy of the GNU General Public License
    17  along with GCC; see the file COPYING3.  If not see
    18  <http://www.gnu.org/licenses/>.  */
    19
    20  #ifndef GCC_TOPLEV_H
    21  #define GCC_TOPLEV_H
    22
    23  /* Decoded options, and number of such options.  */
    24  extern struct cl_decoded_option *save_decoded_options;
    25  extern unsigned int save_decoded_options_count;
    26
    27  class timer;
    28
    29  /* Invoking the compiler.  */
    30  class toplev
    31  {
    32  public:
    33    toplev (timer *external_timer,
    34            bool init_signals);
    35    ~toplev ();
    36
    37    int main (int argc, char **argv);
    38
    39    void finalize ();
    40
    41  private:
    42
    43    void start_timevars ();
    44
    45    bool m_use_TV_TOTAL;
    46    bool m_init_signals;
    47  };
    48
    49  extern void rest_of_decl_compilation (tree, int, int);
    50  extern void rest_of_type_compilation (tree, int);
    51  extern void init_optimization_passes (void);
    52  extern bool enable_rtl_dump_file (void);
    53
    54  /* In except.c.  Initialize exception handling.  This is used by the Ada
    55     and LTO front ends to initialize EH "on demand".  See lto-streamer-in.c
    56     and ada/gcc-interface/misc.c.  */
    57  extern void init_eh (void);
    58
    59  extern void announce_function (tree);
    60
    61  extern void wrapup_global_declaration_1 (tree);
    62  extern bool wrapup_global_declaration_2 (tree);
    63  extern bool wrapup_global_declarations (tree *, int);
    64
    65  extern void global_decl_processing (void);
    66
    67  extern void dump_memory_report (bool);
    68  extern void dump_profile_report (void);
    69
    70  extern void target_reinit (void);
    71
    72  /* A unique local time stamp, might be zero if none is available.  */
    73  extern unsigned local_tick;
    74
    75  /* True if the user has tagged the function with the 'section'
    76     attribute.  */
    77
    78  extern bool user_defined_section_attribute;
    79
    80  /* See toplev.c.  */
    81  extern int flag_rerun_cse_after_global_opts;
    82
    83  extern void print_version (FILE *, const char *, bool);
    84
    85  /* The hashtable, so that the C front ends can pass it to cpplib.  */
    86  extern struct ht *ident_hash;
    87
    88  /* Functions used to get and set GCC's notion of in what directory
    89     compilation was started.  */
    90
    91  extern const char *get_src_pwd         (void);
    92  extern bool set_src_pwd                (const char *);
    93
    94  /* Functions used to manipulate the random seed.  */
    95
    96  extern HOST_WIDE_INT get_random_seed (bool);
    97  extern const char *set_random_seed (const char *);
    98
    99  extern void initialize_rtl (void);
   100
   101  #endif /* ! GCC_TOPLEV_H */
takk@deb9:~/gcc/gcc-6-6.3.0/gcc-6.3.0$

ビルドする時に時間がかかったらエラーになるのでしょうか、タイマーを使ってるのが不思議に感じます。

インクルードヘッダを確認する

続いてtoplev.cを読んでいきます。
まず確認したいのは、インクルードヘッダでしょうか。

takk@deb9:~/gcc/gcc-6-6.3.0/gcc-6.3.0/gcc$ grep ^#include toplev.c
#include "config.h"
#include "system.h"
#include "coretypes.h"
#include "backend.h"
#include "target.h"
#include "rtl.h"
#include "tree.h"
#include "gimple.h"
#include "alloc-pool.h"
#include "timevar.h"
#include "tm_p.h"
#include "optabs-libfuncs.h"
#include "insn-config.h"
#include "ira.h"
#include "recog.h"
#include "cgraph.h"
#include "coverage.h"
#include "diagnostic.h"
#include "varasm.h"
#include "tree-inline.h"
#include "realmpfr.h"   /* For GMP/MPFR/MPC versions, in print_version.  */
#include "version.h"
#include "flags.h"
#include "insn-attr.h"
#include "output.h"
#include "toplev.h"
#include "expr.h"
#include "intl.h"
#include "tree-diagnostic.h"
#include "params.h"
#include "reload.h"
#include "lra.h"
#include "dwarf2asm.h"
#include "debug.h"
#include "common/common-target.h"
#include "langhooks.h"
#include "cfgloop.h" /* for init_set_costs */
#include "hosthooks.h"
#include "opts.h"
#include "opts-diagnostic.h"
#include "asan.h"
#include "tsan.h"
#include "plugin.h"
#include "context.h"
#include "pass_manager.h"
#include "auto-profile.h"
#include "dwarf2out.h"
#include "ipa-reference.h"
#include "symbol-summary.h"
#include "ipa-prop.h"
#include "gcse.h"
#include "tree-chkp.h"
#include "omp-low.h"
#include "hsa.h"
#include "dbxout.h"
#include "sdbout.h"
#include "xcoffout.h"           /* Needed for external data declarations. */
takk@deb9:~/gcc/gcc-6-6.3.0/gcc-6.3.0/gcc$

たくさんありますが、これ全部gccのヘッダなんでしょうか。

適当にヘッダを選んでエディタで開いてみると、

takk@deb9:~/gcc/gcc-6-6.3.0/gcc-6.3.0/gcc$ head backend.h
~省略~

This file is part of GCC.

~省略~

GCCの一部です、の一文あります。

toplev.cからインクルードしている全部のヘッダにこの文が書かれているか確認してみましょう。

#includeの””の間の文字列を引っこ抜いて一覧にして、grepします。

takk@deb9:~/gcc/gcc-6-6.3.0/gcc-6.3.0/gcc$ perl -ne'if(/#include..(.*)\".*/){print"$1\n"}' toplev.c | xargs grep -l 'This.file.is.part.of.GCC'
grep: config.h: そのようなファイルやディレクトリはありません
system.h
coretypes.h
backend.h
rtl.h
tree.h
gimple.h
alloc-pool.h
timevar.h
grep: tm_p.h: そのようなファイルやディレクトリはありません
optabs-libfuncs.h
grep: insn-config.h: そのようなファイルやディレクトリはありません
ira.h
recog.h
cgraph.h
coverage.h
diagnostic.h
varasm.h
tree-inline.h
realmpfr.h
flags.h
grep: insn-attr.h: そのようなファイルやディレクトリはありません
output.h
toplev.h
expr.h
tree-diagnostic.h
params.h
reload.h
lra.h
dwarf2asm.h
langhooks.h
cfgloop.h
hosthooks.h
opts.h
opts-diagnostic.h
asan.h
tsan.h
plugin.h
context.h
pass_manager.h
auto-profile.h
dwarf2out.h
ipa-reference.h
symbol-summary.h
ipa-prop.h
gcse.h
tree-chkp.h
omp-low.h
hsa.h
dbxout.h
sdbout.h
xcoffout.h
takk@deb9:~/gcc/gcc-6-6.3.0/gcc-6.3.0/gcc$

あるものを探しても見づらいだけですね。ヒットしないファイルの一覧にします。

grepでヒットしないファイルの一覧を得るには、-Lを使います。

takk@deb9:~/gcc/gcc-6-6.3.0/gcc-6.3.0/gcc$ perl -ne'if(/#include..(.*)\".*/){print"$1\n"}' toplev.c | xargs grep -L 'This.file.is.part.of.GCC'
grep: config.h: そのようなファイルやディレクトリはありません
target.h
grep: tm_p.h: そのようなファイルやディレクトリはありません
grep: insn-config.h: そのようなファイルやディレクトリはありません
version.h
grep: insn-attr.h: そのようなファイルやディレクトリはありません
intl.h
debug.h
common/common-target.h
takk@deb9:~/gcc/gcc-6-6.3.0/gcc-6.3.0/gcc$

config.h等見つからなかったファイルは分かりませんが、各ファイル、This file is~と書いてないだけで、gccのソースっぽかったです。

config.hを探す

前回見つからなかったファイルは4つありました。

grep: config.h: そのようなファイルやディレクトリはありません
grep: tm_p.h: そのようなファイルやディレクトリはありません
grep: insn-config.h: そのようなファイルやディレクトリはありません
grep: insn-attr.h: そのようなファイルやディレクトリはありません

上の階層まで戻って検索してみます。

takk@deb9:~/gcc/gcc-6-6.3.0$ find -name config.h
takk@deb9:~/gcc/gcc-6-6.3.0$

ありませんでした。となると、ビルド時に生成されるファイルでしょうか。
configure内にconfig.hのキーワードがあるかgrepしてみます。

takk@deb9:~/gcc/gcc-6-6.3.0$ grep -r config.h --include=configure* | wc -l
509
takk@deb9:~/gcc/gcc-6-6.3.0$

見つかりました。しかも、検索結果の中には、こんなコメントも。

gcc-6.3.0/libgomp/configure:    #    /* config.h.  Generated by config.status.  */

やはり生成されるファイルのようです。
では、configureを動かして見つからなかったファイルが生成されるか確認します。

takk@deb9:~/gcc/gcc-6-6.3.0/gcc-6.3.0$ ./configure
checking build system type... x86_64-pc-linux-gnu
checking host system type... x86_64-pc-linux-gnu
checking target system type... x86_64-pc-linux-gnu
checking for a BSD-compatible install... /usr/bin/install -c
checking whether ln works... yes
checking whether ln -s works... yes
checking for a sed that does not truncate output... /bin/sed
checking for gawk... gawk
checking for libatomic support... yes
checking for libcilkrts support... yes
checking for libitm support... yes
checking for libsanitizer support... yes
checking for libvtv support... yes
checking for libmpx support... yes
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking for g++... g++
checking whether we are using the GNU C++ compiler... yes
checking whether g++ accepts -g... yes
checking whether g++ accepts -static-libstdc++ -static-libgcc... yes
checking for gnatbind... no
checking for gnatmake... no
checking whether compiler driver understands Ada... no
checking how to compare bootstrapped objects... cmp --ignore-initial=16 $$f1 $$f2
checking for objdir... .libs
checking for the correct version of gmp.h... no
configure: error: Building GCC requires GMP 4.2+, MPFR 2.4.0+ and MPC 0.8.0+.
Try the --with-gmp, --with-mpfr and/or --with-mpc options to specify
their locations.  Source code for these libraries can be found at
their respective hosting sites as well as at
ftp://gcc.gnu.org/pub/gcc/infrastructure/.  See also
Prerequisites for GCC - GNU Project
Prerequisites for GCC
for additional info. If you obtained GMP, MPFR and/or MPC from a vendor distribution package, make sure that you have installed both the libraries and the header files. They may be located in separate packages. takk@deb9:~/gcc/gcc-6-6.3.0/gcc-6.3.0$

エラーが出て停止しました。

configure: error: Building GCC requires GMP 4.2+, MPFR 2.4.0+ and MPC 0.8.0+.

ん~。見知らぬツールです。
apt-cacheで関連してそうなパッケージを探します。

takk@deb9:~/gcc/gcc-6-6.3.0/gcc-6.3.0$ apt-cache search GMP
~他省略~
libgivaro-dev - arithmetic and algebraic computations - development files
libgivaro-doc - Documentation for Givaro
libgivaro9 - arithmetic and algebraic computations
libgmp-dev - Multiprecision arithmetic library developers tools
libgmp10-doc - Multiprecision arithmetic library example code
libgmp3-dev - Multiprecision arithmetic library developers tools
~他省略~

見慣れない単語が。
辞書を見るとmultiprecisionとは、多倍長整数のことみたいです。

libgmpが必要

続きです。
前回gccをビルドするのにlibgmpってのが必要なことが分かりました。

libgmp-dev - Multiprecision arithmetic library developers tools
libgmp10-doc - Multiprecision arithmetic library example code
libgmp3-dev - Multiprecision arithmetic library developers tools

上記2行目にexample codeってのがありますので、どんなものか見てみることにします。
では、インストール。codeなので、apt-get sourceなんでしょうか。

takk@deb9:~/tmp$ apt-get source libgmp10-doc
パッケージリストを読み込んでいます... 完了
'libgmp10-doc' の代わりに 'gmp' をソースパッケージとして選出しています
注意: 'gmp' パッケージは以下の場所の 'Svn' バージョン制御システムで保守されています:
svn://svn.debian.org/svn/debian-science/packages/gmp/trunk/
1,827 kB のソースアーカイブを取得する必要があります。
取得:1 http://ftp.jp.debian.org/debian stretch/main gmp 2:6.1.2+dfsg-1 (dsc) [2,183 B]
取得:2 http://ftp.jp.debian.org/debian stretch/main gmp 2:6.1.2+dfsg-1 (tar) [1,804 kB]
取得:3 http://ftp.jp.debian.org/debian stretch/main gmp 2:6.1.2+dfsg-1 (diff) [20.7 kB]
1,827 kB を 1秒 で取得しました (1,682 kB/s)
dpkg-source: info: extracting gmp in gmp-6.1.2+dfsg
dpkg-source: info: unpacking gmp_6.1.2+dfsg.orig.tar.xz
dpkg-source: info: unpacking gmp_6.1.2+dfsg-1.debian.tar.xz
takk@deb9:~/tmp$

ん~。ソースではなく、代わりに、gmpをインストールしてしまいました。
apt-get sourceではなかったようです。
apt-get installでlibgmp10-docを指定してみます。

takk@deb9:~/tmp$ sudo apt-get install libgmp10-doc
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージが新たにインストールされます:
  libgmp10-doc
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 109 個。
172 kB のアーカイブを取得する必要があります。
この操作後に追加で 249 kB のディスク容量が消費されます。
取得:1 http://ftp.jp.debian.org/debian stretch/main amd64 libgmp10-doc all 2:6.1.2+dfsg-1 [172 kB]
172 kB を 0秒 で取得しました (939 kB/s)
以前に未選択のパッケージ libgmp10-doc を選択しています。
(データベースを読み込んでいます ... 現在 180024 個のファイルとディレクトリがインストールされています。)
.../libgmp10-doc_2%3a6.1.2+dfsg-1_all.deb を展開する準備をしています ...
libgmp10-doc (2:6.1.2+dfsg-1) を展開しています...
libgmp10-doc (2:6.1.2+dfsg-1) を設定しています ...
takk@deb9:~/tmp$

今度は上手くいきました。

しかし、このサンプルコードは、どうやって見ればよいのでしょうか。
/usrの下を探してみます。

takk@deb9:~/tmp$ find /usr -name libgmp10
/usr/share/doc/libgmp10
takk@deb9:~/tmp$

ありました。すぐ見つかった良かったです。FHSに倣って/usr/share/docに入れるのが綺麗に自動で仕分けできて良いのでしょうねえ。

内容を見てみます。

takk@deb9:~/tmp$ cd /usr/share/doc/libgmp10
takk@deb9:/usr/share/doc/libgmp10$ ls
README.Debian  changelog.Debian.gz  copyright
takk@deb9:/usr/share/doc/libgmp10$

あれ、少ないです。
READMEの行数が多いのでしょうか。

takk@deb9:/usr/share/doc/libgmp10$ wc -l README.Debian
10 README.Debian
takk@deb9:/usr/share/doc/libgmp10$

10行しかありません。

takk@deb9:/usr/share/doc/libgmp10$ cat -n README.Debian
     1                  Documentation and Example Code
     2                  ------------------------------
     3
     4  Sadly, due to licensing the GMP documentation is no longer shipped in
     5  Debian.  The package libgmp10-doc now contains only demo code.
     6
     7  Please see http://gmplib.org/manual/ for the documentation.
     8
     9
    10   -- Steve M. Robbins <smr@debian.org>, Sat, 06 Nov 2010 18:00:53 -0500
takk@deb9:/usr/share/doc/libgmp10$

なんと。
やはりいまどきは、Webサイトを読むべきなのでしょうか。

英語のサイトを読む

gccソース続きです。
gccのソースビルドをするため、configureを起動しましたが、gmpがどうのこうとエラーが出まして、gmpライブラリの壁にぶち当たり中です。
前回インストールしたsample codeからサイトへいざなわれたので、確認してみます。
http://gmplib.org/manual/


日本語版もあります。https://na-inet.jp/na/gmp_ja/

英語でも日本語でも、私はたぶん意味が分からないので、目が疲れない英語の方を読むことにします。
と、思いましたが、読み始める前に、ずっと見落としていたバージョンに気づきました。
GNU MP 6.1.2
とタイトルに書いてあります。
あれ。。。gccのconfigureで出てたエラーはこのバージョンでしたっけ。

2個前のブログ記事から抜粋。

configure: error: Building GCC requires GMP 4.2+, MPFR 2.4.0+ and MPC 0.8.0+.

GMP 4.2+とあります。+とあるので、4.2以上ってことですね。

しかし、前回インストールしたexample codeパッケージは、10とあります。

libgmp10-doc - Multiprecision arithmetic library example code

どいういうことでしょう。apt-cache searchしてみます。

takk@deb9:~/gcc/gcc-6-6.3.0/gcc-6.3.0$ apt-cache search libgmp
libstrongswan - strongSwan utility and crypto library
libgmp10 - 多倍長精度演算ライブラリ
libgmpada4 - GNU 多倍長精度ライブラリの Ada バインディング: 共有ライブラリ
libgmpxx4ldbl - 多倍長精度演算ライブラリ (C++ バインディング)
libnettle6 - 低レベル暗号化ライブラリ (対称および一方向の暗号)
libgmp-dev - Multiprecision arithmetic library developers tools
libgmp10-doc - Multiprecision arithmetic library example code
libgmp3-dev - Multiprecision arithmetic library developers tools
libcrypt-dh-gmp-perl - Crypt::DH replacement that uses GMP directly
libgmpada6-dev - Ada binding to the GNU MultiPrecision library: development
libgmp-ocaml - OCaml bindings for the GNU multiprecision arithmetic library
libgmp-ocaml-dev - OCaml bindings for the GNU multiprecision arithmetic library
libhogweed4 - low level cryptographic library (public-key cryptos)
takk@deb9:~/gcc/gcc-6-6.3.0/gcc-6.3.0$

一番大きな数字は、libgmp10ですね。
公式サイトは6.1.2で、aptのパッケージはlibgmp10。どういうことでしょう。
もう、いろいろ面倒なので、インストール。数字がついていないlibgmp-devというパッケージを選んでみます。

takk@deb9:~/gcc/gcc-6-6.3.0/gcc-6.3.0$ sudo apt-get install libgmp-dev
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
  libgmpxx4ldbl
提案パッケージ:
  gmp-doc libmpfr-dev
以下のパッケージが新たにインストールされます:
  libgmp-dev libgmpxx4ldbl
アップグレード: 0 個、新規インストール: 2 個、削除: 0 個、保留: 109 個。
653 kB のアーカイブを取得する必要があります。
この操作後に追加で 1,971 kB のディスク容量が消費されます。
続行しますか? [Y/n]
取得:1 http://ftp.jp.debian.org/debian stretch/main amd64 libgmpxx4ldbl amd64 2:6.1.2+dfsg-1 [22.2 kB]
取得:2 http://ftp.jp.debian.org/debian stretch/main amd64 libgmp-dev amd64 2:6.1.2+dfsg-1 [631 kB]
653 kB を 0秒 で取得しました (1,119 kB/s)
以前に未選択のパッケージ libgmpxx4ldbl:amd64 を選択しています。
(データベースを読み込んでいます ... 現在 180081 個のファイルとディレクトリがインストールされています。)
.../libgmpxx4ldbl_2%3a6.1.2+dfsg-1_amd64.deb を展開する準備をしています ...
libgmpxx4ldbl:amd64 (2:6.1.2+dfsg-1) を展開しています...
以前に未選択のパッケージ libgmp-dev:amd64 を選択しています。
.../libgmp-dev_2%3a6.1.2+dfsg-1_amd64.deb を展開する準備をしています ...
libgmp-dev:amd64 (2:6.1.2+dfsg-1) を展開しています...
libc-bin (2.24-11+deb9u3) のトリガを処理しています ...
libgmpxx4ldbl:amd64 (2:6.1.2+dfsg-1) を設定しています ...
libgmp-dev:amd64 (2:6.1.2+dfsg-1) を設定しています ...
libc-bin (2.24-11+deb9u3) のトリガを処理しています ...
takk@deb9:~/gcc/gcc-6-6.3.0/gcc-6.3.0$

ちらちら6.1.2というバージョンが見えますので、さきほど見たサイトのバージョンと同じものがインストールされたということでしょう。
ん~、10ってなんだったのでしょうか。

さて、libgmp 6.1.2がインストールされたのでしょうか。

takk@deb9:~/gcc/gcc-6-6.3.0/gcc-6.3.0$ find /usr/lib -name '*libgmp*'
/usr/lib/x86_64-linux-gnu/libgmpxx.a
/usr/lib/x86_64-linux-gnu/openssl-1.0.2/engines/libgmp.so
/usr/lib/x86_64-linux-gnu/libgmp.so.10.3.2
/usr/lib/x86_64-linux-gnu/libgmpxx.so
/usr/lib/x86_64-linux-gnu/libgmp.so
/usr/lib/x86_64-linux-gnu/libgmpxx.so.4.5.2
/usr/lib/x86_64-linux-gnu/libgmpxx.so.4
/usr/lib/x86_64-linux-gnu/libgmp.a
/usr/lib/x86_64-linux-gnu/libgmp.so.10
takk@deb9:~/gcc/gcc-6-6.3.0/gcc-6.3.0$

6.1.2ないです。
よくわからんです。
ってことはソースからインストールですね。

つづく

GMPのソースを入手

前回GMPを、apt-get installできなかったので、GMP(GNU MP)のソースを入手して、インストールすることにします。
まずは、公式サイト。https://gmplib.org/

takk@deb9:~/gcc$ wget https://gmplib.org/download/gmp/gmp-6.1.2.tar.lz

実行すると、ダウンロードされます。

--2018-11-18 21:18:45--  https://gmplib.org/download/gmp/gmp-6.1.2.tar.lz
gmplib.org (gmplib.org) をDNSに問いあわせています... 130.242.124.102
gmplib.org (gmplib.org)|130.242.124.102|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 1939430 (1.8M) [application/octet-stream]
`gmp-6.1.2.tar.lz' に保存中

gmp-6.1.2.tar.lz    100%[===================>]   1.85M  93.0KB/s    in 23s

2018-11-18 21:19:09 (83.8 KB/s) - `gmp-6.1.2.tar.lz' へ保存完了 [1939430/1939430]
takk@deb9:~/gcc$

lz形式のファイル、初めて使うかも。(日常的に使ってないので、使ったことあるかも忘れました)
いきなりコマンドが分かりません。man lzipします。

takk@deb9:~/gcc$ man lzip
lzip というマニュアルはありません
takk@deb9:~/gcc$

入ってませんでした。apt-getします。

takk@deb9:~/gcc$ sudo apt-get install lzip
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージが新たにインストールされます:
  lzip
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 109 個。
77.3 kB のアーカイブを取得する必要があります。
この操作後に追加で 162 kB のディスク容量が消費されます。
取得:1 http://ftp.jp.debian.org/debian stretch/main amd64 lzip amd64 1.18-5 [77.3 kB]
77.3 kB を 0秒 で取得しました (599 kB/s)
以前に未選択のパッケージ lzip を選択しています。
(データベースを読み込んでいます ... 現在 180100 個のファイルとディレクトリがインストールされています。)
.../archives/lzip_1.18-5_amd64.deb を展開する準備をしています ...
lzip (1.18-5) を展開しています...
install-info (6.3.0.dfsg.1-1+b2) のトリガを処理しています ...
lzip (1.18-5) を設定しています ...
man-db (2.7.6.1-2) のトリガを処理しています ...
takk@deb9:~/gcc$

そしてman lzip。

LZIP(1)                          User Commands                         LZIP(1)

NAME
       lzip - reduces the size of files

SYNOPSIS
       lzip [options] [files]

DESCRIPTION
       Lzip - LZMA lossless data compressor.

OPTIONS
       -h, --help
              display this help and exit

       -V, --version
              output version information and exit

       -a, --trailing-error
              exit with error status if trailing data

       -b, --member-size=<bytes>
              set member size limit in bytes

       -c, --stdout
              write to standard output, keep input files

       -d, --decompress
              decompress

       -f, --force
              overwrite existing output files
~省略~

-dオプションを使えば良いようです。

takk@deb9:~/gcc$ ls
gcc-6-6.3.0                    gcc-6_6.3.0-18+deb9u1.dsc  gmp-6.1.2.tar.lz
gcc-6_6.3.0-18+deb9u1.diff.gz  gcc-6_6.3.0.orig.tar.gz
takk@deb9:~/gcc$ lzip -d gmp-6.1.2.tar.lz
takk@deb9:~/gcc$ ls
gcc-6-6.3.0                    gcc-6_6.3.0-18+deb9u1.dsc  gmp-6.1.2.tar
gcc-6_6.3.0-18+deb9u1.diff.gz  gcc-6_6.3.0.orig.tar.gz
takk@deb9:~/gcc$

tar.lzがtarに置き換わってしまいました。まあいいか。
tarファイルを展開します。

takk@deb9:~/gcc$ tar xf gmp-6.1.2.tar
takk@deb9:~/gcc$ ls
gcc-6-6.3.0                    gcc-6_6.3.0-18+deb9u1.dsc  gmp-6.1.2
gcc-6_6.3.0-18+deb9u1.diff.gz  gcc-6_6.3.0.orig.tar.gz    gmp-6.1.2.tar
takk@deb9:~/gcc$ cd gmp-6.1.2/
takk@deb9:~/gcc/gmp-6.1.2$ ls
AUTHORS           config.guess       gmp-h.in       mpq
COPYING           config.in          gmp-impl.h     mpz
COPYING.LESSERv3  config.sub         gmpxx.h        nextprime.c
COPYINGv2         configfsf.guess    install-sh     primesieve.c
COPYINGv3         configfsf.sub      invalid.c      printf
ChangeLog         configure          longlong.h     rand
INSTALL           configure.ac       ltmain.sh      scanf
INSTALL.autoconf  cxx                memory.c       tal-debug.c
Makefile.am       demos              mini-gmp       tal-notreent.c
Makefile.in       doc                missing        tal-reent.c
NEWS              errno.c            mp_bpl.c       test-driver
README            extract-dbl.c      mp_clz_tab.c   tests
acinclude.m4      gen-bases.c        mp_dv_tab.c    tune
aclocal.m4        gen-fac.c          mp_get_fns.c   version.c
assert.c          gen-fib.c          mp_minv_tab.c  ylwrap
bootstrap.c       gen-jacobitab.c    mp_set_fns.c
compat.c          gen-psqr.c         mpf
compile           gen-trialdivtab.c  mpn
takk@deb9:~/gcc/gmp-6.1.2$

では、configureから進めます。

takk@deb9:~/gcc/gmp-6.1.2$ ./configure

~省略~

config.status: executing libtool commands
configure: summary of build options:

  Version:           GNU MP 6.1.2
  Host type:         sandybridgenoavx-pc-linux-gnu
  ABI:               64
  Install prefix:    /usr/local
  Compiler:          gcc
  Static libraries:  yes
  Shared libraries:  yes

takk@deb9:~/gcc/gmp-6.1.2$

makeして、

takk@deb9:~/gcc/gmp-6.1.2$ make

~省略~

takk@deb9:~/gcc/gmp-6.1.2$

続けて、make install。

takk@deb9:~/gcc/gmp-6.1.2$ sudo make install

~省略~

+-------------------------------------------------------------+
| CAUTION:                                                    |
|                                                             |
| If you have not already run "make check", then we strongly  |
| recommend you do so.                                        |
|                                                             |
| GMP has been carefully tested by its authors, but compilers |
| are all too often released with serious bugs.  GMP tends to |
| explore interesting corners in compilers and has hit bugs   |
| on quite a few occasions.                                   |
|                                                             |
+-------------------------------------------------------------+

make[4]: ディレクトリ '/home/takk/gcc/gmp-6.1.2' から出ます
make[3]: ディレクトリ '/home/takk/gcc/gmp-6.1.2' から出ます
make[2]: ディレクトリ '/home/takk/gcc/gmp-6.1.2' から出ます
make[1]: ディレクトリ '/home/takk/gcc/gmp-6.1.2' から出ます
takk@deb9:~/gcc/gmp-6.1.2$

何でしょう。。。make checkを推奨されました。

つづく

コメント

タイトルとURLをコピーしました