本記事はリライト中です。
Contents
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 alsofor 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$Prerequisites for GCC - GNU ProjectPrerequisites for GCC
エラーが出て停止しました。
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を推奨されました。
つづく
コメント