Debian 10 (buster) - GCC 10.2.0 インストール(ソースビルド)!

Updated:


※この記事は3年以上前に投稿されたもので、情報が古い可能性があります。

Debian GNU/Linux 10.9.0 へ最新版 GCC をソースビルドでインストールする方法についての記録です。

0. 前提条件Permalink

  • Debian GNU/Linux 10.9.0 (buster; 64bit) での作業を想定。
  • 一般ユーザでの作業を想定。
  • パッケージ版 GCC インストール済み。(バージョンは 8.3.0 を想定)
  • 新たにインストールする GCC は 10.2.0 を想定。(当記事執筆時点で最新バージョン)
  • インストール先は “/usr/local/gcc-10.2.0” を想定。
  • コンパイルできるようにする言語は C, C++, Objective-C, Fortran とする。
  • インストール済みのパッケージ版 GCC は他のパッケージ管理等で影響が出ると面倒なのでアンインストールしない。
  • 念の為、インストール済みパッケージをアップデートしておく。

1. アーカイブダウンロードPermalink

ミラーサイト一覧「GCC mirror sites - GNU Project - Free Software Foundation (FSF)」から適当なサイトを選んでアーカイブ(サイズ:約123MiB)をダウンロードする。
そして、展開しておく。

$ wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-10.2.0/gcc-10.2.0.tar.gz
$ tar xvf gcc-10.2.0.tar.gz

2. 依存パッケージインストールPermalink

download_prerequisites を実行することで依存パッケージ(MPFR, GMP, MPC, ISL, CLOOG)がインストールされる。(シンボリックリンクが張られる)

$ cd gcc-10.2.0
$ ./contrib/download_prerequisites

3. ビルド&インストールPermalink

ビルド用ディレクトリを作成し、 configure, make, make install を行う。
C, C++, Objective-C, Objective-C++, Fortran, Java, Ada, Go がインストール可能であるが、今回は C, C++, Objective-C, Fortran をインストールする。

$ cd ..
$ mkdir build
$ cd build
$ ../gcc-10.2.0/configure --prefix=/usr/local/gcc-10.2.0 --enable-languages=c,c++,objc,fortran --disable-multilib --disable-bootstrap
$ make
$ sudo make install
  • configure--enable-languages でインストールする言語を指定する。
    今回は c,c++,objc,fortran とした。他に指定可能の言語は ada, go, java, obj-c++ で、全てインストールする場合は all を指定する。
    (インストールする言語を明示しない場合は、 C, C++, Objective-C, Fortran, Java がデフォルトでインストールされる)
  • configure--disable-multilib オプションは 32bit ライブラリを探そうとしないようにするために付加する。
    (現時点では 64bit のみの開発を想定しているため)
  • configure--disable-bootstrap は bootstrap ビルドを行わないオプション。
    コンパイルを3回繰り返して行い自分自身を完璧なものにするためのオプションらしいが、時間がかかるらしいので無効化(ビルド1回に)する。(それで問題ないようなので)
  • make -j4 等のように並列化して高速化を図ってもよいだろう。

ちなみに、当方の非力な環境では make に相当な時間がかかった。

4. シンボリックリンク設定Permalink

既にインストール済みの旧バージョンの GCC を共存させたいので、以下のようにパスの通っているディレクトリに名前を付けてシンボリックリンクを張る。

# sudo ln -s /usr/local/gcc-10.2.0/bin/gcc /usr/local/bin/gcc102
# sudo ln -s /usr/local/gcc-10.2.0/bin/g++ /usr/local/bin/g++102
# sudo ln -s /usr/local/gcc-10.2.0/bin/gfortran /usr/local/bin/gfortran102

5. ライブラリ PATH の設定Permalink

今回インストールした GCC 用のライブラリを使用するよう PATH を設定する。(シェル(bash, zsh 等)設定ファイルに記述を追加する)

File: ~/.profile

1
2
LD_LIBRARY_PATH="/usr/local/gcc-10.2.0/lib64:$LD_LIBRARY_PATH"
export LD_LIBRARY_PATH

