Debian 10 (buster) - GCC 10.2.0 インストール(ソースビルド)!
Updated:
Debian GNU/Linux 10.9.0 へ最新版 GCC をソースビルドでインストールする方法についての記録です。
0. 前提条件
- 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. アーカイブダウンロード
ミラーサイト一覧「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. 依存パッケージインストール
download_prerequisites
を実行することで依存パッケージ(MPFR, GMP, MPC, ISL, CLOOG)がインストールされる。(シンボリックリンクが張られる)
$ cd gcc-10.2.0
$ ./contrib/download_prerequisites
3. ビルド&インストール
ビルド用ディレクトリを作成し、 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. シンボリックリンク設定
既にインストール済みの旧バージョンの 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 の設定
今回インストールした 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. 動作確認
バージョンを表示させてインストールできているか確認してみる。(比較のために、既存のパッケージでインストールしたものと、今回ソースビルドでインストールしたもの)
$ 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. 動作確認・その2
実際に簡単なソースコードを作成し、ビルドして動作を確認してみる。
例として、1 から 100 までの総和を求めるコードを作成した。(C++, Objective-C はオブジェクト指向コーディング)
7-1. C テスト
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++ テスト
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 テスト
(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 テスト
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. 参考サイト
インストールに関しては
通常はパッケージでインストールできる GCC で十分でしょうが、新しい機能を標準で利用したかったらソースからインストールしてみるのもよいでしょう。
以上。
Comments