--- 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 提示。