這篇文章主要為大家展示了“如何源碼安裝GO”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“如何源碼安裝GO”這篇文章吧。
創(chuàng)新互聯(lián)是少有的成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、
外貿(mào)網(wǎng)站建設(shè)、營(yíng)銷型企業(yè)網(wǎng)站、微信小程序、手機(jī)APP,開發(fā)、制作、設(shè)計(jì)、
買鏈接、推廣優(yōu)化一站式服務(wù)網(wǎng)絡(luò)公司,自2013年起,堅(jiān)持透明化,價(jià)格低,無(wú)套路經(jīng)營(yíng)理念。讓網(wǎng)頁(yè)驚喜每一位訪客多年來(lái)深受用戶好評(píng)
一、分析安裝腳本
在《探究Go中各個(gè)目錄的功能》一文中提到了幾個(gè)腳本,以及它們的作用?,F(xiàn)在來(lái)分析這些腳本都做了些什么。(以linux下為例,Windows對(duì)應(yīng)的腳本類似)
1、all.bash
3 | echo 'all.bash must be run from $GOROOT/src' 1>&2 |
7 | . ./ make . bash --no-banner |
8 | bash run. bash --no-rebuild |
10 | $GOTOOLDIR/dist banner # print build info |
說(shuō)明:
1)set -e 當(dāng)腳本中某個(gè)命令返回非零退出狀態(tài)時(shí),腳本退出
2)if語(yǔ)句 是要求all.bash必須在make.bash所在的目錄運(yùn)行(也就是$GOROOT/src)
3)OLDPATH=”$PATH” 保存當(dāng)前PATH
4)執(zhí)行make.bash并傳遞–no-banner參數(shù)
5)執(zhí)行run.bash并傳遞–no-rebuild參數(shù)
6)執(zhí)行dist工具并傳遞 banner參數(shù),打印build信息
2、make.bash
在make.bash中,有一些環(huán)境變量,執(zhí)行make.bash過(guò)程中會(huì)用到。
①GOROOT_FINAL:最終被設(shè)置的Go root,在編譯過(guò)程中,默認(rèn)是Go tree的位置。
②GOHOSTARCH:為主機(jī)工具(編譯器和二進(jìn)制文件)指定體系結(jié)構(gòu)。這種類型的二進(jìn)制文件在當(dāng)前系統(tǒng)必須是可執(zhí)行的,因此設(shè)置這個(gè)環(huán)境變量的目前唯一常見原因是在AMD64機(jī)器上設(shè)置GOHOSTARCH=386。(也就是說(shuō),在ADM64上可以運(yùn)行386的可執(zhí)行文件)
③GO_GCFLAGS:當(dāng)構(gòu)建包和命令時(shí)可以通過(guò)該環(huán)境變量附帶上5g/6g/8g的參數(shù)
④GO_LDFLAGS:當(dāng)構(gòu)建包和命令時(shí)可以通過(guò)該環(huán)境變量附帶上5l/6l/8l的參數(shù)
⑤CGO_ENABLED:在構(gòu)建過(guò)程中控制cgo的使用。當(dāng)設(shè)置為1,在構(gòu)建時(shí),會(huì)包含所有cgo相關(guān)的文件,如帶有”cgo”編譯指令的.c和.go文件。當(dāng)設(shè)置為0,則忽略它們(即禁用CGO)
在文件開頭是一些檢查:比如是否在Windows下運(yùn)行了make.bash,ld的版本等。
make.bash中接下來(lái)主要的工作(也就是開始構(gòu)建):
1)構(gòu)建 C 引導(dǎo)工具 —— cmd/dist
這里首先會(huì)export GOROOT環(huán)境變量,它的值就是go源碼所在路徑,可見,源碼安裝之前并不要求一定要設(shè)置GOROOT。
這里學(xué)習(xí)一個(gè)shell腳本知識(shí)
GOROOT_FINAL=”${GOROOT_FINAL:-$GOROOT}”
這叫做參數(shù)替換,形式如下:
${parameter-default},${parameter:-default}
意思是:如果 parameter 沒被 set,那么就使用 default。這兩種形式大部分時(shí)候是相同的。區(qū)別是:當(dāng)parameter被設(shè)置了且為空,則第一種不能輸出默認(rèn)值,而第二種可以。
所以,GOROOT_FINAL=”${GOROOT_FINAL:-$GOROOT}”的意思就是,如果GOROOT_FINAL沒設(shè)置,則GOROOT_FINAL=$GOROOT
通過(guò)gcc編譯cmd/dist
2)構(gòu)建 編譯器和Go引導(dǎo)工具
首先通過(guò)執(zhí)行dist設(shè)置需要的環(huán)境變量
eval $(./cmd/dist/dist env -p)
接著構(gòu)建Go引導(dǎo)工具:go_bootstrap,以及編譯器等
3)構(gòu)建 包和命令工具
這是通過(guò)go_bootstrap做的
3、run.bash
該腳本是一個(gè)測(cè)試腳本,運(yùn)行標(biāo)準(zhǔn)庫(kù)中的測(cè)試用例。默認(rèn)情況下會(huì)重新構(gòu)建go包和工具。由于make.bash會(huì)做構(gòu)建的工作,all.bash中執(zhí)行run.bash時(shí),傳遞了–no-rebuild
二、源碼安裝說(shuō)明
源碼安裝Go語(yǔ)言,一般只需要執(zhí)行./all.bash就可以了。(Windows上執(zhí)行all.bat)
根據(jù)上面的分析,這樣會(huì)運(yùn)行測(cè)試腳本。如果想更快的安裝Go,可以直接運(yùn)行make.bash(Windows上是make.bat)
整個(gè)安裝過(guò)程大概如下:
# Building C bootstrap tool.
cmd/dist
# Building compilers and Go bootstrap tool for host, linux/amd64.
lib9
libbio
libmach
misc/pprof
……
pkg/text/template/parse
pkg/text/template
pkg/go/doc
pkg/go/build
cmd/go
# Building packages and commands for linux/amd64.
runtime
errors
sync/atomic
sync
io
……
testing
testing/iotest
testing/quick
# Testing packages.
ok cmd/api 0.031s
? cmd/cgo [no test files]
ok cmd/fix 3.558s
ok cmd/go 0.022s
……
? unsafe [no test files]
real 3m6.056s
user 2m29.517s
sys 0m25.134s
# GOMAXPROCS=2 runtime -cpu=1,2,4
ok runtime 6.605s
# sync -cpu=10
ok sync 0.428s
# Testing race detector.
ok flag 1.044s
# ../misc/cgo/stdio
# ../misc/cgo/life
# ../misc/cgo/test
scatter = 0×430490
hello from C
PASS
ok _/home/polaris/go/misc/cgo/test 1.137s
# ../misc/cgo/testso
# ../doc/progs
real 0m19.110s
user 0m15.341s
sys 0m2.904s
# ../doc/articles/wiki
run.bash: 行 92: make: 未找到命令
PASS
# ../doc/codewalk
# ../misc/dashboard/builder ../misc/goplay
# ../test/bench/shootout
fasta
reverse-complement
nbody
binary-tree
binary-tree-freelist
fannkuch
fannkuch-parallel
regex-dna
regex-dna-parallel
spectral-norm
k-nucleotide
k-nucleotide-parallel
mandelbrot
meteor-contest
pidigits
threadring
chameneosredux
# ../test/bench/go1
ok _/home/polaris/go/test/bench/go1 4.942s
# ../test
real 1m38.036s
user 1m14.701s
sys 0m16.645s
# Checking API compatibility.
+pkg crypto/x509, const PEMCipher3DES PEMCipher
+pkg crypto/x509, const PEMCipherAES128 PEMCipher
+pkg crypto/x509, const PEMCipherAES192 PEMCipher
+pkg crypto/x509, const PEMCipherAES256 PEMCipher
+pkg crypto/x509, const PEMCipherDES PEMCipher
+pkg crypto/x509, func EncryptPEMBlock(io.Reader, string, []byte, []byte, PEMCipher)
……
+pkg reflect, func SliceOf(Type) Type
+pkg regexp, method (*Regexp) Split(string, int) []string
~pkg text/template/parse, type DotNode bool
~pkg text/template/parse, type Node interface { Copy, String, Type }
ALL TESTS PASSED
—
Installed Go for linux/amd64 in /home/polaris/go
Installed commands in /home/polaris/go/bin
*** You need to add /home/polaris/go/bin to your PATH.
三、帶中文注釋的腳本
以下是我加上了注釋的make.bash腳本(關(guān)鍵部分)
1 | echo '# Building C bootstrap tool.' |
3 | # export當(dāng)前Go源碼所在跟目錄為GOROOT |
4 | export GOROOT= "$(cd .. && pwd)" |
5 | # 如果GOROOT_FINAL沒有設(shè)置,則使用$GOROOT的值當(dāng)做GOROOT_FINAL |
6 | GOROOT_FINAL= "${GOROOT_FINAL:-$GOROOT}" |
7 | DEFGOROOT= '-DGOROOT_FINAL="' "$GOROOT_FINAL "'" ' |
9 | # 如果在amd64機(jī)子上編譯Go本身為32位,可以設(shè)置 $GOHOSTARCH=386。不建議這么做 |
16 | # gcc編譯:編譯cmd/dist下所有的c文件 |
17 | # -m:指定處理器架構(gòu),以便進(jìn)行優(yōu)化(-m32、-m64)或?yàn)榭眨ㄒ话銥榭眨?/code> |
18 | # -O:優(yōu)化選項(xiàng),一般為:-O2。優(yōu)化得到的程序比沒優(yōu)化的要小,執(zhí)行速度可能也有所提高 |
20 | # -Werror:所有警告信息都變成錯(cuò)誤 |
21 | # -ggdb:為gdb生成調(diào)試信息(-g是生成調(diào)試信息) |
24 | # -D:相當(dāng)于C語(yǔ)言中的#define GOROOT_FINAL="$GOROOT_FINAL" |
25 | gcc $mflag -O2 -Wall -Werror -ggdb -o cmd/dist/dist -Icmd/dist "$DEFGOROOT" cmd/dist/*.c |
27 | # 編譯完 dist 工具后,運(yùn)行dist。目的是設(shè)置相關(guān)環(huán)境變量 |
28 | # 比如:$GOTOOLDIR 環(huán)境變量就是這里設(shè)置的 |
29 | eval $(./cmd/dist/dist env -p) |
32 | # 運(yùn)行make.bash時(shí)傳遞--dist-tool參數(shù)可以僅編譯dist工具 |
33 | if [ "$1" = "--dist-tool" ]; then |
34 | # Stop after building dist tool. |
39 | mv cmd/dist/dist "$GOTOOLDIR" /dist |
43 | # 構(gòu)建 編譯器和Go引導(dǎo)工具 |
44 | # $GOHOSTOS/$GOHOSTARCH 是運(yùn)行dist設(shè)置的 |
45 | echo "# Building compilers and Go bootstrap tool for host, $GOHOSTOS/$GOHOSTARCH." |
48 | # 傳遞--no-clean 表示不重新構(gòu)建 |
49 | if [ "$1" = "--no-clean" ]; then |
53 | ./cmd/dist/dist bootstrap $buildall - v # builds go_bootstrap |
54 | # Delay move of dist tool to now, because bootstrap may clear tool directory. |
55 | mv cmd/dist/dist "$GOTOOLDIR" /dist |
56 | "$GOTOOLDIR" /go_bootstrap clean -i std |
59 | # $GOHOSTARCH 與 $GOARCH的區(qū)別:($GOHOSTOS 與 $GOOS的區(qū)別一樣) |
60 | # GOARCH 表示Go寫出來(lái)的程序會(huì)在什么架構(gòu)運(yùn)行(目標(biāo)操作系統(tǒng)); |
61 | # GOHOSTARCH 表示運(yùn)行make.bash這個(gè)腳本的系統(tǒng)架構(gòu) |
62 | # 一般它們是相等的,只有在需要交叉編譯時(shí)才會(huì)不一樣。 |
63 | if [ "$GOHOSTARCH" != "$GOARCH" -o "$GOHOSTOS" != "$GOOS" ]; then |
64 | # 即使交叉編譯,本機(jī)的Go環(huán)境還是必須得有 |
65 | echo "# Building packages and commands for host, $GOHOSTOS/$GOHOSTARCH." |
66 | GOOS=$GOHOSTOS GOARCH=$GOHOSTARCH \ |
67 | "$GOTOOLDIR" /go_bootstrap install -gcflags "$GO_GCFLAGS" -ldflags "$GO_LDFLAGS" - v std |
71 | echo "# Building packages and commands for $GOOS/$GOARCH." |
72 | "$GOTOOLDIR" /go_bootstrap install -gcflags "$GO_GCFLAGS" -ldflags "$GO_LDFLAGS" - v std |
75 | rm -f "$GOTOOLDIR" /go_bootstrap |
78 | # Installed Go for $GOOS/$GOARCH in $GOROOT |
79 | # Installed commands in $GOROOT/bin |
80 | if [ "$1" != "--no-banner" ]; then |
81 | "$GOTOOLDIR" /dist banner |
以上是“如何源碼安裝GO”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)網(wǎng)站制作公司行業(yè)資訊頻道!
創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國(guó)云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開啟,新人活動(dòng)云服務(wù)器買多久送多久。
分享名稱:如何源碼安裝GO-創(chuàng)新互聯(lián)
分享鏈接:
http://weahome.cn/article/djdgec.html