I can believe fly.

Saturday, April 7, 2018

vlc编译问题

touch .protoc
You are ready to build VLC and its contribs
Bootstraping
NOTE: GNU gettext appears to be missing or out-of-date.
Please install or update GNU gettext.
Also check if you have cvs, a dependency of autopoint.
Otherwise, you will not be able to build a source tarball.
==============================================================

generating modules/**/Makefile.am
.....
+ autoreconf --install --force --verbose -I m4
autoreconf: Entering directory `.'
autoreconf: running: true --force
autoreconf: running: aclocal -I m4 --force -I m4
autoreconf: configure.ac: tracing
autoreconf: configure.ac: not using Libtool
autoreconf: running: /data/mobilebuild/3rdandroid_vlc/vlc-ports-android-1.0.0/vlc/extras/tools/build/bin/autoconf --include=m4 --force
autoreconf: running: /data/mobilebuild/3rdandroid_vlc/vlc-ports-android-1.0.0/vlc/extras/tools/build/bin/autoheader --include=m4 --force
autoreconf: running: automake --add-missing --copy --force-missing
configure.ac:55: installing 'autotools/compile'
configure.ac:23: installing 'autotools/config.guess'
configure.ac:23: installing 'autotools/config.sub'
configure.ac:27: installing 'autotools/install-sh'
configure.ac:27: installing 'autotools/missing'
parallel-tests: installing 'autotools/test-driver'
bin/Makefile.am: installing 'autotools/depcomp'
compat/Makefile.am:1: error: Libtool library used but 'LIBTOOL' is undefined
compat/Makefile.am:1: The usual way to define 'LIBTOOL' is to add 'LT_INIT'
compat/Makefile.am:1: to 'configure.ac' and run 'aclocal' and 'autoconf' again.
compat/Makefile.am:1: If 'LT_INIT' is in 'configure.ac', make sure
compat/Makefile.am:1: its definition is in aclocal's search path.
lib/Makefile.am:31: error: Libtool library used but 'LIBTOOL' is undefined
lib/Makefile.am:31: The usual way to define 'LIBTOOL' is to add 'LT_INIT'
lib/Makefile.am:31: to 'configure.ac' and run 'aclocal' and 'autoconf' again.
lib/Makefile.am:31: If 'LT_INIT' is in 'configure.ac', make sure
lib/Makefile.am:31: its definition is in aclocal's search path.








Tuesday, May 23, 2017

iOS 静态库/动态库/ Framework


静态库

静态库即静态链接库,Windows 下的 .lib,Linux 和 Mac 下的 .a。
静态库的代码在编译过程中就被载入目标程序,因此目标程序的体积会比较大。
iOS静态库形式:.a和.framework(我们自己建立的)。

动态库

动态库即动态链接库,Windows 下的 .dll,Linux 下的 .so,Mac 下的 .dylib/.tbd。
动态库编译时只是引用,是在程序运行时候才加载的,因此不影响目标程序的体积。
iOS动态库形式:.dylib和.framework(属于系统的)。

iOS Framework
framework实际上是一种打包方式,将库的二进制文件,头文件和有关资源文件打包一起。
在iOS8之前,iOS平台不支持使用动态Framework; iOS8/Xcode 6推出后,才添加了动态库的支持,同时Xcode6也原生自带了Framework支持(动态和静态都可以)。

 CocoaPods支持
纯ObjC里,多数都是使用静态库.a来集成。建立private repo,  提供podspec配置


如果想集成Framework,podspec使用s.vendored_frameworks配置


而对于 Swift 项目,CocoaPods 提供了动态 Framework 的支持,在podfile里要使用use_frameworks!


参考资讯





Monday, May 8, 2017

编译directx-jun2010的Effects11工程引发的问题

Microsoft DirectX SDK (June 2010)简称directx-jun2010
在编译directx-jun2010\Samples\C++\Effects11\Effects11_2013.sln工程出错:


找不到directx-jun2010自己相关的头文件,查了一下工程的配置属性,发现VC++目录里使用到环境变量DXSDK_DIR,
由于在构建环境里,directx-jun2010是在其它环境安装后直接拿数据来用的,这就导致了DXSDK_DIR是不存在的。



我是使用nant脚本编译工程的,试着在编译前增加DXSDK_DIR的环境变量,但这对VC来说是不生效的


查询了devenv语法(https://msdn.microsoft.com/zh-cn/library/ms241275.aspx),发现它有一个开关/useenv, 作用是将环境变量加载到“VC++ 目录”对话框中。我尝试着将vccompile改为vccompile_useenv。


结果出现另一个错误


需要调用vsvars32.bat重新初始化VC的环境变量

exec不在同一个进程里,vsvars32.bat的调用无效。
最后,尝试重新设置INCLUDE,LIB环境变量以便工程编译中能找到相关的依赖文件,以下是编译脚本












Thursday, March 2, 2017

iOS应用上传AppStore出现Invalid Swift Support

【问题】
Invalid Swift Support - The bundle contains an invalid implementation of Swift. The app may have been built or signed with non-compliant or pre-release tools. Visit developer.apple.com for more information.
【解决】使用xcodebuild来编译,将丢失SwiftSupport目录。
解决的方式是:创建SwiftSupport,将swift lib库拷一份,注入Ipa包。

# Invalid Swift Support-- miss SwiftSupport
xcodepath=`xcode-select --print-path`
ipa_swift_frameworks=`find ${CONFIGURATION_BUILD_DIR}/${BUILD_PROEJCT_NAME}.app/Frameworks/ -name libswift*`
if [[ -n ${ipa_swift_frameworks} ]]; then 
    tmpDir=${CONFIGURATION_BUILD_DIR}/SwiftSupport
    [[ -d "$tmpDir" ]] || mkdir $tmpDir

    for LINE in ${ipa_swift_frameworks}
    do
      libname=`basename $LINE`
      cp "${xcodepath}/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/${sdk}/${libname}" $tmpDir
    done

    pushd ${CONFIGURATION_BUILD_DIR} && zip -r $WORKSPACE/artifacts/${MOBILE_APP_NAME}.ipa SwiftSupport
    popd
fi

参考资料:



使用codesign重签名ipa包

重新签名步骤

解压
unzip ysl.ipa

移除旧签名
rm -r "Payload/ysl.app/_CodeSignature" 2> /dev/null | true

替换 provisioning profile
cp "$MOBILEPROVISION" "Payload/ysl.app/embedded.mobileprovision"

entitlements生成
/usr/libexec/PlistBuddy -x -c "print :Entitlements " /dev/stdin <<< $(security cms -D -i "$MOBILEPROVISION") > "entitlements.plist"

重新签名
/usr/bin/codesign -f -s "iPhone Distribution: xxx” "--entitlements "entitlements.plist" "Payload/ysl.app"
例如:/usr/bin/codesign -f -s 8F16D32B97E8564C20613BC00699E547B265D62C --entitlements entitlements.plist Payload/ysl.app

验证签名
spctl -a -v Payload/ysl.app
/usr/bin/codesign --verify --deep --verbose=3 Payload/ysl.app

重新打包
zip -qr "ysl.resigned.ipa" Payload


重签名问题

【问题】 ERROR ITMS-90166: "Missing Code Signing Entitlements. No entitlements found in bundle 'com.ysl' for executable ‘Payload/ysl.app/ysl'.""
【解决】签名需要的Entitlements信息可以通过两个地方获取,一个是编译后生成在build/Distribute-iphone/objects/ysl.build/Distribute-iphoneos/ysl.build/ysl.app.xcent
另一种是通过从profile里获取,即/usr/libexec/PlistBuddy -x -c "print :Entitlements " /dev/stdin <<< $(security cms -D -i ~/ProvisioningProfiles/AppStore_com.ysl.mobileprovision) > entitlements.plist

【问题】ERROR ITMS-90179: "Invalid Code Signing. The executable ‘Payload/ysl.app/ysl' must be signed with the certificate that is contained in the provisioning profile."
【解决】发现是重签名指定的证书与 provisioning profile不匹配,重新分配。

[问题iPhone Distribution: xxxxx.: ambiguous (matches "iPhone Distribution: xxxxx" and "iPhone Distribution: xxxxx" in /Users/elian/Library/Keychains/ci.keychain)
按照官方提供的方案是需要删除重复的证书。但由于我们的环境是需要多证书的。故使用另一种方式解决,即获取证书的sha1值,在指定--sign时,后面跟上签名证书的sha1.例如:/usr/bin/codesign -f -s 8F16D32B97E8564C20613BC00699E547B265D62C 

如何获取sha1配置:
security find-identity -p codesigning login.keychain
8G16D32B97E8564C20613BC00699E547B265D26C "iPhone Distribution: Company11 name
003981HH13D6226942D43525E6045A23525A85AC "iPhone Distribution: Company22 name"
158DD26AD3B200CF12FE79C66CA9830C52D7813D"iPhone Distribution: Company33 name"

case “$signTeamName" in 
  *11*)
    signIdentity=9G16D32B97E8564C20613BC00699E547B265D35u
    ;;
  *22*)
    signIdentity=003981HH13D6226942D43525E6045A23525A85TD
    ;;
  *33*)
    signIdentity=868DD26AD3B200CF12FE79C66CA890C52D7890I
    ;;      
esac




Jenkins集成iOS单元测试

xctest是xcode5自带的,另外对block的支持,mock的支持都还好。 之前叫做OCUnit
【准备】
jenkins接收junit的单元测试报告,因些需要安装一个将ocunit格式的测试报告转为JUnit.
OCUnit2JUnit项目地址: https://github.com/ciryon/OCUnit2JUnit
安装方式:sudo gem install ocunit2junit
--问题: ocunit2junit在 ruby 1.8.7的环境不能运行,我试着升级ruby到2.0.0安装OK。

【运行】
1. 你可以单独准备单元测试的schemes,比如名为proTests.  或着build工程的schemes里含有单元测试的target。
2. 在build环节中增加:xcodebuild -sdk iphonesimulator7.0 -destination OS=7.0,name="iPhone Retina (4-inch)" -scheme proTests -configuration Release test  2>&1 | ocunit2junit
-- 问题:在xcdoe 5.0环境下运行,如果未加-destination,刚会报错:

3. 输出报告:默认报告输出目录test-reports
【报告】
jenkins集成报告:点击“Add post-build action”选择“Publish JUnit test result report”,输入内容test-reports/*.xml保存设置
效果图如下:


参考资料:
https://developer.apple.com/library/ios/technotes/tn2339/_index.htmlD




创建于14年10月28









Tuesday, February 21, 2017

客户端项目发布build设计

方案一:在取代码之前创建TAG

缺陷:Jenkins的SVN插件会根据触发时间去计算该获取的修订号,新创建TAG不在此时间范围内,会取不到。

方案二:发布build前创建TAG并调用另一个任务取该TAG的代码

缺陷:发布build前会先取代码,此时默认获取trunk的代码或者选中的其它开发线,该发布build的SVN修订号会默认该trunk或其它开发线的值,而不是另一个任务取完TAG的SVN修订号。
取巧:
1. 创建一个空的TAG,以便不需要获取trunk的代码或者选中其它开发线,以便节省构建时间。
2. 获取TAG代码的任务,在取完TAG之后创建属性文件记录SVN修订存储在WORKSPACE工作区。其中,要确保发布build任务与取TAG代码的任务保持在同一个WORKSPACE。


jenkins设计 

第二步:Configure release build
发布build相关参数设置

检测发布tag与发布对象是否一致

创建一个发布tag

获取发布tag并记录SVN_REVISION

创建于20140626