Linux 構(gòu)建/編譯IOS/Mac程序

前言

理論上這是一個(gè)很好的想法斧抱,但真正落實(shí)到實(shí)踐常拓,簡(jiǎn)直坑的不要不要的!筆者最終在CentOS上實(shí)在搞不動(dòng)了辉浦,只在Ubuntu上弄了弄抬,關(guān)鍵CentOS是公司環(huán)境也不敢太造次。

整個(gè)東西寫出來(lái)主要是讓自己記住坑太多宪郊,不是實(shí)在想不開(kāi)沒(méi)事干掂恕,千萬(wàn)不要再搞。

思路來(lái)源https://github.com/facebook/xcbuild/issues/37

目的

做這個(gè)事情起初只是因?yàn)槲宜静惶峁㎝ac機(jī)器來(lái)做自動(dòng)打包弛槐,但又想要讓我做自動(dòng)打包懊亡,能提供的也只有CentOS系統(tǒng),不過(guò)很快就發(fā)現(xiàn)打包其實(shí)完全不可能丐黄,因?yàn)樽C書問(wèn)題很難解決斋配,然后想著跑跑CI的test也不錯(cuò)才繼續(xù)研究了一下。。艰争。坏瞄。畢竟我們Model都是自動(dòng)生成的,git提交后跑一下CI確保能各端運(yùn)行正常還是很有用的甩卓,另外版本歸檔打tag的時(shí)候跑一下CocoaPods把完整可執(zhí)行代碼構(gòu)建好拉下來(lái)歸檔也是挺不錯(cuò)的鸠匀!

現(xiàn)實(shí)是恐怕就CocoaPods構(gòu)建是比較穩(wěn)定100%沒(méi)問(wèn)題,編譯這個(gè)完全不敢說(shuō)ok逾柿。缀棍。。所以有條件的話還是建議用有臺(tái)Mac專門來(lái)干這些事机错,不然實(shí)在太麻煩爬范,哪怕ssh到一臺(tái)同事電腦悄悄開(kāi)個(gè)賬戶搞都比在linux上搞靠譜!

如圖實(shí)現(xiàn)弱匪,沒(méi)mac和有mac簡(jiǎn)直就是天壤之別的惡心差距青瀑!

Untitled.png

安裝配置

準(zhǔn)備工作

ruby (為了支持CocoaPods)
clang 4.0或以上(為了支持IOS10,如果你準(zhǔn)備的sdk版本不高萧诫,那就無(wú)所謂了斥难,關(guān)鍵是對(duì)應(yīng)上)
Apple clang(用他的話妥妥的手動(dòng)apt-get拯救不了你)
cctools-port 生成ios工具鏈(ios-toolchain)回頭替換掉Xcode里的
ninja
xcbuild
Xcode(確切的說(shuō)其實(shí)只要三個(gè)文件夾但我很不放心用了整個(gè))

CocoaPods 安裝

這里不得不提CocoaPods兼容性真心不錯(cuò)
CentOS

sudo yum install ruby
sudo gem install cocoapods

Ubuntu

sudo apt-get install ruby
sudo gem install cocoapods

就是如此簡(jiǎn)單!已經(jīng)時(shí)可用狀態(tài)了帘饶!

Clang 安裝

接下來(lái)就不細(xì)說(shuō)CentOS了應(yīng)為基本上大部分庫(kù)都是要源碼安裝哑诊。。及刻。
首先clang --version看看版本是不是自己想要镀裤,多半都不是然后直接刪了

sudo apt-get autoremove clang

然后搞一下軟件源/etc/apt/sources.list不然各種依賴包各種找不到讓你爽歪歪