そして、即反映

$ source ~/.profile

6. 動作確認Permalink

バージョンを表示させてインストールできているか確認してみる。(比較のために、既存のパッケージでインストールしたものと、今回ソースビルドでインストールしたもの)

$ gcc --version
gcc (Debian 8.3.0-6) 8.3.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.

$ g++ --version
g++ (Debian 8.3.0-6) 8.3.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.

$ gfortran --version
GNU Fortran (Debian 8.3.0-6) 8.3.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.

$ gcc102 --version
gcc102 (GCC) 10.2.0
Copyright (C) 2020 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.

$ g++102 --version
g++102 (GCC) 10.2.0
Copyright (C) 2020 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.

$ gfortran102 --version
GNU Fortran (GCC) 10.2.0
Copyright (C) 2020 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.

既存の GCC も今回ソースインストールした GCC も問題なくバージョン情報が表示されることを確認。

7. 動作確認・その2Permalink

実際に簡単なソースコードを作成し、ビルドして動作を確認してみる。
例として、1 から 100 までの総和を求めるコードを作成した。(C++, Objective-C はオブジェクト指向コーディング)

7-1. C テストPermalink

File: TestSumC.c

1
2
3
4
5
6
7
8
9
#include <stdio.h>

void main()
{
    int iMax = 100;
    int i, iSum;
    for (i = 1; i <= iMax; i++) iSum += i;
    printf("1 + ... + %d = %d\n", iMax, iSum);
}
$ gcc102 -o TestSumC TestSumC.c
$ ./TestSumC
1 + ... + 100 = 5050

7-2. C++ テストPermalink

File: TestSumCPP.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>

using namespace std;

class Proc
{
    int i;
    int iSum;
public:
    Proc();
    void calc(int);
    int  getSum();
};

Proc::Proc(){
    iSum = 0;
}

void Proc::calc(int m)
{
    for (i = 1; i <= m; i++) iSum += i;
}
int Proc::getSum() {
    return iSum;
}

int main()
{
    int iMax = 100;
    Proc objMain;
    objMain.calc(iMax);
    cout << "1 + ... + " << iMax << " = " << objMain.getSum() << endl;
    return 0;
}
$ g++102 -o TestSumCpp TestSumCpp.cpp
$ ./TestSumCPP
1 + ... + 100 = 5050

7-3. Objective-C テストPermalink

(Debian 環境では、 Object でなく NSObject を継承するために libgnustep-base-dev がインストール済みであること)

File: TestSumM.m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#import <Foundation/NSObject.h>

@interface Proc: NSObject {
    int i;
    int iSum;
}
-init;
-calc :(int) m;
-(int) getSum;
@end

@implementation Proc
-init
{
    iSum = 0;
    return self;
}
-calc :(int) m
{
    for (i = 1; i <= m; i++) iSum += i;
    return self;
}
-(int) getSum { return iSum; }
@end

int main() {
    int iMax = 100;
    id objMain = [[Proc alloc] init];
    [objMain calc: iMax];
    printf("1 + ... + %d = %d\n", iMax, [objMain getSum]);
    return 0;
}
$ g++102 -o TestSumM TestSumM.m -lobjc -lgnustep-base -I/usr/include/GNUstep
$ ./TestSumM
1 + ... + 100 = 5050

7-4. Fortran テストPermalink

File: TestSumF.f95

1
2
3
4
5
6
7
8
9
program TestSumF
  integer :: iMax = 100
  integer :: i, iSum = 0

  do i = 1, iMax
    iSum = iSum + i
  enddo
  write(*, "(a,i3,a,i4) ") "1 + ... + ", iMax, " = ", iSum
end program TestSumF
$ gfortran102 -o TestSumF TestSumF.f95
$ ./TestSumF
1 + ... + 100 = 5050

8. 参考サイトPermalink

インストールに関しては


通常はパッケージでインストールできる GCC で十分でしょうが、新しい機能を標準で利用したかったらソースからインストールしてみるのもよいでしょう。

以上。





 

Sponsored Link

 

Comments