Mac App Storeã§è²©å£²å¯è½ãªã¢ããªããã«ãããqmakeã®ä¾ã¨ç°¡æè§£èª¬
ããã«ã¡ã¯ãKengoSawa2ã§ãã
ã¬ã¹ãã¹ãã¸ã§ã³æ ªå¼ä¼ç¤¾ã§ç¤¾å
åããã¼ã«ãQtã§ä½æããããwww.lespace.co.jp
éçºãè¡ã£ã¦ãããããè¬ã®ã¨ã³ã¸ãã¢ã§ãã
仿¥ã¯åçªã§ãããä¸è¨RapidCopyã®qmakeã«ã¤ãã¦ã解説é©å½ã«å
容ãæãã¦ã¿ããã¨æãã¾ãã
使 qmakeãé©å½ã«æããï¼
使 åçªã«qmakeãæãã®ãï¼ã£ã¦è©±ã«ãªãã®ã§ãããçç±ã¯åç´ã§ãã
ãQtã使ã£ã¦Mac AppStoreç¨ã¢ããªãä½ãããã®qmakeã®åèè³æããã¼ãã ã£ããã
ã§ãã
ãã¾ãã«ãæ
å ±ãç¡ãéãã¦é常ã«è¦å´ããã®ã§ãå¾ç¶ã®æ¹ããã®è¨äºãè¦ã¦åèã«ãã¦æ¥½ãã¦ãããã°ãªã¨æããæ¸ãã¦ã¿ã¾ããã
æ©éã®qmake
ãããã解説ããããããqmakeããã®ã¾ã¾è²¼ã£ãæ¹ãè¯ãã§ãããã¨ãããã¨ã§ã¨ããããè²¼ãã¾ãããã
ä¾ã«ãã£ã¦ã§ãããä¸ã¤ä¸ã¤ã®ã³ãã³ããä½ããã¦ããããªãã¨ãªãæ¸ãã¦ããã®ã§ãä¸èº«ã®è©³ç´°ã¯å²æãã¾ãã
QT += gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets multimedia #CONFIGãã©ã¡ã¼ã¿æå®ã®æå³ã¯ä»¥ä¸ã®éãã #ä½ãæå®ããªã(ã³ã¡ã³ãã¢ã¦ã) = Mac AppStoreç¨ã³ã³ãã¤ã«(Sandbox対å¿ç) #pro = Proçããã«ã(ã¬ã¹ãã¹ç´è²©çãã¤ãsandboxé対å¿) #trial = ä½é¨çããã«ã(ãã«ãæå»ãã2ã¶æçµéããã¨èµ·åãããã¯) #amazon = amazon.com販売çããã«ã #ä¸è¨ãçµã¿åããã¦ä½¿ç¨ãã #以ä¸ã®å ´åã¯RapidCopyProãä½é¨çã¨ãã¦ãã«ãæå® CONFIG += pro trial if(pro){ #proçã®å ´åã¯.appã®åç§°ãRapidCopyProã¨ãã TARGET = RapidCopyPro #amazon.comåãã®å ´åã¯ifdefã«_AMAZONãæå® if(amazon){ DEFINES += _AMAZON } } else{ #proæå®ããªãã®ã§AppStoreåã #.appã®åç§°ãRapidCopyã¨ãã TARGET = RapidCopy #AppStoreåãã®å ´åã¯ifdefã«_SANDBOXãæå® DEFINES += _SANDBOX } if(trial){ #ä½é¨çã®å ´åã¯ifdefã«_TRIALãæå® DEFINES += _TRIAL } #OS Xã®éçºç°å¢ã§ã¯Qtãã³ã³ãã¤ã«ãããæã®ç°å¢ããæ°ãããã¼ã¸ã§ã³ã®XCodeããªãªã¼ã¹ããã㨠#Appkitã®ããããªã©ã®ã¤ã³ã¯ã«ã¼ãå ã夿´ããããããã³ã³ãã¤ã«ä¸è½ã«ãªãã #ãã®æã以ä¸ã®ããã«ææ°ã®ã¤ã³ã¯ã«ã¼ãå ãæå®ããå¿ è¦ãããã #RapidCopyã¯Qt5.4.1ã使ç¨ããããã10.10ã¾ã§ã¯ä»¥ä¸ãåãå¿ è¦ãªãã£ãã®ããã QMAKE_MAC_SDK = macosx10.11 #ã©ã¤ãã©ãªéçºãããªãã¦ãåä½ã¢ããªã±ã¼ã·ã§ã³ä½ãã®ã§appæå® TEMPLATE = app #RapidCopyã¨RapidCopyProã¨ã§ã¢ã¤ã³ã³ãå¤ãã if(pro){ ICON = RapidCopyPro.icns } else{ ICON = RapidCopy.icns } #æ¥æ¬èªç¿»è¨³ãã¡ã¤ã«ãæå® TRANSLATIONS += RapidCopy_ja_JP.ts #-Lãªãã·ã§ã³ã«OS Xã¢ããªã®ã©ã¤ãã©ãªããªã³ã¯ããæå®ãã¢ããªãªãã¾ãå¿ é ã LIBS += -framework AppKit #å種ã½ã¼ã¹(C,C++) SOURCES += main.cpp \ mainwindow.cpp \ cfg.cpp \ fastcopy.cpp \ osl.cpp \ regexp.cpp \ tapi32ex.cpp \ tapi32u8.cpp \ tapi32v.cpp \ tlist.cpp \ tmisc.cpp \ utility.cpp \ version.cpp \ mainsettingdialog.cpp \ confirmdialog.cpp \ aboutdialog.cpp \ xxhash.c \ finactdialog.cpp \ smtp.cpp \ jobdialog.cpp \ registerdialog.cpp \ qblowfish.cpp \ joblistrenamedialog.cpp #å種ããã(C,C++) HEADERS += \ cfg.h \ fastcopy.h \ osl.h \ regexp.h \ tapi32ex.h \ tapi32u8.h \ tapi32v.h \ tlib.h \ tmisc.h \ utility.h \ version.h \ resource.h \ miscdlg.h \ mainwindow.h \ mainsettingdialog.h \ confirmdialog.h \ aboutdialog.h \ xxhash.h \ finactdialog.h \ smtp.h \ jobdialog.h \ cocoaapi.h \ registerdialog.h \ qblowfish.h \ qblowfish_p.h \ joblistrenamedialog.h #Objective-cã½ã¼ã¹ OBJECTIVE_SOURCES += \ GetCocoaOpenFile.mm #Objective-cããã OBJECTIVE_HEADERS += cocoaapi.h #å種.uiãã¡ã¤ã« FORMS += mainwindow.ui \ mainsettingdialog.ui \ confirmdialog.ui \ aboutdialog.ui \ finactdialog.ui \ jobdialog.ui \ registerdialog.ui \ joblistrenamedialog.ui #Qtã®å種ãªã½ã¼ã¹ãã¡ã¤ã« RESOURCES += res.qrc macx { #Mac Developperããã°ã©ã ã§Appleã«çºè¡ãã¦è²°ãã¢ããªã±ã¼ã·ã§ã³éçºå è¨¼ææ¸æ å ±æåå APPCERT = "3rd Party Mac Developer Application: L'ESPACE VISION CO.,LTD" #Mac Developperããã°ã©ã ã§Appleã«çºè¡ãã¦è²°ãã¤ã³ã¹ãã¼ã©éçºå è¨¼ææ¸æ å ±æåå INSTALLERCERT = "3rd Party Mac Developer Installer: L'ESPACE VISION CO.,LTD" #Mac Developper Programã§ç³è«ãèªå¯ãããBundleIdentifierãæå® if(pro){ BUNDLEID = com.LespaceVision.RapidCopyPro } else{ BUNDLEID = com.LespaceVision.RapidCopy } #Qtå®è¡ç°å¢ã¸ã®ãã¹ QTPATH = ~/Qt5.4/5.4/clang_64 #ã¯ã¼ã¯ãã£ã¬ã¯ããªè¨å® QTPROJECTS = /Users/lespace/QtProjects #ã¢ããªã±ã¼ã·ã§ã³ã®plistãã¢ããªã±ã¼ã·ã§ã³ã«åæã«æ ¼ç´ããQtã©ã¤ãã©ãªã®plistãæ ¼ç´ãããã©ã«ãã®ãã¹ãè¨å® #åãã£ã¬ã¯ããªå ã«ã¢ããªã«å¿ è¦ãªInfo.plistãäºåã«é ç½®ãã PLISTLOC = $${QTPROJECTS}/plist #RapidCopyProå°ç¨ãã¤ã³ã¹ãã¼ã©ã使ããã®ã«å¿ è¦ãªå種ãªã½ã¼ã¹ã¸ã®ãã¹ãå®ç¾©ãã #RapidCopyPro.appããInfo.plistãçæãå©ç¨ããããã®ã¯ã¼ã¯ãã£ã¬ã¯ã㪠PROPKGLOC = $${QTPROJECTS}/pkgpath #ã¤ã³ã¹ãã¼ã©ã®å種è¨å®ãè¨è¿°ããxmlãã¡ã¤ã«ãæ ¼ç´ãã¦ãããã©ã«ãã¸ã®ãã¹ãäºåã«é ç½®ãã¦ããã PRORESLOC = $${QTPROJECTS}/resource #pkgbuildã³ãã³ãã«æ¸¡ããã¼ã¸ã§ã³çªå·ã次verã®ãªãªã¼ã¹æã¯æã§å¤æ´ãã PROVER = 1.1.0 #Mac AppStoreã«æåºããå ´åã®ãSandBoxå¶ç´ä¾å¤ãè¨è¿°ããplist,ã¨ã³ã¿ã¤ãã«ã¡ã³ãplistã®æå®ãäºåã«é ç½®ãã¦ããã ENTITLEMENTS = $${PLISTLOC}/Entitlementsplist/Entitlements.plist #以ä¸,make codesignã¾ãã¯make productãå®è¡ããæè¡ã使¥ã«é¢ããè¨è¿° QMAKE_EXTRA_TARGETS += codesign product #以ä¸ã®ææ³ã使ç¨ãã¦commandsã«+=ãã¦ããæå¾ã«QMAKE_EXTRA_TARGETSã«codesignã追å ããã¨ãmake codesignã§codesignã«è¿½å ããcommandsã #é çªã«å®è¡ãã¦ãããã #RapidCopy(Pro).appå ã«Qtå®è¡ç¨ã©ã¤ãã©ãªãmacdeployqtã³ãã³ã codesign.commands += $${QTPATH}/bin/macdeployqt $${TARGET}.app -verbose=3; #äºåã«è¨è¿°ãç¨æãã¦ãããRapidCopy(pro)ã®Info.plistãæçµãã¤ããªå ã®Info.plistã«ä¸æ¸ããã if(pro){ codesign.commands += cp $${PLISTLOC}/Infoplist_pro/Info.plist $${TARGET}.app/Contents/Info.plist; } else{ codesign.commands += cp $${PLISTLOC}/Infoplist/Info.plist $${TARGET}.app/Contents/Info.plist; } #macdeployqtã§ã³ãã¼ããæçµãã¤ããªä¸ã«ããQtã©ã¤ãã©ãªã®ãã¬ã¼ã ã¯ã¼ã¯ä¸ã¤ä¸ã¤ãMac Developper Programã§åãåã£ãè¨¼ææ¸ã§ãµã¤ã³ããã #(ããããããªãã¨Mac AppStoreã«æåºã§ããªã) codesign.commands += codesign -f -s \"$${APPCERT}\" $${TARGET}.app/Contents/Frameworks/QtCore.framework; codesign.commands += codesign -f -s \"$${APPCERT}\" $${TARGET}.app/Contents/Frameworks/QtMultimedia.framework; codesign.commands += codesign -f -s \"$${APPCERT}\" $${TARGET}.app/Contents/Frameworks/QtNetwork.framework; codesign.commands += codesign -f -s \"$${APPCERT}\" $${TARGET}.app/Contents/Frameworks/QtPrintSupport.framework; codesign.commands += codesign -f -s \"$${APPCERT}\" $${TARGET}.app/Contents/Frameworks/QtGui.framework; codesign.commands += codesign -f -s \"$${APPCERT}\" $${TARGET}.app/Contents/Frameworks/QtMultimediaWidgets.framework; codesign.commands += codesign -f -s \"$${APPCERT}\" $${TARGET}.app/Contents/Frameworks/QtOpenGL.framework; codesign.commands += codesign -f -s \"$${APPCERT}\" $${TARGET}.app/Contents/Frameworks/QtWidgets.framework; #ãã¬ã¼ã ã¯ã¼ã¯ã¸ã®ãµã¤ã³ã¨åæ§ããã©ã°ã¤ã³ã®ã©ã¤ãã©ãªã«ãå ¨ã¦ãµã¤ã³ãã if(pro){ codesign.commands += codesign -f -s \"$${APPCERT}\" $${TARGET}.app/Contents/PlugIns/audio/*.dylib; codesign.commands += codesign -f -s \"$${APPCERT}\" $${TARGET}.app/Contents/PlugIns/bearer/*.dylib; codesign.commands += codesign -f -s \"$${APPCERT}\" $${TARGET}.app/Contents/PlugIns/imageformats/*.dylib; codesign.commands += codesign -f -s \"$${APPCERT}\" $${TARGET}.app/Contents/PlugIns/mediaservice/*.dylib; codesign.commands += codesign -f -s \"$${APPCERT}\" $${TARGET}.app/Contents/PlugIns/platforms/*.dylib; codesign.commands += codesign -f -s \"$${APPCERT}\" $${TARGET}.app/Contents/PlugIns/printsupport/*.dylib; } else{ codesign.commands += codesign -f -s \"$${APPCERT}\" -i $${BUNDLEID} $${TARGET}.app/Contents/PlugIns/audio/*.dylib; codesign.commands += codesign -f -s \"$${APPCERT}\" -i $${BUNDLEID} $${TARGET}.app/Contents/PlugIns/bearer/*.dylib; codesign.commands += codesign -f -s \"$${APPCERT}\" -i $${BUNDLEID} $${TARGET}.app/Contents/PlugIns/imageformats/*.dylib; codesign.commands += codesign -f -s \"$${APPCERT}\" -i $${BUNDLEID} $${TARGET}.app/Contents/PlugIns/mediaservice/*.dylib; codesign.commands += codesign -f -s \"$${APPCERT}\" -i $${BUNDLEID} $${TARGET}.app/Contents/PlugIns/platforms/*.dylib; codesign.commands += codesign -f -s \"$${APPCERT}\" -i $${BUNDLEID} $${TARGET}.app/Contents/PlugIns/printsupport/*.dylib; } #ãã³ãã«å ã®ãã¬ã¼ã ã¯ã¼ã¯åã³ãã©ã°ã¤ã³å ¨ã¦ã«ã³ã¼ããµã¤ã³ãçµãã£ãããã³ãã«ã§ãã.appãã³ã¼ããµã¤ã³ãã if(pro){ codesign.commands += codesign -f -s \"$${APPCERT}\" -v $${TARGET}.app; } else{ #Mac AppStoreã«æåºããå ´åã«ã¯ããã§Entitlementsã®plistãæå®ãã¦ããå¿ è¦ãããã codesign.commands += codesign -f -s \"$${APPCERT}\" -v --entitlements $${ENTITLEMENTS} $${TARGET}.app; } #ããããproductbuildã³ãã³ãã使ç¨ããæçµãã«ãã®çµã¿ç«ã¦å¦ç if(pro){ #proçã®å ´åã¯ãããããçãªã¤ã³ã¹ãã¼ã©ç»é¢ã®è¨å®ãæ§verãæ¢ã«åå¨ãã¦ããå ´åã®å¯¾å¿ãªã©ãæåã§ã«ã¼ã«æ±ºãããã®ã§ããè¤éã #codesignã¾ã§çµãã£ããã³ãã«ã䏿pkgãã£ã¬ã¯ããªã«è¤è£½ product.commands += cp -rf $${TARGET}.app $${PROPKGLOC}; #䏿pkgãã£ã¬ã¯ããªå ã®ãã³ãã«ããproductbuildã«å¿ è¦ãªplistãéçæãã product.commands += pkgbuild --analyze --root $${PROPKGLOC} $${PROPKGLOC}/$${TARGET}.plist; #éçæããplistå ã«plutilã³ãã³ãã使ã£ã¦ã䏿¸ãã¤ã³ã¹ãã¼ã«æã®æåè¨å®ãè¡ãã #BundleIsRelocatableãfalseã«è¨å®ããªãã¨ãæ¢ã«å¤ãverãã¤ã³ã¹ãã¼ã«æ¸ã¿ã®å ´åã«æ£ããã¤ã³ã¹ãã¼ã«ãã¦ãããªã product.commands += plutil -replace BundleIsRelocatable -bool false $${PROPKGLOC}/$${TARGET}.plist; #BundleIsVersionCheckedãfalseã«è¨å®ããªãã¨ãããã¦å¤ãverã䏿¸ãã¤ã³ã¹ãã¼ã«ãããå ´åã«æ»ããªããªã product.commands += plutil -replace BundleIsVersionChecked -bool false $${PROPKGLOC}/$${TARGET}.plist; #ãããã£ãplistãå ã«ãã¤ã³ã¹ãã¼ã«ç¨ã®ãµãã³ã³ãã¼ãã³ãã使ããã #è£è¶³:RapidCopy(Pro)ã§ã¯ãµãã³ã³ãã¼ãã³ããï¼åãããªãã®ã§ãä¸ã®ã³ãã³ããä¸åã ãã©è¤æ°ã®ããã±ã¼ã¸ãä¸ã¤ã®ã¤ã³ã¹ãã¼ã©ã«åä½ãããããã§ãããããã product.commands += pkgbuild --root $${PROPKGLOC} --component-plist $${PROPKGLOC}/$${TARGET}.plist --identifier $${BUNDLEID} --version $${PROVER} --install-location /Applications $${TARGET}.pkg; #æçµã¤ã³ã¹ãã¼ã©ãproductbuildã³ãã³ããç¨ãã¦ä½æããã product.commands += productbuild --distribution $${PRORESLOC}/Dist.xml --package-path $${PROPKGLOC} --resources $${PRORESLOC} $${TARGET}Installer.pkg; #䏿pkgãã£ã¬ã¯ããªå ã®åç¨®ä¸æãã¡ã¤ã«ãåé¤ product.commands += rm -rf $${PROPKGLOC}/*; } else{ #AppStoreçã®å ´åã¯ã¤ã³ã¹ãã¼ã©é¨åãä¸è¦ããã¤ãã¼ã¸ã§ã³ç®¡çãªã©ã¯å ¨ã¦AppStoreã®ä»æãã«ãä»»ããªã®ã§ã以ä¸ã ãã§ok product.commands += productbuild --component $${TARGET}.app /Applications --sign \"$${INSTALLERCERT}\" $${TARGET}.pkg; } }
å®éã«è£½åãã«ãããã¨ãã¯
åã®å ´åã¯ä»¥ä¸ã®ãããªé©å½ãªã·ã§ã«ã¹ã¯ãªãããç¨æãã¦ã製åãã«ãããã¨ãã ãã·ã§ã«ãã¿ã¼ããã«ããå©ãã¦ãã¾ãã
!/bin/bash cd /Users/lespace/QtProjects/build-rapidcopy_main-Desktop_Qt_5_4_1_clang_64bit-Release rm -rf RapidCopy*.app make clean make make codesign make product
å 容ã¯ãªãã¨ããããã ãã¶é©å½ã§ãããã¤ã³ãã¯
make codesign
make product
ã®ã¨ããã§ããã
ãã®å¼æ°ã¯QMAKE_EXTRA_TARGETSã§æå®ããä»»ææååãªããã§ãã
QtCreatorã«ã¯makeã«å¼æ°ã渡ãã¦å®è¡ããæ©è½ãããã®ã§ããããæ´»ç¨ããã¨ãã£ã¨ä¾¿å©ããããã¾ãããã
ã¿ã¼ããã«ã«ã°ãã°ãã¼ã£ã¨åºã¦ãããæ¹ã好ã¿ãªã®ã§ãã¨ããããã¯ããã§ãããã¼æã§ãã
å¤§è¦æ¨¡éçºã®æ¹ãªã©ã¯ãã£ã¨è²ã
è©°ããªãã¨ãããªãã§ããããã
ä»åã®è¨äºãæ¸ãã«ããã£ã¦ãç¡é§ãªã¨ãããè²ã
æ¶ããããã¦ç¶ºéºã«ãã¦ã¿ã¾ãããã
ãã£ã¨é ã®è¯ãããæ¹ã¯ãã£ã±ãããã¨æãã¾ããã
OSXã®qmakeã«è©³ããæ¹ã®ããã³ããå¾
ã¡ãã¦ããã¾ãï¼ï¼
ã¾ããMacç°å¢ã§Qtã使ã£ã¦éçºããã¦ãããããtwitterKengo Sawatsu (@KengoSawa2) | Twitter
ã§ããQtåå¼·ä¼ã§ããªãã§ãè¯ãã®ã§ãæ¯éæ
å ±äº¤æãã¾ãããã¼ã