#deb cdrom:[Ubuntu 16.04.2 LTS _Xenial Xerus_ - Release amd64 (20170215.2)]/ xenial main restricted
# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.
deb http://us.archive.ubuntu.com/ubuntu/ xenial main restricted
# deb-src http://us.archive.ubuntu.com/ubuntu/ xenial main restricted
## Major bug fix updates produced after the final release of the
## distribution.
deb http://us.archive.ubuntu.com/ubuntu/ xenial-updates main restricted
# deb-src http://us.archive.ubuntu.com/ubuntu/ xenial-updates main restricted
## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team. Also, please note that software in universe WILL NOT receive any
## review or updates from the Ubuntu security team.
deb http://us.archive.ubuntu.com/ubuntu/ xenial universe
# deb-src http://us.archive.ubuntu.com/ubuntu/ xenial universe
deb http://us.archive.ubuntu.com/ubuntu/ xenial-updates universe
# deb-src http://us.archive.ubuntu.com/ubuntu/ xenial-updates universe
## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu 
## team, and may not be under a free licence. Please satisfy yourself as to 
## your rights to use the software. Also, please note that software in 
## multiverse WILL NOT receive any review or updates from the Ubuntu
## security team.
deb http://us.archive.ubuntu.com/ubuntu/ xenial multiverse
# deb-src http://us.archive.ubuntu.com/ubuntu/ xenial multiverse
deb http://us.archive.ubuntu.com/ubuntu/ xenial-updates multiverse
# deb-src http://us.archive.ubuntu.com/ubuntu/ xenial-updates multiverse
## N.B. software from this repository may not have been tested as
## extensively as that contained in the main release, although it includes
## newer versions of some applications which may provide useful features.
## Also, please note that software in backports WILL NOT receive any review
## or updates from the Ubuntu security team.
deb http://us.archive.ubuntu.com/ubuntu/ xenial-backports main restricted universe multiverse
# deb-src http://us.archive.ubuntu.com/ubuntu/ xenial-backports main restricted universe multiverse
## Uncomment the following two lines to add software from Canonical's
## 'partner' repository.
## This software is not part of Ubuntu, but is offered by Canonical and the
## respective vendors as a service to Ubuntu users.
# deb http://archive.canonical.com/ubuntu xenial partner
# deb-src http://archive.canonical.com/ubuntu xenial partner
deb http://security.ubuntu.com/ubuntu xenial-security main restricted
# deb-src http://security.ubuntu.com/ubuntu xenial-security main restricted
deb http://security.ubuntu.com/ubuntu xenial-security universe
# deb-src http://security.ubuntu.com/ubuntu xenial-security universe
deb http://security.ubuntu.com/ubuntu xenial-security multiverse
# deb-src http://security.ubuntu.com/ubuntu xenial-security multiverse

下面大更新一波,安裝

sudo apt-get update
sudo apt-get install git gcc cmake libssl-dev libtool autoconf automake clang-4.0

除了錯(cuò)誤別找我缴饭,直接谷歌去找源
安裝完clang看看位置如果不是usr/bin
執(zhí)行下面命令制作軟鏈接淹禾,只為保險(xiǎn)不是必需的。茴扁。。汪疮。

sudo ln -s /usr/bin/clang-4.0 /usr/bin/clang
sudo ln -s /usr/bin/clang++-4.0 /usr/bin/clang++

吐槽一波CentOS你更新了源也沒(méi)用該沒(méi)有的還是沒(méi)有建議直接源碼安裝峭火。

#下載llvm源碼
wget http://llvm.org/releases/4.0.1/llvm-4.0.1.src.tar.xz
tar xf llvm-4.0.1.src.tar.xz
mv llvm-4.0.1.src llvm

#下載clang源碼
cd llvm/tools
wget http://llvm.org/releases/4.0.1/cfe-4.0.1.src.tar.xz
tar xf cfe-4.0.1.src.tar.xz
mv cfe-4.0.1.src clang
cd ../..

#下載clang-tools-extra源碼  可選
cd llvm/tools/clang/tools
wget http://llvm.org/releases/4.0.1/clang-tools-extra-4.0.1.src.tar.xz
tar xf clang-tools-extra-4.0.1.src.tar.xz
mv clang-tools-extra-4.0.1.src  extra
cd ../../../..

#下載compiler-rt源碼 可選
cd llvm/projects
wget http://llvm.org/releases/4.0.1/compiler-rt-4.0.1.src.tar.xz
tar xf compiler-rt-4.0.1.src.tar.xz
mv compiler-rt-4.0.1.src compiler-rt
cd ../..

