怎么樣在Windows下使用Make編譯Golang程序

怎么樣在Windows下使用Make編譯Golang程序

GNU的Make是一個(gè)又古老又強(qiáng)大的構(gòu)建工具枢步,就Makefile的語(yǔ)法而言也不算復(fù)雜,沒(méi)有特別復(fù)雜的需求的話消玄,拿來(lái)做程序構(gòu)建是一個(gè)好主意荔燎。更復(fù)雜一點(diǎn)的構(gòu)建就可以選擇Google的Bazel,但是通常的工程都沒(méi)有這么復(fù)雜的需求方庭。

在Unix厕吉、Linux、BSD械念、macOS使用Make是很方便的头朱,很自然的×浼酰可是项钮,在Windows下面卻存在著兼容性的問(wèn)題,在其他操作系統(tǒng)可以順利執(zhí)行的Makefile,在Windows卻跑不了寄纵。這體驗(yàn)很糟糕鳖敷。雖然微軟在努力解決不兼容的問(wèn)題,比如最新的PowerShell程拭,但是操作系統(tǒng)畢竟還是存在著巨大的差異定踱,要完全解決幾乎是不可能完成的任務(wù)。所以恃鞋,在Makefile多少是需要做一些適配崖媚。

安裝Make

常規(guī)的做法,大家都是使用安裝MinGW包的方法來(lái)安裝Make恤浪,但是這很繁瑣畅哑,我并不推薦,我推薦使用ChocoScoop來(lái)安裝管理Make水由。

Choco

PowerShell安裝Choco:

Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))

管理員權(quán)限啟動(dòng)PowerShell荠呐,然后運(yùn)行以下命令進(jìn)行安裝:

choco install make

安裝其他有用的工具:

choco install grep awk sed touch

scoop

安裝Scoop:

irm get.scoop.sh | iex
scoop install make

安裝其他有用的工具:

scoop install grep gawk sed touch

MinGW

下載安裝MinGW:https://www.mingw-w64.org/downloads/

下載好之后,解壓砂客,把bin文件夾加入到Windows的環(huán)境變量里面泥张,使之可以全局運(yùn)行。

然后鞠值,還需要把mingw32-make.exe文件改名成make.exe媚创。

此方法比較繁瑣,不如使用軟件包管理器去直接安裝make還方便多了彤恶。

另钞钙,通過(guò)軟件包管理也能夠安裝mingw:

choco install mingw
scoop install mingw

Windows和Linux之間使用Make的區(qū)別

在Windows下使用Make和在Linux下面使用Make是有區(qū)別的,而這個(gè)差異性倒不是來(lái)自于Make声离,而是來(lái)自于依賴的命令芒炼。

Bash里面很多的命令,在CMD下都沒(méi)有术徊,PowerShell倒是增加了一些本刽,像:manls弧关、rmpwd這些常用的倒是都已經(jīng)有了唤锉,但是差異還是有世囊,兼容性永遠(yuǎn)是個(gè)大問(wèn)題。

常用的Linux工具倒是有窿祥,像grep株憾、awksed……都可以通過(guò)上面的軟件管理器choco、scoop安裝到嗤瞎。但是墙歪,像uname這些平臺(tái)嚴(yán)重相關(guān)的命令是肯定沒(méi)有辦法的。

簡(jiǎn)單舉一些例子:

  1. 文件路徑分隔符贝奇,Windows是\虹菲,而Linux是/;
  2. Linux的mkdir是有-p選項(xiàng)的,而Windows沒(méi)有掉瞳。
  3. echo的行為也跟Linux的不同毕源。

現(xiàn)在PowerShell倒是在提高與Bash的兼容性,但是畢竟系統(tǒng)差異性太大陕习,兼容性是肯定存在的霎褐,那么,怎么辦呢该镣?我們可以在Makefile里面判斷操作系統(tǒng)的版本冻璃,來(lái)做差異化處理。

