---
title: Open source | zh
tags: Guide, TWNIA3, TW
GA:
---
<div style="text-align: right">更新日期:2025/02/25</div>
# 開源軟體安裝
[TOC]
目前在UNIX/UNIXlike OS上的開源(open source)軟體多數使用GNU 的Autotools(Configure),依照事先寫好的腳本偵測設定作業系統與支援環境,自動設定編譯參數流程,有效簡化跨平臺編譯安裝工作,以下將以此方式為例說明。
## 一、準備工作
1. **取得原始碼**
多數開放原始碼軟體會以 tarball(例如 .tar.gz 、.tgz 或 .tar.bz2、.tbz)形式發佈,可至其官方網站或mirror站下載。下載完成後,可利用以下指令解壓縮檔案:
.tar.gz 或 .tgz 可使用
```bash
tar xzf package-name.tar.gz
或
tar xzf package-name.tgz
```
.tar.bz2 或 .tbz 可使用
```bash
tar xjf package-name.tar.bz2
或
tar xjf package-name.tbz
```
2. **閱讀相關文件**
在開始編譯前,請務必先閱讀軟體目錄下的 **README**、**INSTALL** 及其他說明檔案。
- `README` 或 `README.md`:通常包含軟體簡介、功能介紹及基本使用說明。
- `INSTALL` 或 `INSTALL.md`:通常會包含簡易安裝步驟、相依性需求與注意事項。
- `AUTHORS`:開發者資訊
- `LICENSE`:授權條款
- `ChangeLog`:版本更新記錄
這些文件通常會記載軟體變更沿革、安裝注意事項,若忽略可能會導致編譯失敗或遺漏重要設定。
## 二、編譯環境變數設定
1. **指定編譯器**
- **CC**:代表 C 編譯器。預設通常為 `gcc`,但若系統中有多個版本或想使用其他編譯器(如 Clang),可以透過設定此變數來指定。
- **CXX**:代表 C++ 編譯器。預設通常為 `g++`,同理也可指定其他版本。
- **F77 或 FC**:代表 Fortran 編譯器。若軟體包含 Fortran 程式碼,則需指定相應的編譯器,如 `gfortran`。
2. **編譯參數**
- **CFLAGS**:指定 C 語言的編譯旗標,如最佳化參數(`-O2`)、除錯資訊(`-g`)等。
- **CXXFLAGS**:與 CFLAGS 類似,但用於 C++ 編譯。
- **F77FLAGS** 或 **FCFLAGS**:指定 Fortran 編譯的旗標,依編譯器不同而有所調整。
- **LDFLAGS**:用於連結階段的旗標,例如指定額外的函式庫路徑:`-L/path/to/lib -llibname`。
- **CPPFLAGS**:用來指定 C/C++ 的預處理器旗標,如包含檔案的搜尋路徑:`-I/path/to/include`。
3. **路徑相關參數**
- **PATH**:執行檔搜尋路徑
- **LD_LIBRARY_PATH**:動態函式庫搜尋路徑
- **PKG_CONFIG_PATH**:pkg-config設定檔搜尋路徑
透過設定這些變數,使用適當的編譯器與參數編譯程式,方便在系統中多個版本共存時安裝切換。可以於shell 環境下使用export (sh/ksh/bash)或 setenv (csh/tcsh)設定,如:export CC=gcc 設定,其他變數以此類推;亦可參考後面[範例](https://man.twcc.ai/2DLzHJ5aQiKGaKYAIwyWzg?view#%E4%BA%94%E3%80%81%E7%AF%84%E4%BE%8B),於執行configure腳本時設定,更為彈性。
## 三、configure參數與設定
多數開源軟體使用GNU Autoconf 工具來產生 `configure` 腳本,此腳本會根據系統環境檢查相依性並生成適合的 Makefile。以下是常用的 configure 參數:
- `--prefix=<路徑>`:設定軟體安裝根目錄,若希望安裝至其他目錄(例如使用者目錄下的自訂位置),可設定此參數。(預設:`/usr/local`;自訂如:`--prefix=$HOME/local`)
- `--bindir=<路徑>`:使用者執行檔目錄(預設:`${prefix}/bin`)
- `--libdir=<路徑>`:函式庫檔案目錄(預設:`${prefix}/lib`)
- `--includedir=<路徑>`:標頭檔目錄(預設:`${prefix}/include`)
- `--enable-xxx / --disable-xxx`:用來啟用或關閉特定功能。例如:`--enable-debug` 可能會開啟除錯模式,`--disable-shared` 則可能關閉共享函式庫的編譯。
- `--with-xxx / --without-xxx`:指定或排除特定的相依性或功能模組。依軟體而定,可能需要設定額外的路徑或選項。例如:`--with-libxml2=/usr` 表示使用系統中安裝於 `/usr` 下的 libxml2,`--without-libxml2'則是排除libxml2。
- 在使用 configure 時,可以透過 `./configure --help` 查看所有支援的選項及說明。
## 四、編譯與安裝
1. **執行 configure**
進入步驟一解壓縮之原始碼目錄後,先依需求設定環境變數,再執行 configure 腳本或於configure時一併設定(但須先設定步驟二的路徑相關參數):
```bash
./configure --prefix=/your/desired/path [其他參數]...
```
或
```bash
env CC=gcc CXX=g++ CFLAGS='-g -O2' [其他變數]... ./configure --prefix=/your/desired/path [其他參數]...
註:請依自己需求將gcc等變數值,替換為您要的編譯器名稱與旗標設定
```
若給定變數與參數無誤,configure 腳本會檢查系統環境、相依性並建立適合的 Makefile。
2. **執行 make 編譯**
執行以下指令開始編譯過程:
```bash
make
```
此步驟會根據 Makefile 進行程式碼的編譯與連結。編譯時間依軟體大小與系統效能而定。
若有支援同時多個編譯程序,執行以下指令,可加快速度減少編譯時間。
```bash
make -j 4
```
以上範例時同時執行4個編譯程序,可依需求與系統效能自行調整。
3. **測試** `可省略`
編譯完成後,使用下列指令進行功能測試:
```bash
make test
```
部分程式提供測試檢查範例,可透過`make test`或`make check`檢查程式是否正常完成編譯、編譯完成之程式功能是否符合預期。
4. **安裝程式**
編譯/測試完成後,使用下列指令進行安裝:
```bash
make install
```
安裝過程會將編譯後的二進位檔、函式庫、說明文件等放置到指定的目錄中。
## 五、範例
本例使用安裝於台灣杉三號的編譯器gcc 13.2.0,編譯安裝[OpenMPI 5.0.7](https://www.open-mpi.org/software/ompi/v5.0/) 搭配 [hwloc 2.12.0](https://www.open-mpi.org/projects/hwloc/)示範:
`註:台灣杉三號已裝有OpenMPI可用的hwloc版本,本例為示範相依關係所需而安裝,實際自訂安裝OpenMPI時可不安裝hwloc。`
1. **取得原始碼並將tarball解開**
```bash
[demo_user@lgn303 ~]$ wget https://download.open-mpi.org/release/hwloc/v2.12/hwloc-2.12.0.tar.gz
[demo_user@lgn303 ~]$ wget https://download.open-mpi.org/release/open-mpi/v5.0/openmpi-5.0.7.tar.bz2
[demo_user@lgn303 ~]$ tar xjf openmpi-5.0.7.tar.bz2
[demo_user@lgn303 ~]$ tar xzf hwloc-2.12.0.tar.gz
```
2. **載入並設定編譯器與變數**
```
[demo_user@lgn303 ~]$ ml gcc/13.2.0
[demo_user@lgn303 ~]$ ml
Currently Loaded Modules:
1) gcc/13.2.0 (I)
...(略)
[demo_user@lgn303 ~]$ echo $CC
/opt/ohpc/Taiwania3/Intel/pkg/gcc/13.2.0/bin/gcc
```
3. **進入hwloc原始碼目錄,閱讀文件README**
```
[demo_user@lgn303 ~]$ cd hwloc-2.12.0
[demo_user@lgn303 hwloc-2.12.0]$ less README
This is a truncated and poorly-formatted version of the documentation main page.
See https://www.open-mpi.org/projects/hwloc/doc/ for more.
…(略)
```
4. **執行configure腳本查看可用參數與設定**`本例設定安裝於/home/demo_user/pkg下`
```
[demo_user@lgn303 hwloc-2.12.0]$ ./configure --help
'configure' configures hwloc 2.12.0 to adapt to many kinds of systems.
Usage: ./configure [OPTION]... [VAR=VALUE]...
…(略)
[demo_user@lgn303 hwloc-2.12.0]$ env CC=gcc CXX=g++ ./configure --prefix=$HOME/pkg
…(略)
-----------------------------------------------------------------------------
Hwloc optional build support status (more details can be found above):
Probe / display I/O devices: PCI(linux) LinuxIO
Graphical output: yes (Cairo)
XML input / output: full
Plugin support: no
-----------------------------------------------------------------------------
[demo_user@lgn303 hwloc-2.12.0]$
```
5. **執行make 編譯**
```
[demo_user@lgn303 hwloc-2.12.0]$ make
Making all in include
make[1]: Entering directory '/home/demo_user/hwloc-2.12.0/include'
make[1]: Nothing to be done for 'all'.
make[1]: Leaving directory '/home/demo_user/hwloc-2.12.0/include'
Making all in hwloc
make[1]: Entering directory '/home/demo_user/hwloc-2.12.0/hwloc'
CC topology.lo
CC traversal.lo
CC distances.lo
...(略)
make[1]: Nothing to be done for 'all-am'.
make[1]: Leaving directory '/home/demo_user/hwloc-2.12.0'
[demo_user@lgn303 hwloc-2.12.0]$
```
6. **執行`make check`測試** `有的測試為make test,請依實際情況調整。`
```
[demo_user@lgn303 hwloc-2.12.0]$ make check
Making check in include
make[1]: Entering directory '/home/demo_user/hwloc-2.12.0/include'
make[1]: Nothing to be done for 'check'.
make[1]: Leaving directory '/home/demo_user/hwloc-2.12.0/include'
Making check in hwloc
...(略)
[demo_user@lgn303 hwloc-2.12.0]$
```
7. **執行`make install`安裝**
```
[demo_user@lgn303 hwloc-2.12.0]$ make install
...(略)
make[2]: Nothing to be done for 'install-exec-am'.
/usr/bin/mkdir -p '/home/demo_user/pkg/share/hwloc'
/usr/bin/install -c -m 644 ../contrib/hwloc-valgrind.supp '/home/demo_user/pkg/share/hwloc'
/usr/bin/mkdir -p '/home/demo_user/pkg/lib/pkgconfig'
/usr/bin/install -c -m 644 hwloc.pc '/home/demo_user/pkg/lib/pkgconfig'
make[1]: Leaving directory '/home/demo_user/hwloc-2.12.0'
[demo_user@lgn303 hwloc 2.12.0]$ ls -l ~/pkg/
total 5
drwxr-xr-x 2 demo_user TRI107056 4096 Feb 25 15:03 bin
drwxr-xr-x 3 demo_user TRI107056 4096 Feb 25 15:03 include
drwxr-xr-x 3 demo_user TRI107056 4096 Feb 25 15:03 lib
drwxr-xr-x 2 demo_user TRI107056 4096 Feb 25 15:03 sbin
drwxr-xr-x 7 demo_user TRI107056 4096 Feb 25 15:03 share
```
8. **設定新增的路徑(PATH)與LD_LIBRARY_PATH**;可參考[自訂module](https://man.twcc.ai/@twnia3/SktILFcCp) 章節,寫成module供日後使用。
```
[demo_user@lgn303 ~]$ export PATH=$HOME/pkg/bin:$HOME/pkg/sbin:$PATH
[demo_user@lgn303 ~]$ export LD_LIBRARY_PATH=$HOME/pkg/lib:$LD_LIBRARY_PATH
[demo_user@lgn303 ~]$ which lstopo
~/pkg/bin/lstopo
```
9. **進入openmpi-5.0.7原始碼目錄,查看README、執行configure --help查看參數**
```
[demo_user@lgn303 ~]$ cd $HOME/openmpi-5.0.7
[demo_user@lgn303 openmpi-5.0.7]$ less README.md
[demo_user@lgn303 openmpi-5.0.7]$ ./configure --help
`configure' configures Open MPI 5.0.7 to adapt to many kinds of systems.
Usage: ./configure [OPTION]... [VAR=VALUE]...
…(略)
```
10. **設定編譯參數** `執行./configure --prefix ...`
```
[demo_user@lgn303 openmpi-5.0.7]$ env CC=gcc CXX=g++ FC=gfortran \
> ./configure --prefix=$HOME/pkg \
> --with-platform=./contrib/platform/mellanox/optimized \
> --with-knem=/opt/knem-1.1.4.90mlnx1 --with-hwloc=$HOME/pkg
…(略)
Open MPI configuration:
-----------------------
Version: 5.0.7
MPI Standard Version: 3.1
Build MPI C bindings: yes
Build MPI Fortran bindings: mpif.h, use mpi, use mpi_f08
Build MPI Java bindings (experimental): no
Build Open SHMEM support: yes
Debug build: no
Platform file: ./contrib/platform/mellanox/optimized
Miscellaneous
-----------------------
Atomics: GCC built-in style atomics
Fault Tolerance support: mpi
HTML docs and man pages: installing packaged docs
hwloc: external
libevent: external
Open UCC: no
pmix: internal
PRRTE: internal
Threading Package: pthreads
Transports
-----------------------
Cisco usNIC: no
Cray uGNI (Gemini/Aries): no
Intel Omnipath (PSM2): no (not found)
Open UCX: yes
OpenFabrics OFI Libfabric: no (not found)
Portals4: no (not found)
Shared memory/copy in+copy out: yes
Shared memory/Linux CMA: yes
Shared memory/Linux KNEM: yes
Shared memory/XPMEM: no
TCP: yes
Accelerators
-----------------------
CUDA support: no
ROCm support: no
OMPIO File Systems
-----------------------
DDN Infinite Memory Engine: no
Generic Unix FS: yes
IBM Spectrum Scale/GPFS: yes (default search paths)
Lustre: yes (pkg-config: default search paths)
PVFS2/OrangeFS: no
```
11. **執行`make`編譯** `範例為同時執行8個make程序`
```
[demo_user@lgn303 openmpi-5.0.7]$ make -j 8
```
12. **執行`make check`測試**
```
[demo_user@lgn303 openmpi-5.0.7]$ make -j 8 check
```
13. **執行`make install`安裝**
```
[demo_user@lgn303 openmpi-5.0.7]$ make install
```
14. **確認安裝**
```
[demo_user@lgn303 openmpi-5.0.7]$ ls -l ~/pkg/bin ~/pkg/lib
/home/demo_user/pkg/bin:
total 4805
-rwxr-xr-x 1 demo_user TRI107056 122656 Feb 25 15:03 hwloc-annotate
-rwxr-xr-x 1 demo_user TRI107056 150688 Feb 25 15:03 hwloc-bind
-rwxr-xr-x 1 demo_user TRI107056 184576 Feb 25 15:03 hwloc-calc
-rwxr-xr-x 1 demo_user TRI107056 4363 Feb 25 15:03 hwloc-compress-dir
-rwxr-xr-x 1 demo_user TRI107056 34072 Feb 25 15:03 hwloc-diff
-rwxr-xr-x 1 demo_user TRI107056 78840 Feb 25 15:03 hwloc-distrib
-rwxr-xr-x 1 demo_user TRI107056 58048 Feb 25 15:03 hwloc-gather-cpuid
-rwxr-xr-x 1 demo_user TRI107056 12136 Feb 25 15:03 hwloc-gather-topology
-rwxr-xr-x 1 demo_user TRI107056 207784 Feb 25 15:03 hwloc-info
lrwxrwxrwx 1 demo_user TRI107056 18 Feb 25 15:03 hwloc-ls -> lstopo-no-graphics
-rwxr-xr-x 1 demo_user TRI107056 34992 Feb 25 15:03 hwloc-patch
-rwxr-xr-x 1 demo_user TRI107056 90712 Feb 25 15:03 hwloc-ps
-rwxr-xr-x 1 demo_user TRI107056 548064 Feb 25 15:03 lstopo
-rwxr-xr-x 1 demo_user TRI107056 491976 Feb 25 15:03 lstopo-no-graphics
lrwxrwxrwx 1 demo_user TRI107056 12 Feb 25 17:19 mpic++ -> opal_wrapper
lrwxrwxrwx 1 demo_user TRI107056 12 Feb 25 17:19 mpicc -> opal_wrapper
lrwxrwxrwx 1 demo_user TRI107056 12 Feb 25 17:19 mpiCC -> opal_wrapper
lrwxrwxrwx 1 demo_user TRI107056 12 Feb 25 17:19 mpicxx -> opal_wrapper
lrwxrwxrwx 1 demo_user TRI107056 6 Feb 25 17:19 mpiexec -> mpirun
lrwxrwxrwx 1 demo_user TRI107056 12 Feb 25 17:19 mpif77 -> opal_wrapper
…(略)
/home/demo_user/pkg/lib:
total 55291
-rwxr-xr-x 1 demo_user TRI107056 943 Feb 25 15:03 libhwloc.la
lrwxrwxrwx 1 demo_user TRI107056 18 Feb 25 15:03 libhwloc.so -> libhwloc.so.15.9.0
lrwxrwxrwx 1 demo_user TRI107056 18 Feb 25 15:03 libhwloc.so.15 -> libhwloc.so.15.9.0
-rwxr-xr-x 1 demo_user TRI107056 1636080 Feb 25 15:03 libhwloc.so.15.9.0
-rwxr-xr-x 1 demo_user TRI107056 1378 Feb 25 17:19 libmpi.la
-rwxr-xr-x 1 demo_user TRI107056 1589 Feb 25 17:19 libmpi_mpifh.la
lrwxrwxrwx 1 demo_user TRI107056 23 Feb 25 17:19 libmpi_mpifh.so -> libmpi_mpifh.so.40.40.1
…(略)
```
## 六、注意事項
1. **務必閱讀文件**
每個軟體的 README 或 INSTALL 文件與官方網站說明,可能會包含該軟體特有的相依性、設定方式或特殊注意事項,務必先詳細閱讀。
2. **環境變數**
利用 CC、CXX、CFLAGS、LDFLAGS 等環境變數,根據實際需求調整最佳化等級或指定特定編譯器。
3. **configure 參數需根據需求調整**
安裝到非預設路徑、啟用額外功能或指定相依性函式庫位置,請務必利用 configure 的參數進行設定。使用 ./configure --help 可以獲得所有選項的詳細說明。
4. **編譯錯誤**
在 configure 或 make 過程中遇到錯誤,請先檢查錯誤訊息中是否提及缺少某個相依套件或設定錯誤,並參考文件中提供的 troubleshooting 提示。