mkdir llvmbuild
cd llvmbuild
#正常套路安裝
#設(shè)置配置
#–prefix=directory — 設(shè)置llvm編譯的安裝路徑(default/usr/local). 
#–enable-optimized — 是否選擇優(yōu)化(defaultis NO),yes是指安裝一個(gè)Release版本. 
#–enable-assertions — 是否斷言檢查(default is YES).
../llvm/configure --enable-optimized --enable-targets=host-only --prefix=/usr/bin
#構(gòu)建
cmake ../llvm
make
#安裝
sudo make install

#ninja套路安裝
#設(shè)置配置
cmake -G Ninja -DCMAKE_INSTALL_PREFIX=/usr/bin -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_FFI=ON -DLLVM_BUILD_LLVM_DYLIB=ON -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DLLVM_TARGETS_TO_BUILD="host" -Wno-dev ../llvm
#構(gòu)建想幾核自己根據(jù)配置設(shè)置
ninja -j4
#安裝
ninja install

Apple Clang 安裝

步驟如上面CentOS源碼安裝Clang差不多智嚷,只是把Clang地址改了下

wget https://opensource.apple.com/tarballs/clang/clang-800.0.42.1.tar.gz
tar xf clang-800.0.42.1.tar.gz
cd clang-800.0.42.1/src

Apple Clang的src文件夾下和llvm的目錄結(jié)構(gòu)一樣然后仿照之前操作即可

cctools-port 制作ios-toolchain 的Clang

ios sdk 打包

下載完Xcode直接執(zhí)行下面命令


SDK=$(ls -l Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs | grep " -> iPhoneOS.sdk" | head -n1 | awk '{print $9}')
cp -r Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk /tmp/$SDK 1>/dev/null
cp -r Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1 /tmp/$SDK/usr/include/c++ 1>/dev/null
pushd /tmp
tar -cvzf $SDK.tar.gz $SDK
rm -rf $SDK
mv $SDK.tar.gz ~
popd

制作 iOS armv7 工具鏈

cd cctools-port
IPHONEOS_DEPLOYMENT_TARGET=5.0 usage_examples/ios_toolchain/build.sh ~/iPhoneOS10.0.sdk.tar.gz armv7

制作工具鏈成功后會(huì)提示*** all done ***

將生成的工具鏈移到 /usr/local/ 目錄并更名為 ios-armv7

sudo mv usage_examples/ios_toolchain/target /usr/local/ios-armv7

將庫(kù)文件拷貝一份卖丸,放進(jìn)公共庫(kù) /usr/lib

sudo cp /usr/local/ios-armv7/lib/libtapi.so /usr/lib

最后將工具鏈的 bin 目錄加入PATH,方便調(diào)用

export PATH=$PATH:/usr/local/ios-armv7/bin

制作 iOS arm64 工具鏈

cd cctools-port
IPHONEOS_DEPLOYMENT_TARGET=5.0 usage_examples/ios_toolchain/build.sh ~/iPhoneOS10.0.sdk.tar.gz arm64

制作工具鏈成功后會(huì)提示*** all done ***

將生成的工具鏈 /usr/local/ 目錄并更名為 ios-arm64

sudo mv usage_examples/ios_toolchain/target /usr/local/ios-arm64

使用 rename 命令重命名前綴以與 armv7 區(qū)分開(kāi)來(lái)把 arm- 前綴改為 aarch64- 前綴

