def run(self, argv, dependencies): self.parse_args(argv) if self.is_clean_before_build: utils.rmdir(self.simulator_output_dir) # backup some files modify_files = self.get_depend_project_file_list() if cocos.os_is_mac() and self.build_mac: modify_files.append(os.path.join(self.simulator_abs_path, 'frameworks/runtime-src/proj.ios_mac/mac/Info.plist')) if cocos.os_is_win32() and self.build_win: modify_files.append(os.path.join(self.simulator_abs_path, 'frameworks/runtime-src/proj.win32/game.rc')) self.backup_files(modify_files) try: # modify bundle version self.update_bundle_version() # modify project config files self.change_cocos2d_debug_macro_to_1(modify_files) # compile simulator self.do_compile() except Exception as e: raise e finally: # roll back modified files self.rollback_files(modify_files) Logging.info("") Logging.info(self.build_log) Logging.info("") return 0
def _filter_platforms(self, platforms): ret = [] platforms_for_os = { "linux": [ Platforms.WEB, Platforms.LINUX, Platforms.ANDROID, Platforms.TIZEN ], "mac": [ Platforms.WEB, Platforms.IOS, Platforms.MAC, Platforms.ANDROID, Platforms.TIZEN ], "win32": [ Platforms.WEB, Platforms.WIN32, Platforms.ANDROID, Platforms.METRO, Platforms.TIZEN ] } for p in platforms: if cocos.os_is_linux(): if p in platforms_for_os["linux"]: ret.append(p) if cocos.os_is_mac(): if p in platforms_for_os["mac"]: ret.append(p) if cocos.os_is_win32(): if p in platforms_for_os["win32"]: ret.append(p) return ret
def _run_ios_app(self, ios_app_path): if not cocos.os_is_mac(): raise cocos.CCPluginError( 'Now only support run iOS simulator on Mac OS') # get bundle id bundle_id = self._get_bundle_id(ios_app_path) # find simulator simulator_id = self._get_simulator_id() try: # run the simulator xcode_version = cocos.get_xcode_version() xcode9_and_upper = cocos.version_compare(xcode_version, ">=", 9) if xcode9_and_upper: self._run_cmd('xcrun simctl boot "%s"' % simulator_id) self._run_cmd( 'open `xcode-select -p`/Applications/Simulator.app') else: self._run_cmd('xcrun instruments -w "%s"' % simulator_id) except Exception as e: pass # install app self._run_cmd('xcrun simctl install "%s" "%s"' % (simulator_id, ios_app_path)) # run app self._run_cmd('xcrun simctl launch "%s" "%s"' % (simulator_id, bundle_id))
def update_bundle_version(self): build_date = date.today().strftime("%Y%m%d") if cocos.os_is_mac() and self.build_mac: # mac info_plist_path = os.path.join(self.simulator_abs_path, "frameworks/runtime-src/proj.ios_mac/mac/Info.plist") info_plist_content = self.get_content_from_file(info_plist_path) match = re.compile('<key>CFBundleVersion</key>(\s)*<string>(.*?)</string>').findall(info_plist_content) if len(match): build_date_tag = "<string>%s</string>" % match[0][1] keyword_map = { build_date_tag : "<string>%s</string>" % build_date } self.replace_keyword_with_file(info_plist_path, keyword_map) match = re.compile('<key>CFBundleShortVersionString</key>(\s)*<string>(.*?)</string>').findall(info_plist_content) if len(match): build_date_tag = "<string>%s</string>" % match[0][1] keyword_map = { build_date_tag : "<string>%s</string>" % self.engine_version } self.replace_keyword_with_file(info_plist_path, keyword_map) if cocos.os_is_win32() and self.build_win: # win32 game_rc_path = os.path.join(self.simulator_abs_path,"frameworks/runtime-src/proj.win32/game.rc") game_rc_content = self.get_content_from_file(game_rc_path) match = re.compile('"Version[^\(]*\(.*\)"').findall(game_rc_content) if len(match): build_info_str = match[0] target_str = '"Version %s (%s)"' % (self.engine_version, build_date) keyword_map = { build_info_str : target_str} self.replace_keyword_with_file(game_rc_path,keyword_map)
def open_webbrowser(self, url): if self._browser is None: threading.Event().wait(1) webbrowser.open_new(url) else: if cocos.os_is_mac(): url_cmd = 'open -a "%s" "%s"' % (self._browser, url) else: url_cmd = '"%s" %s' % (self._browser, url) self._run_cmd(url_cmd)
def get_luajit_path(self): ret = None if cocos.os_is_win32(): ret = os.path.join(self._workingdir, "bin", "luajit.exe") elif cocos.os_is_mac(): ret = os.path.join(self._workingdir, "bin", "luajit-mac") elif cocos.os_is_linux(): ret = os.path.join(self._workingdir, "bin", "luajit-linux") return ret
def open_webbrowser(self, url): if self._browser is None: threading.Event().wait(1) webbrowser.open_new(url) else: if cocos.os_is_mac(): url_cmd = "open -a \"%s\" \"%s\"" % (self._browser, url) else: url_cmd = "\"%s\" %s" % (self._browser, url) self._run_cmd(url_cmd)
def get_depend_project_file_list(self): file_list = [] if cocos.os_is_mac() and (self.build_mac or self.build_ios): IOS_MAC_PROJECT_SUFFIX = "project.pbxproj" IOS_MAC_PROJECT_REFERENCES_TAG = 'ProjectRef =' IOS_MAC_PROJECT_NAME_RE = r'\w+.xcodeproj' IOS_MAC_PROJECT_PATH_RE = r'name = %s; path = (.)*.xcodeproj' project_file_path = os.path.join( self.simulator_abs_path, SimulatorCompiler.SIMULATOR_XCODE_PATH, IOS_MAC_PROJECT_SUFFIX) contents_str = self.get_content_from_file(project_file_path) lines = re.split(r'\n', contents_str) simulator_mac_project_path = os.path.dirname( os.path.dirname(project_file_path)) project_references = [] for l in lines: if IOS_MAC_PROJECT_REFERENCES_TAG in l: ret = re.search(IOS_MAC_PROJECT_NAME_RE, l) if ret: project_references.append(ret.group(0)) for references in project_references: re_str = IOS_MAC_PROJECT_PATH_RE % references ret = re.search(re_str, contents_str) if ret: match_str = ret.group(0) match_str = match_str.replace( "name = %s; path = " % references, "") match_str = match_str.replace('"', "") file_list.append( os.path.join(simulator_mac_project_path, match_str, IOS_MAC_PROJECT_SUFFIX)) if cocos.os_is_win32() and self.build_android: WIN32_PROJECT_TAG = "Project(\"" project_file_path = os.path.join( self.simulator_abs_path, SimulatorCompiler.SIMULATOR_SLN_PATH) simulator_win32_project_path = os.path.dirname(project_file_path) content_str = self.get_content_from_file(project_file_path) lines = content_str.split('\n') for l in lines: if l.startswith(WIN32_PROJECT_TAG): ret = re.compile('"(.*?)"').findall(l.split(',')[1]) if ret: path = self.convert_path_to_win32( os.path.join(simulator_win32_project_path, ret[0])) file_list.append(path) return file_list
def get_luajit_path(self): ret = None bit_prefix = "64bit" if self._bytecode_64bit else "32bit" if cocos.os_is_win32(): ret = os.path.join(self._workingdir, "bin", bit_prefix, "luajit-win32.exe") elif cocos.os_is_mac(): ret = os.path.join(self._workingdir, "bin", bit_prefix, "luajit-mac") elif cocos.os_is_linux(): ret = os.path.join(self._workingdir, "bin", bit_prefix, "luajit-linux") print("luajit bin path: " + ret) return ret
def do_compile(self): if cocos.os_is_mac(): if self.build_mac: self.compile_for_osx() if self.build_ios: self.compile_for_ios() if cocos.os_is_win32(): if self.build_win: self.compile_for_win32() if self.build_android: self.compile_for_android()
def _filter_platforms(self, platforms): ret = [] for p in platforms: if cocos.os_is_linux(): if p == Platforms.WEB or p == Platforms.LINUX or p == Platforms.ANDROID: ret.append(p) if cocos.os_is_mac(): if p == Platforms.WEB or p == Platforms.IOS or p == Platforms.MAC or p == Platforms.ANDROID: ret.append(p) if cocos.os_is_win32(): if p == Platforms.WEB or p == Platforms.WIN32 or p == Platforms.ANDROID: ret.append(p) return ret
def compile(self): if self.clean: self.clean_libs() if cocos.os_is_mac(): if self.build_mac or self.build_ios: self.compile_mac_ios() if cocos.os_is_win32(): if self.build_win: self.compile_win() if self.build_android: self.compile_android()
def _convert_path_to_python(self, path): """ COnvert path which include space to correct style which python can treat correctly. eg: on mac: convert '/usr/xxx/apache-ant\ 1.9.3' to '/usr/xxx/apache-ant 1.9.3' eg: on windows: convert '"c:\apache-ant 1.9.3"\bin' to 'c:\apache-ant 1.9.3\bin' """ ret = path if cocos.os_is_mac(): ret = path.replace("\ ", " ") if cocos.os_is_win32(): ret = ret.replace("\"", "") # print("!!!!! Convert %s to %s\n" % (path, ret)) return ret
def _convert_path_to_cmd(self, path): """ Convert path which include space to correct style which bash(mac) and cmd(windows) can treat correctly. eg: on mac: convert '/usr/xxx/apache-ant 1.9.3' to '/usr/xxx/apache-ant\ 1.9.3' eg: on windows: convert '"c:\apache-ant 1.9.3"\bin' to '"c:\apache-ant 1.9.3\bin"' """ ret = path if cocos.os_is_mac(): ret = path.replace("\ ", " ").replace(" ", "\ ") if cocos.os_is_win32(): ret = "\"%s\"" % (path.replace("\"", "")) # print("!!!!! Convert %s to %s\n" % (path, ret)) return ret
def compile(self): if self.clean: self.clean_libs() if cocos.os_is_mac(): if self.build_mac or self.build_ios: self.compile_mac_ios() if cocos.os_is_win32(): if self.build_win: self.compile_win() if self.build_android: self.compile_android() # generate prebuilt mk files self.modify_binary_mk()
def get_system_info(): if cocos.os_is_win32(): ret_str = "windows" ret_str += "_%s" % platform.release() if cocos.os_is_32bit_windows(): ret_str += "_%s" % "32bit" else: ret_str += "_%s" % "64bit" elif cocos.os_is_mac(): ret_str = "mac_%s" % (platform.mac_ver()[0]).replace(".", "_") elif cocos.os_is_linux(): ret_str = "linux_%s" % platform.linux_distribution()[0] else: ret_str = "unknown" return ret_str
def get_luajit_path(self): ret = None bit_prefix = "64bit" if self._bytecode_64bit else "32bit" if cocos.os_is_win32(): ret = os.path.join(self._workingdir, "bin", bit_prefix, "luajit-win.exe") elif cocos.os_is_mac(): ret = os.path.join(self._workingdir, "bin", bit_prefix, "luajit-mac") elif cocos.os_is_linux(): ret = os.path.join(self._workingdir, "bin", bit_prefix, "luajit-linux") print("luajit bin path: " + ret) return ret
def get_system_info(): if cocos.os_is_win32(): ret_str = "windows" ret_str += "_%s" % platform.release() if cocos.os_is_32bit_windows(): ret_str += "_%s" % "32bit" else: ret_str += "_%s" % "64bit" elif cocos.os_is_mac(): ret_str = "mac_%s" % (platform.mac_ver()[0]).replace('.', '_') elif cocos.os_is_linux(): ret_str = "linux_%s" % platform.linux_distribution()[0] else: ret_str = "unknown" return ret_str
def open_webbrowser(self, url): if self._browser is None: threading.Event().wait(1) webbrowser.open_new(url) else: if cocos.os_is_mac(): if self._param is None: url_cmd = "open -a \"%s\" \"%s\"" % (self._browser, url) else: url_cmd = "\"%s\" \"%s\" %s" % (self._browser, url, self._param) else: if self._param is None: url_cmd = "\"%s\" %s" % (self._browser, url) else: url_cmd = "\"%s\" \"%s\" %s" % (self._browser, url, self._param) self._run_cmd(url_cmd)
def get_depend_project_file_list(self): file_list = [] if cocos.os_is_mac() and (self.build_mac or self.build_ios): IOS_MAC_PROJECT_SUFFIX = "project.pbxproj" IOS_MAC_PROJECT_REFERENCES_TAG = 'ProjectRef =' IOS_MAC_PROJECT_NAME_RE = r'\w+.xcodeproj' IOS_MAC_PROJECT_PATH_RE = r'name = %s; path = (.)*.xcodeproj' project_file_path = os.path.join(self.simulator_abs_path, SimulatorCompiler.SIMULATOR_XCODE_PATH, IOS_MAC_PROJECT_SUFFIX) contents_str = self.get_content_from_file(project_file_path) lines = re.split(r'\n', contents_str) simulator_mac_project_path = os.path.dirname(os.path.dirname(project_file_path)) project_references = [] for l in lines: if IOS_MAC_PROJECT_REFERENCES_TAG in l: ret = re.search(IOS_MAC_PROJECT_NAME_RE, l) if ret: project_references.append(ret.group(0)) for references in project_references: re_str = IOS_MAC_PROJECT_PATH_RE % references ret = re.search(re_str, contents_str) if ret: match_str = ret.group(0) match_str = match_str.replace("name = %s; path = " % references, "") match_str = match_str.replace('"', "") file_list.append(os.path.join(simulator_mac_project_path, match_str, IOS_MAC_PROJECT_SUFFIX)) if cocos.os_is_win32() and self.build_android: WIN32_PROJECT_TAG = "Project(\"" project_file_path = os.path.join(self.simulator_abs_path, SimulatorCompiler.SIMULATOR_SLN_PATH) simulator_win32_project_path = os.path.dirname(project_file_path) content_str = self.get_content_from_file(project_file_path) lines = content_str.split('\n') for l in lines: if l.startswith(WIN32_PROJECT_TAG): ret = re.compile('"(.*?)"').findall(l.split(',')[1]) if ret: path = self.convert_path_to_win32(os.path.join(simulator_win32_project_path, ret[0])) file_list.append(path) return file_list
def get_keywords(self): osx_keyword = { "CC_TARGET_OS_IPHONE,":"CC_TARGET_OS_IPHONE,\n\"COCOS2D_DEBUG=1\",", "CC_TARGET_OS_MAC,":"CC_TARGET_OS_MAC,\n\"COCOS2D_DEBUG=1\",", "COCOS2D_DEBUG=0":"COCOS2D_DEBUG=1", } win_keyword = { "_WINDOWS":"_WINDOWS;COCOS2D_DEBUG=1", } if cocos.os_is_mac(): return osx_keyword if cocos.os_is_win32(): return win_keyword return {}
def get_user_agent(): ret_str = None if cocos.os_is_win32(): ver_info = sys.getwindowsversion() ver_str = '%d.%d' % (ver_info[0], ver_info[1]) if cocos.os_is_32bit_windows(): arch_str = "WOW32" else: arch_str = "WOW64" ret_str = "Mozilla/5.0 (Windows NT %s; %s) Chrome/33.0.1750.154 Safari/537.36" % (ver_str, arch_str) elif cocos.os_is_mac(): ver_str = (platform.mac_ver()[0]).replace('.', '_') ret_str = "Mozilla/5.0 (Macintosh; Intel Mac OS X %s) Chrome/35.0.1916.153 Safari/537.36" % ver_str elif cocos.os_is_linux(): arch_str = platform.machine() ret_str = "Mozilla/5.0 (X11; Linux %s) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1636.0 Safari/537.36" % arch_str return ret_str
def get_bi_params(events, event_value, multi_events=False): if cocos.os_is_win32(): system_str = 'windows' ver_info = sys.getwindowsversion() ver_str = '%d.%d' % (ver_info[0], ver_info[1]) if cocos.os_is_32bit_windows(): arch_str = "_32bit" else: arch_str = "_64bit" system_ver = '%s%s' % (ver_str, arch_str) elif cocos.os_is_mac(): system_str = 'mac' system_ver = (platform.mac_ver()[0]) elif cocos.os_is_linux(): system_str = 'linux' system_ver = platform.machine() else: system_str = 'unknown' system_ver = 'unknown' events_param = [] if multi_events: for e in events: events_param.append(gen_bi_event(e, event_value)) else: events_param.append(gen_bi_event(events, event_value)) params = { 'device': { '10': system_ver, '11': system_str }, 'app': { '7': BI_APPID, '8': cocos.COCOS2D_CONSOLE_VERSION, '9': get_language() }, 'time': get_time_stamp(), 'events': events_param } return params
def get_bi_params(events, event_value, multi_events=False, engine_versio=''): if cocos.os_is_win32(): system_str = 'windows' ver_info = sys.getwindowsversion() ver_str = '%d.%d' % (ver_info[0], ver_info[1]) if cocos.os_is_32bit_windows(): arch_str = "_32bit" else: arch_str = "_64bit" system_ver = '%s%s' % (ver_str, arch_str) elif cocos.os_is_mac(): system_str = 'mac' system_ver = (platform.mac_ver()[0]) elif cocos.os_is_linux(): system_str = 'linux' system_ver = platform.machine() else: system_str = 'unknown' system_ver = 'unknown' events_param = [] if multi_events: for e in events: events_param.append(gen_bi_event(e, event_value)) else: events_param.append(gen_bi_event(events, event_value)) params = { 'device': { '10' : system_ver, '11' : system_str }, 'app': { '7' : BI_APPID, '8' : engine_version, '9' : get_language() }, 'time' : get_time_stamp(), 'events' : events_param } return params
def _filter_platforms(self, platforms): ret = [] platforms_for_os = { "linux" : [ Platforms.WEB, Platforms.LINUX, Platforms.ANDROID, Platforms.TIZEN ], "mac" : [ Platforms.WEB, Platforms.IOS, Platforms.MAC, Platforms.ANDROID, Platforms.TIZEN ], "win32" : [ Platforms.WEB, Platforms.WIN32, Platforms.ANDROID, Platforms.METRO, Platforms.TIZEN ] } for p in platforms: if cocos.os_is_linux(): if p in platforms_for_os["linux"]: ret.append(p) if cocos.os_is_mac(): if p in platforms_for_os["mac"]: ret.append(p) if cocos.os_is_win32(): if p in platforms_for_os["win32"]: ret.append(p) return ret
def _run_ios_app(self, ios_app_path): if not cocos.os_is_mac(): raise cocos.CCPluginError('Now only support run iOS simulator on Mac OS') # get bundle id bundle_id = self._get_bundle_id(ios_app_path) # find simulator simulator_id = self._get_simulator_id() try: # run the simulator self._run_cmd('xcrun instruments -w "%s"' % simulator_id) except Exception as e: pass # install app self._run_cmd('xcrun simctl install "%s" "%s"' % (simulator_id, ios_app_path)) # run app self._run_cmd('xcrun simctl launch "%s" "%s"' % (simulator_id, bundle_id))
def compile_android(self): # build .so for android cmd_path = self._get_cocos_cmd_path() engine_dir = self.repo_x # build the simulator project proj_path = os.path.join(engine_dir, 'tests/cpp-empty-test') if self.language == 'lua': proj_path = os.path.join(engine_dir, 'tests/lua-empty-test') elif self.language == 'js': proj_path = os.path.join(engine_dir, 'tests/js-tests') build_cmd = "%s compile -s %s -p android --ndk-mode %s --app-abi %s" % ( cmd_path, proj_path, self.mode, self.app_abi) if self.android_platform is not None: build_cmd += ' --ap %s' % self.android_platform self._run_cmd(build_cmd) # copy .a to prebuilt dir ANDROID_A_PATH = "proj.android/app/build/intermediates/ndkBuild/%s/obj/local/%s" % ( self.mode, self.app_abi) if self.language != 'cpp': ANDROID_A_PATH = 'project/' + ANDROID_A_PATH android_out_dir = os.path.join(self.lib_dir, "android") obj_dir = os.path.join(proj_path, ANDROID_A_PATH) copy_cfg = { "from": obj_dir, "to": android_out_dir, "include": ["*.a$"] } cocos.copy_files_with_config(copy_cfg, obj_dir, android_out_dir) if not self.disable_strip: # strip the android libs ndk_root = os.environ["NDK_ROOT"] if cocos.os_is_win32(): if cocos.os_is_32bit_windows(): check_bits = ["", "-x86_64"] else: check_bits = ["-x86_64", ""] sys_folder_name = "windows" for bit_str in check_bits: check_folder_name = "windows%s" % bit_str check_path = os.path.join( ndk_root, "toolchains/arm-linux-androideabi-4.9/prebuilt/%s" % check_folder_name) if os.path.isdir(check_path): sys_folder_name = check_folder_name break elif cocos.os_is_mac(): sys_folder_name = "darwin-x86_64" else: sys_folder_name = "linux-x86_64" # set strip execute file name if cocos.os_is_win32(): strip_execute_name = "strip.exe" else: strip_execute_name = "strip" # strip arm libs strip_cmd_path = os.path.join( ndk_root, "toolchains/arm-linux-androideabi-4.9/prebuilt/%s/arm-linux-androideabi/bin/%s" % (sys_folder_name, strip_execute_name)) if os.path.exists(strip_cmd_path): self.trip_libs(strip_cmd_path, os.path.join(android_out_dir, "armeabi-v7a")) # strip arm64-v8a libs strip_cmd_path = os.path.join( ndk_root, "toolchains/aarch64-linux-android-4.9/prebuilt/%s/aarch64-linux-android/bin/%s" % (sys_folder_name, strip_execute_name)) if os.path.exists(strip_cmd_path) and os.path.exists( os.path.join(android_out_dir, "arm64-v8a")): self.trip_libs(strip_cmd_path, os.path.join(android_out_dir, 'arm64-v8a')) # strip x86 libs strip_cmd_path = os.path.join( ndk_root, "toolchains/x86-4.8/prebuilt/%s/i686-linux-android/bin/%s" % (sys_folder_name, strip_execute_name)) if os.path.exists(strip_cmd_path) and os.path.exists( os.path.join(android_out_dir, "x86")): self.trip_libs(strip_cmd_path, os.path.join(android_out_dir, 'x86'))
def build_ios(self): if not self._platforms.is_ios_active(): return if not cocos.os_is_mac(): raise cocos.CCPluginError("Please build on MacOSX") self.check_ios_mac_build_depends() project_dir = self._project.get_project_dir() ios_project_dir = self._platforms.project_path() build_mode = self._mode if self._project._is_script_project(): if build_mode == 'debug': output_dir = os.path.join(project_dir, CCPluginCompile.OUTPUT_DIR_SCRIPT_DEBUG, 'ios') else: output_dir = os.path.join(project_dir, CCPluginCompile.OUTPUT_DIR_SCRIPT_RELEASE, 'ios') else: output_dir = os.path.join(project_dir, CCPluginCompile.OUTPUT_DIR_NATIVE, build_mode, 'ios') projectPath = os.path.join(ios_project_dir, self.xcodeproj_name) pbxprojectPath = os.path.join(projectPath, "project.pbxproj") f = file(pbxprojectPath) contents = f.read() section = re.search(r"Begin PBXProject section.*End PBXProject section", contents, re.S) if section is None: message = "Can't find iOS target" raise cocos.CCPluginError(message) targets = re.search(r"targets = (.*);", section.group(), re.S) if targets is None: message = "Can't find iOS target" raise cocos.CCPluginError(message) targetName = None cfg_obj = self._platforms.get_current_config() if cfg_obj.target_name is not None: targetName = cfg_obj.target_name else: names = re.split("\*", targets.group()) for name in names: if "iOS" in name: targetName = str.strip(name) if targetName is None: message = "Can't find iOS target" raise cocos.CCPluginError(message) if os.path.isdir(output_dir): target_app_dir = os.path.join(output_dir, "%s.app" % targetName[:targetName.find(' ')]) if os.path.isdir(target_app_dir): shutil.rmtree(target_app_dir) cocos.Logging.info("building") command = ' '.join([ "xcodebuild", "-project", "\"%s\"" % projectPath, "-configuration", "%s" % 'Debug' if self._mode is 'debug' else 'Release', "-target", "\"%s\"" % targetName, "-sdk", "iphonesimulator", "-arch i386", "CONFIGURATION_BUILD_DIR=%s" % (output_dir) ]) self._run_cmd(command) filelist = os.listdir(output_dir) for filename in filelist: name, extention = os.path.splitext(filename) if extention == '.a': filename = os.path.join(output_dir, filename) os.remove(filename) if extention == '.app' and name == targetName: filename = os.path.join(output_dir, filename) newname = os.path.join(output_dir, name[:name.find(' ')]+extention) os.rename(filename, newname) self._iosapp_path = newname if self._no_res: self._remove_res(self._iosapp_path) cocos.Logging.info("build succeeded.")
def build_mac(self): if not self._platforms.is_mac_active(): return if not cocos.os_is_mac(): raise cocos.CCPluginError("Please build on MacOSX") self.check_ios_mac_build_depends() mac_project_dir = self._platforms.project_path() output_dir = self._output_dir projectPath = os.path.join(mac_project_dir, self.xcodeproj_name) pbxprojectPath = os.path.join(projectPath, "project.pbxproj") f = file(pbxprojectPath) contents = f.read() section = re.search( r"Begin PBXProject section.*End PBXProject section", contents, re.S ) if section is None: message = "Can't find Mac target" raise cocos.CCPluginError(message) targets = re.search(r"targets = (.*);", section.group(), re.S) if targets is None: message = "Can't find Mac target" raise cocos.CCPluginError(message) targetName = None cfg_obj = self._platforms.get_current_config() if cfg_obj.target_name is not None: targetName = cfg_obj.target_name else: names = re.split("\*", targets.group()) for name in names: if "Mac" in name: targetName = str.strip(name) if targetName is None: message = "Can't find Mac target" raise cocos.CCPluginError(message) if os.path.isdir(output_dir): target_app_dir = os.path.join(output_dir, "%s.app" % targetName[:targetName.find(' ')]) if os.path.isdir(target_app_dir): shutil.rmtree(target_app_dir) cocos.Logging.info("building") command = ' '.join([ "xcodebuild", "-project", "\"%s\"" % projectPath, "-configuration", "%s" % 'Debug' if self._mode is 'debug' else 'Release', "-target", "\"%s\"" % targetName, "CONFIGURATION_BUILD_DIR=%s" % (output_dir) ]) self._run_cmd(command) self.target_name = targetName filelist = os.listdir(output_dir) for filename in filelist: name, extention = os.path.splitext(filename) if extention == '.a': filename = os.path.join(output_dir, filename) os.remove(filename) if extention == '.app' and name == targetName: filename = os.path.join(output_dir, filename) if ' ' in name: filename = os.path.join(output_dir, filename) newname = os.path.join(output_dir, name[:name.find(' ')]+extention) os.rename(filename, newname) self._macapp_path = newname if self._no_res: resource_path = os.path.join(self._macapp_path, "Contents", "Resources") self._remove_res(resource_path) cocos.Logging.info("build succeeded.")
def compile_android(self): # build .so for android CONSOLE_PATH = "tools/cocos2d-console/bin" ANDROID_A_PATH = "frameworks/runtime-src/proj.android/obj/local" android_out_dir = os.path.join(self.lib_dir, "android") engine_dir = self.repo_x console_dir = os.path.join(engine_dir, CONSOLE_PATH) if cocos.os_is_win32(): cmd_path = os.path.join(console_dir, "cocos.bat") else: cmd_path = os.path.join(console_dir, "cocos") # build the simulator project proj_path = os.path.join(engine_dir, 'tools/simulator') build_cmd = "%s compile -s %s -p android --ndk-mode %s --app-abi %s" % (cmd_path, proj_path, self.mode, self.app_abi) if self.android_platform is not None: build_cmd += ' --ap %s' % self.android_platform self._run_cmd(build_cmd) # copy .a to prebuilt dir obj_dir = os.path.join(proj_path, ANDROID_A_PATH) copy_cfg = { "from": obj_dir, "to": android_out_dir, "include": [ "*.a$" ] } cocos.copy_files_with_config(copy_cfg, obj_dir, android_out_dir) if not self.disable_strip: # strip the android libs ndk_root = os.environ["NDK_ROOT"] if cocos.os_is_win32(): if cocos.os_is_32bit_windows(): check_bits = [ "", "-x86_64" ] else: check_bits = [ "-x86_64", "" ] sys_folder_name = "windows" for bit_str in check_bits: check_folder_name = "windows%s" % bit_str check_path = os.path.join(ndk_root, "toolchains/arm-linux-androideabi-4.8/prebuilt/%s" % check_folder_name) if os.path.isdir(check_path): sys_folder_name = check_folder_name break elif cocos.os_is_mac(): sys_folder_name = "darwin-x86_64" else: sys_folder_name = "linux-x86_64" # set strip execute file name if cocos.os_is_win32(): strip_execute_name = "strip.exe" else: strip_execute_name = "strip" # strip arm libs strip_cmd_path = os.path.join(ndk_root, "toolchains/arm-linux-androideabi-4.8/prebuilt/%s/arm-linux-androideabi/bin/%s" % (sys_folder_name, strip_execute_name)) if os.path.exists(strip_cmd_path): armlibs = ["armeabi", "armeabi-v7a"] for fold in armlibs: self.trip_libs(strip_cmd_path, os.path.join(android_out_dir, fold)) # strip arm64-v8a libs strip_cmd_path = os.path.join(ndk_root, "toolchains/aarch64-linux-android-4.9/prebuilt/%s/aarch64-linux-android/bin/%s" % (sys_folder_name, strip_execute_name)) if os.path.exists(strip_cmd_path) and os.path.exists(os.path.join(android_out_dir, "arm64-v8a")): self.trip_libs(strip_cmd_path, os.path.join(android_out_dir, 'arm64-v8a')) # strip x86 libs strip_cmd_path = os.path.join(ndk_root, "toolchains/x86-4.8/prebuilt/%s/i686-linux-android/bin/%s" % (sys_folder_name, strip_execute_name)) if os.path.exists(strip_cmd_path) and os.path.exists(os.path.join(android_out_dir, "x86")): self.trip_libs(strip_cmd_path, os.path.join(android_out_dir, 'x86'))
def build_mac(self): if not self._platforms.is_mac_active(): return if not cocos.os_is_mac(): raise cocos.CCPluginError("Please build on MacOSX") self.check_ios_mac_build_depends() mac_project_dir = self._platforms.project_path() output_dir = self._output_dir projectPath = os.path.join(mac_project_dir, self.xcodeproj_name) pbxprojectPath = os.path.join(projectPath, "project.pbxproj") f = file(pbxprojectPath) contents = f.read() section = re.search( r"Begin PBXProject section.*End PBXProject section", contents, re.S) if section is None: message = "Can't find Mac target" raise cocos.CCPluginError(message) targets = re.search(r"targets = (.*);", section.group(), re.S) if targets is None: message = "Can't find Mac target" raise cocos.CCPluginError(message) targetName = None cfg_obj = self._platforms.get_current_config() if cfg_obj.target_name is not None: targetName = cfg_obj.target_name else: names = re.split("\*", targets.group()) for name in names: if "Mac" in name: targetName = str.strip(name) if targetName is None: message = "Can't find Mac target" raise cocos.CCPluginError(message) if os.path.isdir(output_dir): target_app_dir = os.path.join( output_dir, "%s.app" % targetName[:targetName.find(' ')]) if os.path.isdir(target_app_dir): shutil.rmtree(target_app_dir) cocos.Logging.info("building") command = ' '.join([ "xcodebuild", "-project", "\"%s\"" % projectPath, "-configuration", "%s" % 'Debug' if self._mode is 'debug' else 'Release', "-target", "\"%s\"" % targetName, "CONFIGURATION_BUILD_DIR=%s" % (output_dir) ]) self._run_cmd(command) self.target_name = targetName filelist = os.listdir(output_dir) for filename in filelist: name, extention = os.path.splitext(filename) if extention == '.a': filename = os.path.join(output_dir, filename) os.remove(filename) if extention == '.app' and name == targetName: filename = os.path.join(output_dir, filename) if ' ' in name: filename = os.path.join(output_dir, filename) newname = os.path.join(output_dir, name[:name.find(' ')] + extention) os.rename(filename, newname) self._macapp_path = newname if self._no_res: resource_path = os.path.join(self._macapp_path, "Contents", "Resources") self._remove_res(resource_path) cocos.Logging.info("build succeeded.")
def build_mac(self): if not self._platforms.is_mac_active(): return if not cocos.os_is_mac(): raise cocos.CCPluginError("Please build on MacOSX") self.check_ios_mac_build_depends() mac_project_dir = self._platforms.project_path() output_dir = self._output_dir projectPath = os.path.join(mac_project_dir, self.xcodeproj_name) pbxprojectPath = os.path.join(projectPath, "project.pbxproj") f = file(pbxprojectPath) contents = f.read() section = re.search( r"Begin PBXProject section.*End PBXProject section", contents, re.S) if section is None: message = "Can't find Mac target" raise cocos.CCPluginError(message) targets = re.search(r"targets = (.*);", section.group(), re.S) if targets is None: message = "Can't find Mac target" raise cocos.CCPluginError(message) targetName = None if self.xcode_target_name is not None: targetName = self.xcode_target_name else: cfg_obj = self._platforms.get_current_config() if cfg_obj.target_name is not None: targetName = cfg_obj.target_name else: names = re.split("\*", targets.group()) for name in names: if "Mac" in name: targetName = str.strip(name) if targetName is None: message = "Can't find Mac target" raise cocos.CCPluginError(message) if os.path.isdir(output_dir): target_app_dir = os.path.join(output_dir, "%s.app" % targetName) if os.path.isdir(target_app_dir): shutil.rmtree(target_app_dir) # is script project & need compile scripts if self._project._is_script_project() and self._compile_script: # backup the source scripts script_src_dir = os.path.join(self._project.get_project_dir(), "src") self.backup_dir(script_src_dir) # compile the scripts self.compile_scripts(script_src_dir, script_src_dir) if self._project._is_js_project(): # js project need compile the js files in engine engine_js_dir = os.path.join(self.get_engine_dir(), CCPluginCompile.ENGINE_JS_DIR) self.backup_dir(engine_js_dir) self.compile_scripts(engine_js_dir, engine_js_dir) try: cocos.Logging.info("building") command = ' '.join([ "xcodebuild", "-project", "\"%s\"" % projectPath, "-configuration", "%s" % 'Debug' if self._mode == 'debug' else 'Release', "-target", "\"%s\"" % targetName, "CONFIGURATION_BUILD_DIR=\"%s\"" % (output_dir) ]) self._run_cmd(command) self.target_name = targetName filelist = os.listdir(output_dir) for filename in filelist: name, extention = os.path.splitext(filename) if extention == '.a': filename = os.path.join(output_dir, filename) os.remove(filename) self._macapp_path = os.path.join(output_dir, "%s.app" % targetName) if self._no_res: resource_path = os.path.join(self._macapp_path, "Contents", "Resources") self._remove_res(resource_path) cocos.Logging.info("build succeeded.") except: raise cocos.CCPluginError( "Build failed: Take a look at the output above for details.") finally: # is script project & need compile scripts if self._project._is_script_project() and self._compile_script: script_src_dir = os.path.join(self._project.get_project_dir(), "src") self.reset_backup_dir(script_src_dir) if self._project._is_js_project(): engine_js_dir = os.path.join(self.get_engine_dir(), CCPluginCompile.ENGINE_JS_DIR) self.reset_backup_dir(engine_js_dir)
def build_ios(self): if not self._platforms.is_ios_active(): return if not cocos.os_is_mac(): raise cocos.CCPluginError("Please build on MacOSX") if self._sign_id is not None: cocos.Logging.info("Code Sign Identity: %s" % self._sign_id) self.use_sdk = 'iphoneos' else: self.use_sdk = 'iphonesimulator' self.check_ios_mac_build_depends() ios_project_dir = self._platforms.project_path() output_dir = self._output_dir projectPath = os.path.join(ios_project_dir, self.xcodeproj_name) pbxprojectPath = os.path.join(projectPath, "project.pbxproj") f = file(pbxprojectPath) contents = f.read() section = re.search( r"Begin PBXProject section.*End PBXProject section", contents, re.S) if section is None: message = "Can't find iOS target" raise cocos.CCPluginError(message) targets = re.search(r"targets = (.*);", section.group(), re.S) if targets is None: message = "Can't find iOS target" raise cocos.CCPluginError(message) targetName = None if self.xcode_target_name is not None: targetName = self.xcode_target_name else: cfg_obj = self._platforms.get_current_config() if cfg_obj.target_name is not None: targetName = cfg_obj.target_name else: names = re.split("\*", targets.group()) for name in names: if "iOS" in name: targetName = str.strip(name) break if targetName is None: message = "Can't find iOS target" raise cocos.CCPluginError(message) if os.path.isdir(output_dir): target_app_dir = os.path.join(output_dir, "%s.app" % targetName) if os.path.isdir(target_app_dir): shutil.rmtree(target_app_dir) # is script project & need compile scripts if self._project._is_script_project() and self._compile_script: # backup the source scripts script_src_dir = os.path.join(self._project.get_project_dir(), "src") self.backup_dir(script_src_dir) # compile the scripts self.compile_scripts(script_src_dir, script_src_dir) if self._project._is_js_project(): # js project need compile the js files in engine engine_js_dir = os.path.join(self.get_engine_dir(), CCPluginCompile.ENGINE_JS_DIR) self.backup_dir(engine_js_dir) self.compile_scripts(engine_js_dir, engine_js_dir) try: cocos.Logging.info("building") command = ' '.join([ "xcodebuild", "-project", "\"%s\"" % projectPath, "-configuration", "%s" % 'Debug' if self._mode == 'debug' else 'Release', "-target", "\"%s\"" % targetName, "%s" % "-arch i386" if self.use_sdk == 'iphonesimulator' else '', "-sdk", "%s" % self.use_sdk, "CONFIGURATION_BUILD_DIR=\"%s\"" % (output_dir), "%s" % "VALID_ARCHS=\"i386\"" if self.use_sdk == 'iphonesimulator' else '' ]) if self._sign_id is not None: command = "%s CODE_SIGN_IDENTITY=\"%s\"" % (command, self._sign_id) self._run_cmd(command) filelist = os.listdir(output_dir) for filename in filelist: name, extention = os.path.splitext(filename) if extention == '.a': filename = os.path.join(output_dir, filename) os.remove(filename) self._iosapp_path = os.path.join(output_dir, "%s.app" % targetName) if self._no_res: self._remove_res(self._iosapp_path) if self._sign_id is not None: # generate the ipa app_path = os.path.join(output_dir, "%s.app" % targetName) ipa_path = os.path.join(output_dir, "%s.ipa" % targetName) ipa_cmd = "xcrun -sdk %s PackageApplication -v \"%s\" -o \"%s\"" % ( self.use_sdk, app_path, ipa_path) self._run_cmd(ipa_cmd) cocos.Logging.info("build succeeded.") except: raise cocos.CCPluginError( "Build failed: Take a look at the output above for details.") finally: # is script project & need compile scripts if self._project._is_script_project() and self._compile_script: script_src_dir = os.path.join(self._project.get_project_dir(), "src") self.reset_backup_dir(script_src_dir) if self._project._is_js_project(): engine_js_dir = os.path.join(self.get_engine_dir(), CCPluginCompile.ENGINE_JS_DIR) self.reset_backup_dir(engine_js_dir)
def build_mac(self): if not self._platforms.is_mac_active(): return if not cocos.os_is_mac(): raise cocos.CCPluginError("Please build on MacOSX") self.check_ios_mac_build_depends() mac_project_dir = self._platforms.project_path() output_dir = self._output_dir projectPath = os.path.join(mac_project_dir, self.xcodeproj_name) pbxprojectPath = os.path.join(projectPath, "project.pbxproj") f = file(pbxprojectPath) contents = f.read() section = re.search( r"Begin PBXProject section.*End PBXProject section", contents, re.S ) if section is None: message = "Can't find Mac target" raise cocos.CCPluginError(message) targets = re.search(r"targets = (.*);", section.group(), re.S) if targets is None: message = "Can't find Mac target" raise cocos.CCPluginError(message) targetName = None cfg_obj = self._platforms.get_current_config() if cfg_obj.target_name is not None: targetName = cfg_obj.target_name else: names = re.split("\*", targets.group()) for name in names: if "Mac" in name: targetName = str.strip(name) if targetName is None: message = "Can't find Mac target" raise cocos.CCPluginError(message) if os.path.isdir(output_dir): target_app_dir = os.path.join(output_dir, "%s.app" % targetName[:targetName.find(' ')]) if os.path.isdir(target_app_dir): shutil.rmtree(target_app_dir) # is script project & need compile scripts if self._project._is_script_project() and self._compile_script: # backup the source scripts script_src_dir = os.path.join(self._project.get_project_dir(), "src") self.backup_dir(script_src_dir) # compile the scripts self.compile_scripts(script_src_dir, script_src_dir) if self._project._is_js_project(): # js project need compile the js files in engine engine_js_dir = os.path.join(self.get_engine_dir(), CCPluginCompile.ENGINE_JS_DIR) self.backup_dir(engine_js_dir) self.compile_scripts(engine_js_dir, engine_js_dir) try: cocos.Logging.info("building") command = ' '.join([ "xcodebuild", "-project", "\"%s\"" % projectPath, "-configuration", "%s" % 'Debug' if self._mode == 'debug' else 'Release', "-target", "\"%s\"" % targetName, "CONFIGURATION_BUILD_DIR=%s" % (output_dir) ]) self._run_cmd(command) self.target_name = targetName filelist = os.listdir(output_dir) for filename in filelist: name, extention = os.path.splitext(filename) if extention == '.a': filename = os.path.join(output_dir, filename) os.remove(filename) if extention == '.app' and name == targetName: filename = os.path.join(output_dir, filename) if ' ' in name: filename = os.path.join(output_dir, filename) newname = os.path.join(output_dir, name[:name.find(' ')]+extention) os.rename(filename, newname) self._macapp_path = newname if self._no_res: resource_path = os.path.join(self._macapp_path, "Contents", "Resources") self._remove_res(resource_path) cocos.Logging.info("build succeeded.") except: raise cocos.CCPluginError("Build failed: Take a look at the output above for details.") finally: # is script project & need compile scripts if self._project._is_script_project() and self._compile_script: script_src_dir = os.path.join(self._project.get_project_dir(), "src") self.reset_backup_dir(script_src_dir) if self._project._is_js_project(): engine_js_dir = os.path.join(self.get_engine_dir(), CCPluginCompile.ENGINE_JS_DIR) self.reset_backup_dir(engine_js_dir)
def build_ios(self): if not self._platforms.is_ios_active(): return if not cocos.os_is_mac(): raise cocos.CCPluginError("Please build on MacOSX") need_record_sign_id = False if self._mode == "release": if self._sign_id is None: self._sign_id = self._project.get_proj_config(CCPluginCompile.PROJ_CFG_KEY_IOS_SIGN_ID) else: need_record_sign_id = True if self._sign_id is None: raise cocos.CCPluginError("Please specify the code sign identity by \"--sign-identity\" if you want to compile with release mode.") else: cocos.Logging.info("Code Sign Identity: %s" % self._sign_id) self.check_ios_mac_build_depends() ios_project_dir = self._platforms.project_path() output_dir = self._output_dir projectPath = os.path.join(ios_project_dir, self.xcodeproj_name) pbxprojectPath = os.path.join(projectPath, "project.pbxproj") f = file(pbxprojectPath) contents = f.read() section = re.search(r"Begin PBXProject section.*End PBXProject section", contents, re.S) if section is None: message = "Can't find iOS target" raise cocos.CCPluginError(message) targets = re.search(r"targets = (.*);", section.group(), re.S) if targets is None: message = "Can't find iOS target" raise cocos.CCPluginError(message) targetName = None cfg_obj = self._platforms.get_current_config() if cfg_obj.target_name is not None: targetName = cfg_obj.target_name else: names = re.split("\*", targets.group()) for name in names: if "iOS" in name: targetName = str.strip(name) if targetName is None: message = "Can't find iOS target" raise cocos.CCPluginError(message) if os.path.isdir(output_dir): target_app_dir = os.path.join(output_dir, "%s.app" % targetName[:targetName.find(' ')]) if os.path.isdir(target_app_dir): shutil.rmtree(target_app_dir) # is script project & need compile scripts if self._project._is_script_project() and self._compile_script: # backup the source scripts script_src_dir = os.path.join(self._project.get_project_dir(), "src") self.backup_dir(script_src_dir) # compile the scripts self.compile_scripts(script_src_dir, script_src_dir) if self._project._is_js_project(): # js project need compile the js files in engine engine_js_dir = os.path.join(self.get_engine_dir(), CCPluginCompile.ENGINE_JS_DIR) self.backup_dir(engine_js_dir) self.compile_scripts(engine_js_dir, engine_js_dir) try: cocos.Logging.info("building") command = ' '.join([ "xcodebuild", "-project", "\"%s\"" % projectPath, "-configuration", "%s" % 'Debug' if self._mode == 'debug' else 'Release', "-target", "\"%s\"" % targetName, "%s" % "-arch i386" if self._mode == 'debug' else '', "-sdk", "%s" % 'iphonesimulator' if self._mode == 'debug' else 'iphoneos', "CONFIGURATION_BUILD_DIR=%s" % (output_dir) ]) if self._mode == 'release': command = "%s CODE_SIGN_IDENTITY=\"%s\"" % (command, self._sign_id) self._run_cmd(command) filelist = os.listdir(output_dir) app_name = targetName for filename in filelist: name, extention = os.path.splitext(filename) if extention == '.a': filename = os.path.join(output_dir, filename) os.remove(filename) if extention == '.app' and name == targetName: filename = os.path.join(output_dir, filename) app_name = name[:name.find(' ')] newname = os.path.join(output_dir, app_name + extention) os.rename(filename, newname) self._iosapp_path = newname if self._no_res: self._remove_res(self._iosapp_path) if self._mode == 'release': # generate the ipa app_path = os.path.join(output_dir, "%s.app" % app_name) ipa_path = os.path.join(output_dir, "%s.ipa" % app_name) ipa_cmd = "xcrun -sdk iphoneos PackageApplication -v \"%s\" -o \"%s\"" % (app_path, ipa_path) self._run_cmd(ipa_cmd) # record the sign id if necessary if need_record_sign_id: self._project.write_proj_config(CCPluginCompile.PROJ_CFG_KEY_IOS_SIGN_ID, self._sign_id) cocos.Logging.info("build succeeded.") except: raise cocos.CCPluginError("Build failed: Take a look at the output above for details.") finally: # is script project & need compile scripts if self._project._is_script_project() and self._compile_script: script_src_dir = os.path.join(self._project.get_project_dir(), "src") self.reset_backup_dir(script_src_dir) if self._project._is_js_project(): engine_js_dir = os.path.join(self.get_engine_dir(), CCPluginCompile.ENGINE_JS_DIR) self.reset_backup_dir(engine_js_dir)
def compile_android(self): # build .so for android CONSOLE_PATH = "tools/cocos2d-console/bin" ANDROID_A_PATH = "frameworks/runtime-src/proj.android/obj/local" android_out_dir = os.path.join(self.lib_dir, "android") engine_dir = self.repo_x console_dir = os.path.join(engine_dir, CONSOLE_PATH) if cocos.os_is_win32(): cmd_path = os.path.join(console_dir, "cocos.bat") else: cmd_path = os.path.join(console_dir, "cocos") # build the simulator project proj_path = os.path.join(engine_dir, 'tools/simulator') build_cmd = "%s compile -s %s -p android --ndk-mode %s --app-abi %s" % ( cmd_path, proj_path, self.mode, self.app_abi) env_param = ExtendEnv.get_extend_env_str() if env_param and len(env_param) > 0: build_cmd += (' --env "%s"' % env_param) self._run_cmd(build_cmd) # copy .a to prebuilt dir obj_dir = os.path.join(proj_path, ANDROID_A_PATH) copy_cfg = { "from": obj_dir, "to": android_out_dir, "include": ["*.a$"] } cocos.copy_files_with_config(copy_cfg, obj_dir, android_out_dir) if not self.disable_strip: # strip the android libs ndk_root = cocos.check_environment_variable("NDK_ROOT") if cocos.os_is_win32(): if cocos.os_is_32bit_windows(): check_bits = ["", "-x86_64"] else: check_bits = ["-x86_64", ""] sys_folder_name = "windows" for bit_str in check_bits: check_folder_name = "windows%s" % bit_str check_path = os.path.join( ndk_root, "toolchains/arm-linux-androideabi-4.8/prebuilt/%s" % check_folder_name) if os.path.isdir(check_path): sys_folder_name = check_folder_name break elif cocos.os_is_mac(): sys_folder_name = "darwin-x86_64" else: sys_folder_name = "linux-x86_64" # set strip execute file name if cocos.os_is_win32(): strip_execute_name = "strip.exe" else: strip_execute_name = "strip" # strip arm libs strip_cmd_path = os.path.join( ndk_root, "toolchains/arm-linux-androideabi-4.8/prebuilt/%s/arm-linux-androideabi/bin/%s" % (sys_folder_name, strip_execute_name)) if os.path.exists(strip_cmd_path): armlibs = ["armeabi", "armeabi-v7a"] for fold in armlibs: self.trip_libs(strip_cmd_path, os.path.join(android_out_dir, fold)) # strip x86 libs strip_cmd_path = os.path.join( ndk_root, "toolchains/x86-4.8/prebuilt/%s/i686-linux-android/bin/%s" % (sys_folder_name, strip_execute_name)) if os.path.exists(strip_cmd_path) and os.path.exists( os.path.join(android_out_dir, "x86")): self.trip_libs(strip_cmd_path, os.path.join(android_out_dir, 'x86'))
def build_ios(self): if not self._platforms.is_ios_active(): return if not cocos.os_is_mac(): raise cocos.CCPluginError("Please build on MacOSX") self.check_ios_mac_build_depends() project_dir = self._project.get_project_dir() ios_project_dir = self._platforms.project_path() build_mode = self._mode if self._project._is_script_project(): if build_mode == 'debug': output_dir = os.path.join( project_dir, CCPluginCompile.OUTPUT_DIR_SCRIPT_DEBUG, 'ios') else: output_dir = os.path.join( project_dir, CCPluginCompile.OUTPUT_DIR_SCRIPT_RELEASE, 'ios') else: output_dir = os.path.join(project_dir, CCPluginCompile.OUTPUT_DIR_NATIVE, build_mode, 'ios') projectPath = os.path.join(ios_project_dir, self.xcodeproj_name) pbxprojectPath = os.path.join(projectPath, "project.pbxproj") f = file(pbxprojectPath) contents = f.read() section = re.search( r"Begin PBXProject section.*End PBXProject section", contents, re.S) if section is None: message = "Can't find iOS target" raise cocos.CCPluginError(message) targets = re.search(r"targets = (.*);", section.group(), re.S) if targets is None: message = "Can't find iOS target" raise cocos.CCPluginError(message) targetName = None names = re.split("\*", targets.group()) for name in names: if "iOS" in name: targetName = str.strip(name) if targetName is None: message = "Can't find iOS target" raise cocos.CCPluginError(message) if os.path.isdir(output_dir): target_app_dir = os.path.join( output_dir, "%s.app" % targetName[:targetName.find(' ')]) if os.path.isdir(target_app_dir): shutil.rmtree(target_app_dir) cocos.Logging.info("building") command = ' '.join([ "xcodebuild", "-project", "\"%s\"" % projectPath, "-configuration", "%s" % 'Debug' if self._mode is 'debug' else 'Release', "-target", "\"%s\"" % targetName, "-sdk", "iphonesimulator", "-arch i386", "CONFIGURATION_BUILD_DIR=%s" % (output_dir) ]) self._run_cmd(command) filelist = os.listdir(output_dir) for filename in filelist: name, extention = os.path.splitext(filename) if extention == '.a': filename = os.path.join(output_dir, filename) os.remove(filename) if extention == '.app' and name == targetName: filename = os.path.join(output_dir, filename) newname = os.path.join(output_dir, name[:name.find(' ')] + extention) os.rename(filename, newname) self._iosapp_path = newname if self._no_res: self._remove_res(os.path.join(ios_project_dir, "ios"), self._iosapp_path) cocos.Logging.info("build succeeded.")
def compile_android(self): # build .so for android CONSOLE_PATH = "tools/cocos2d-console/bin" ANDROID_A_PATH = "frameworks/runtime-src/proj.android/obj/local" if self.use_studio is not None: ANDROID_A_PATH = "frameworks/runtime-src/proj.android-studio/app/build/intermediates/ndkBuild/" + self.mode + "/obj/local" android_out_dir = os.path.join(self.lib_dir, "android") engine_dir = self.repo_x console_dir = os.path.join(engine_dir, CONSOLE_PATH) cocos_py_path = os.path.join(console_dir, 'cocos.py') # build the simulator project proj_path = os.path.join(engine_dir, 'tools/simulator') python_path = cocos.check_environment_variable('COCOS_PYTHON_HOME', raise_error=False) if python_path is None: python_path = 'python' else: python_path = os.path.join(python_path, 'python') build_cmd = "\"%s\" \"%s\" compile -s %s -p android --ndk-mode %s --app-abi %s -m %s" % ( python_path, cocos_py_path, proj_path, self.mode, self.app_abi, self.mode) if self.android_platform is not None: build_cmd += ' --ap %s' % self.android_platform if self.use_studio is not None: build_cmd += ' --android-studio' env_param = ExtendEnv.get_extend_env_str() if env_param and len(env_param) > 0: build_cmd += (' --env "%s"' % env_param) self._run_cmd(build_cmd) # copy .a to prebuilt dir obj_dir = os.path.join(proj_path, ANDROID_A_PATH) copy_cfg = { "from": obj_dir, "to": android_out_dir, "include": ["*.a$"] } cocos.copy_files_with_config(copy_cfg, obj_dir, android_out_dir) if not self.disable_strip: # strip the android libs ndk_root = cocos.check_environment_variable("NDK_ROOT") if cocos.os_is_win32(): if cocos.os_is_32bit_windows(): check_bits = ["", "-x86_64"] else: check_bits = ["-x86_64", ""] sys_folder_name = "windows" for bit_str in check_bits: check_folder_name = "windows%s" % bit_str check_path = os.path.join( ndk_root, "toolchains/arm-linux-androideabi-4.9/prebuilt/%s" % check_folder_name) if os.path.isdir(check_path): sys_folder_name = check_folder_name break elif cocos.os_is_mac(): sys_folder_name = "darwin-x86_64" else: sys_folder_name = "linux-x86_64" # set strip execute file name if cocos.os_is_win32(): strip_execute_name = "strip.exe" else: strip_execute_name = "strip" # strip arm libs strip_cmd_path = os.path.join( ndk_root, "toolchains/arm-linux-androideabi-4.9/prebuilt/%s/arm-linux-androideabi/bin/%s" % (sys_folder_name, strip_execute_name)) if os.path.exists(strip_cmd_path): armlibs = ["armeabi", "armeabi-v7a"] for fold in armlibs: self.trip_libs(strip_cmd_path, os.path.join(android_out_dir, fold)) else: raise Exception("(%s) wasn't found." % strip_cmd_path) # strip arm64-v8a libs strip_cmd_path = os.path.join( ndk_root, "toolchains/aarch64-linux-android-4.9/prebuilt/%s/aarch64-linux-android/bin/%s" % (sys_folder_name, strip_execute_name)) if os.path.exists(strip_cmd_path): if os.path.exists(os.path.join(android_out_dir, "arm64-v8a")): self.trip_libs(strip_cmd_path, os.path.join(android_out_dir, 'arm64-v8a')) else: raise Exception("(%s) wasn't found." % strip_cmd_path) # strip x86 libs strip_cmd_path = os.path.join( ndk_root, "toolchains/x86-4.9/prebuilt/%s/i686-linux-android/bin/%s" % (sys_folder_name, strip_execute_name)) if os.path.exists(strip_cmd_path): if os.path.exists(os.path.join(android_out_dir, "x86")): self.trip_libs(strip_cmd_path, os.path.join(android_out_dir, 'x86')) else: raise Exception("(%s) wasn't found." % strip_cmd_path)