Linux 构建/编译IOS/Mac程序

前言

理论上这是一个很好的想法,但真正落实到实践,简直坑的不要不要的!笔者最终在CentOS上实在搞不动了,只在Ubuntu上弄了,关键CentOS是公司环境也不敢太造次。

整个东西写出来主要是让自己记住坑太多,不是实在想不开没事干,千万不要再搞。

思路来源https://github.com/facebook/xcbuild/issues/37

目的

做这个事情起初只是因为我司不提供Mac机器来做自动打包,但又想要让我做自动打包,能提供的也只有CentOS系统,不过很快就发现打包其实完全不可能,因为证书问题很难解决,然后想着跑跑CI的test也不错才继续研究了一下。。。。毕竟我们Model都是自动生成的,git提交后跑一下CI确保能各端运行正常还是很有用的,另外版本归档打tag的时候跑一下CocoaPods把完整可执行代码构建好拉下来归档也是挺不错的!

现实是恐怕就CocoaPods构建是比较稳定100%没问题,编译这个完全不敢说ok。。。所以有条件的话还是建议用有台Mac专门来干这些事,不然实在太麻烦,哪怕ssh到一台同事电脑悄悄开个账户搞都比在linux上搞靠谱!

如图实现,没mac和有mac简直就是天壤之别的恶心差距!

Untitled.png

安装配置

准备工作

ruby (为了支持CocoaPods)
clang 4.0或以上(为了支持IOS10,如果你准备的sdk版本不高,那就无所谓了,关键是对应上)
Apple clang(用他的话妥妥的手动apt-get拯救不了你)
cctools-port 生成ios工具链(ios-toolchain)回头替换掉Xcode里的
ninja
xcbuild
Xcode(确切的说其实只要三个文件夹但我很不放心用了整个)

CocoaPods 安装

这里不得不提CocoaPods兼容性真心不错
CentOS

sudo yum install ruby
sudo gem install cocoapods

Ubuntu

sudo apt-get install ruby
sudo gem install cocoapods

就是如此简单!已经时可用状态了!

Clang 安装

接下来就不细说CentOS了应为基本上大部分库都是要源码安装。。。
首先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

除了错误别找我,直接谷歌去找源
安装完clang看看位置如果不是usr/bin
执行下面命令制作软链接,只为保险不是必需的。。。。

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

吐槽一波CentOS你更新了源也没用该没有的还是没有建议直接源码安装。

#下载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
#正常套路安装
#设置配置
#–prefix=directory — 设置llvm编译的安装路径(default/usr/local). 
#–enable-optimized — 是否选择优化(defaultis NO),yes是指安装一个Release版本. 
#–enable-assertions — 是否断言检查(default is YES).
../llvm/configure --enable-optimized --enable-targets=host-only --prefix=/usr/bin
#构建
cmake ../llvm
make
#安装
sudo make install

#ninja套路安装
#设置配置
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
#构建想几核自己根据配置设置
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的目录结构一样然后仿照之前操作即可

cctools-port 制作ios-toolchain 的Clang

ios sdk 打包

下载完Xcode直接执行下面命令


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

制作工具链成功后会提示*** all done ***

将生成的工具链移到 /usr/local/ 目录并更名为 ios-armv7

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

将库文件拷贝一份,放进公共库 /usr/lib

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

最后将工具链的 bin 目录加入PATH,方便调用

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

制作工具链成功后会提示*** all done ***

将生成的工具链 /usr/local/ 目录并更名为 ios-arm64

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

使用 rename 命令重命名前缀以与 armv7 区分开来把 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++

将库文件拷贝一份,放进公共库 /usr/lib

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

最后将工具链的 bin 目录加入PATH,方便调用

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

其实到这基本完活了,单跑.m文件已经没问题了,下面只是为了更加方便的编译项目

这里已经可以跑个测试程序编译试试了如arrch-apple-darwin11-clang helloworld.c -o helloworldarm-apple-darwin11-clang helloworld.c -o helloworld

合并 armv7 和 arm64 工具链(可选)

一般用ar命令做合并不过容易出问题

替换xctoolchain

把最后想要用的生成的工具链clang 和 clang++文件替换到usr/bin下(不替换也可以达成目的即可),相当于回头编译的时候走我们产出的这套clang环境。总之就是思路就是让xcbuild走我们的这套clang去打包编译程序即可。如果你用Apple Clang或直接Clang能打包编译也就不用自己手动做这个事了。

Ninja 安装

Ubuntu一行命令解决。。。。

apt-get install ninja-build

CentOS天坑模式开启不出意外先升级cmake
源码安装最新版cmake解压执行./bootstrap && make && make install 就ok了,3个命令合一。
然后下载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其实只需要有三个文件夹Xcode.app/Contents/PlugInsXcode.app/Contents/Developer/Toolchains,Xcode.app/Contents/Developer/Platforms

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

使用

完全可以像在Mac下一样用没有任何区别,不过也就CocoaPods完全ok,xcbuild指令和xcodebuild用法完全一样直接用xcodebuild也没问题,只不过能不能编译成功就听天由命吧!坑很深,慎入!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容

  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一种新的协议。它实...
    香橙柚子阅读 23,724评论 8 183
  • 刚才写了那么多的东西手机卡了重启然后就没有了! 今晚不想看书也不想做减肥操,就想以舒服的姿势躺着塞着耳机听很想听的...
    瘦是毕生所愿阅读 159评论 0 0
  • 昆明梁艳分享153天。网络中级五期。2017.10.17 今晚是网课中级五期的第一次课,主要内容是立规...
    诗心小鹿阅读 211评论 0 0
  • 他一直看不起自己的家人。觉得他们贩卖蔬菜丢了自己的脸。
    沈栖枝阅读 201评论 0 0
  • 有趣,是最大的才情,是最高级的魅力,是我对你的最高评价。那到底什么样的人,才是有趣的人呢? 有人将有趣分为三个维度...
    Yvonne_F阅读 369评论 0 1