rename 's/arm-/aarch64-/' /usr/local/ios-arm64/bin/*
sudo rm /usr/local/ios-arm64/aarch64-apple-darwin11-clang++
sudo ln -s /usr/local/ios-arm64/aarch64-apple-darwin11-clang /usr/local/ios-arm64/aarch64-apple-darwin11-clang++

將庫(kù)文件拷貝一份盏道,放進(jìn)公共庫(kù) /usr/lib

sudo cp /usr/local/ios-arm64/lib/libtapi.so /usr/lib

最后將工具鏈的 bin 目錄加入PATH稍浆,方便調(diào)用

export PATH=$PATH:/usr/local/ios-arm64/bin

其實(shí)到這基本完活了,單跑.m文件已經(jīng)沒(méi)問(wèn)題了,下面只是為了更加方便的編譯項(xiàng)目

這里已經(jīng)可以跑個(gè)測(cè)試程序編譯試試了如arrch-apple-darwin11-clang helloworld.c -o helloworldarm-apple-darwin11-clang helloworld.c -o helloworld

合并 armv7 和 arm64 工具鏈(可選)

一般用ar命令做合并不過(guò)容易出問(wèn)題

替換xctoolchain

把最后想要用的生成的工具鏈clang 和 clang++文件替換到usr/bin下(不替換也可以達(dá)成目的即可)衅枫,相當(dāng)于回頭編譯的時(shí)候走我們產(chǎn)出的這套clang環(huán)境嫁艇。總之就是思路就是讓xcbuild走我們的這套clang去打包編譯程序即可弦撩。如果你用Apple Clang或直接Clang能打包編譯也就不用自己手動(dòng)做這個(gè)事了步咪。

Ninja 安裝

Ubuntu一行命令解決。益楼。猾漫。。

apt-get install ninja-build

CentOS天坑模式開(kāi)啟不出意外先升級(jí)cmake
源碼安裝最新版cmake解壓執(zhí)行./bootstrap && make && make install 就ok了感凤,3個(gè)命令合一悯周。
然后下載ninja源碼

git clone git://github.com/ninja-build/ninja.git && cd ninja
git checkout release
./configure.py --bootstrap

最后把Path加一下

export PATH=$PATH:/xxx/xxx/ninja

xcbuild 安裝

git clone https://github.com/facebook/xcbuild
cd xcbuild
git submodule update --init
make

最后把Path加一下和DEVELOPER_DIR
DEVELOPER_DIR就是Xcode的目錄,Xcode其實(shí)只需要有三個(gè)文件夾Xcode.app/Contents/PlugIns陪竿,Xcode.app/Contents/Developer/Toolchains,Xcode.app/Contents/Developer/Platforms

export PATH=$PATH:/xxx/xxx/xcbuild/build
export DEVELOPER_DIR=/xxx/xxx/Xcode.app

使用

完全可以像在Mac下一樣用沒(méi)有任何區(qū)別禽翼,不過(guò)也就CocoaPods完全ok,xcbuild指令和xcodebuild用法完全一樣直接用xcodebuild也沒(méi)問(wèn)題萨惑,只不過(guò)能不能編譯成功就聽(tīng)天由命吧捐康!坑很深,慎入庸蔼!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末解总,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子姐仅,更是在濱河造成了極大的恐慌花枫,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掏膏,死亡現(xiàn)場(chǎng)離奇詭異劳翰,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)馒疹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門佳簸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人颖变,你說(shuō)我怎么就攤上這事生均。” “怎么了腥刹?”我有些...
    開(kāi)封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵马胧,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我衔峰,道長(zhǎng)佩脊,這世上最難降的妖魔是什么蛙粘? 我笑而不...
    開(kāi)封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮威彰,結(jié)果婚禮上出牧,老公的妹妹穿的比我還像新娘。我一直安慰自己抱冷,他們只是感情好崔列,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著旺遮,像睡著了一般赵讯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上耿眉,一...
    開(kāi)封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天边翼,我揣著相機(jī)與錄音,去河邊找鬼鸣剪。 笑死组底,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的筐骇。 我是一名探鬼主播债鸡,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼铛纬!你這毒婦竟也來(lái)了厌均?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤告唆,失蹤者是張志新(化名)和其女友劉穎棺弊,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體擒悬,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡模她,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了懂牧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侈净。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖僧凤,靈堂內(nèi)的尸體忽然破棺而出用狱,到底是詐尸還是另有隱情,我是刑警寧澤拼弃,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站摇展,受9級(jí)特大地震影響吻氧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一盯孙、第九天 我趴在偏房一處隱蔽的房頂上張望鲁森。 院中可真熱鬧,春花似錦振惰、人聲如沸歌溉。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)痛垛。三九已至,卻和暖如春桶蛔,著一層夾襖步出監(jiān)牢的瞬間匙头,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工仔雷, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蹂析,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓碟婆,卻偏偏與公主長(zhǎng)得像电抚,于是被迫代替她去往敵國(guó)和親低匙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子休建,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

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