簡(jiǎn)單的探測(cè)系統(tǒng)版本:

detected_OS :=
ifeq ($(OS),Windows_NT) 
    detected_OS := Windows
else
    detected_OS := $(shell sh -c 'uname 2>/dev/null || echo Unknown')
endif

all:
    @echo $(detected_OS)

使用Makefile編譯Golang程序

下面以一個(gè)簡(jiǎn)單的編譯Golang程序的Makefile來(lái)講解如何跨平臺(tái)使用Makefile進(jìn)行交叉編譯:

GOPATH=$(shell go env GOPATH)
GOARCH?=$(shell go env GOARCH)

ifeq ($(OS),Windows_NT)
    IS_WINDOWS := 1
endif

BUILD_CMD = $(if $(IS_WINDOWS), \
    SET CGO_ENABLED=0&SET GOOS=$(1)&SET GOARCH=$(2)&go build -o .\bin\$(1)_$(2)\$(3), \
    CGO_ENABLED=0 GOOS=$(1) GOARCH=$(2) go build -o ./bin/$(1)_$(2)/$(3))

linux:
    $(call BUILD_CMD,linux,$(GOARCH),test)

windows:
    echo $(IS_WINDOWS)
    $(call BUILD_CMD,windows,$(GOARCH),test.exe)

mac:
    $(call BUILD_CMD,darwin,$(GOARCH),test)

上面這段代碼里面使用ifeq ($(OS),Windows_NT)來(lái)判斷操作系統(tǒng)损合,得到一個(gè)IS_WINDOWS的變量省艳。

然后,定義了一個(gè)BUILD_CMD的函數(shù)塌忽,它調(diào)用了內(nèi)置的if函數(shù)拍埠,它的語(yǔ)法是:

$(if <condition>,<then-part>,<else-part>)

第一個(gè)分支是走的Windows的編譯,第二個(gè)分支是走的其他操作系統(tǒng)的編譯土居。

需要注意的是:路徑分隔符枣购,參數(shù)設(shè)置前面需要加SET,語(yǔ)句之間需要用&間隔擦耀。

參考資料

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末棉圈,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子眷蜓,更是在濱河造成了極大的恐慌分瘾,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吁系,死亡現(xiàn)場(chǎng)離奇詭異德召,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)汽纤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門上岗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蕴坪,你說(shuō)我怎么就攤上這事肴掷【慈瘢” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵呆瞻,是天一觀的道長(zhǎng)台夺。 經(jīng)常有香客問(wèn)我,道長(zhǎng)痴脾,這世上最難降的妖魔是什么颤介? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮明郭,結(jié)果婚禮上买窟,老公的妹妹穿的比我還像新娘。我一直安慰自己薯定,他們只是感情好始绍,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著话侄,像睡著了一般亏推。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上年堆,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天吞杭,我揣著相機(jī)與錄音,去河邊找鬼变丧。 笑死芽狗,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的痒蓬。 我是一名探鬼主播童擎,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼攻晒!你這毒婦竟也來(lái)了顾复?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鲁捏,失蹤者是張志新(化名)和其女友劉穎芯砸,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體给梅,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡假丧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了动羽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片包帚。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖曹质,靈堂內(nèi)的尸體忽然破棺而出婴噩,到底是詐尸還是另有隱情,我是刑警寧澤羽德,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布几莽,位于F島的核電站,受9級(jí)特大地震影響宅静,放射性物質(zhì)發(fā)生泄漏章蚣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一姨夹、第九天 我趴在偏房一處隱蔽的房頂上張望纤垂。 院中可真熱鬧,春花似錦磷账、人聲如沸峭沦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)吼鱼。三九已至,卻和暖如春绰咽,著一層夾襖步出監(jiān)牢的瞬間菇肃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工取募, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留琐谤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓玩敏,卻偏偏與公主長(zhǎng)得像斗忌,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子聊品,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容