def update_bundle_version(self): build_date = date.today().strftime("%Y%m%d") if utils_cocos.os_is_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) if utils_cocos.os_is_win32(): # 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] m = re.match(r'"(Version[^\(]*)\(.*\)', build_info_str) target_str = '"%s(%s)"' % (m.group(1), build_date) keyword_map = {build_info_str: target_str} self.replace_keyword_with_file(game_rc_path, keyword_map)
def run(self): if self.is_clean_before_build: utils_cocos.rmdir(self.simulator_output_dir) # backup some files modify_files = self.get_depend_project_file_list() if utils_cocos.os_is_mac(): modify_files.append(os.path.join(self.simulator_abs_path, 'frameworks/runtime-src/proj.ios_mac/mac/Info.plist')) elif utils_cocos.os_is_win32(): 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 do_compile(self): if self.platform == 'all': self.compile_all() return if utils_cocos.os_is_mac(): support_platforms = SimulatorCompiler.SUPPORT_PLATFORMS['mac'] elif utils_cocos.os_is_win32(): support_platforms = SimulatorCompiler.SUPPORT_PLATFORMS['win'] else: support_platforms = SimulatorCompiler.SUPPORT_PLATFORMS['other'] if self.platform not in support_platforms: raise CustomError( '%s is not support in current system.' % self.platform, CustomError.ERROR_WRONG_ARGS) if self.platform == 'win32': self.compile_for_win32() elif self.platform == 'android': self.compile_for_android() elif self.platform == 'ios': self.compile_for_ios() elif self.platform == 'mac': self.compile_for_osx()
def update_bundle_version(self): build_date = date.today().strftime("%Y%m%d") if utils_cocos.os_is_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) if utils_cocos.os_is_win32(): # 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] m = re.match(r'"(Version[^\(]*)\(.*\)', build_info_str) target_str = '"%s(%s)"' % (m.group(1), build_date) keyword_map = { build_info_str : target_str} self.replace_keyword_with_file(game_rc_path,keyword_map)
def compile_all(self): if utils_cocos.os_is_mac(): self.compile_for_android() self.compile_for_osx() self.compile_for_ios() elif utils_cocos.os_is_win32(): self.compile_for_win32() self.compile_for_android()
def get_depend_project_file_list(self): file_list = [] if utils_cocos.os_is_mac(): 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, "frameworks/runtime-src/proj.ios_mac/simulator.xcodeproj", 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)) elif utils_cocos.os_is_win32(): WIN32_PROJECT_TAG = "Project(\"" project_file_path = os.path.join( self.simulator_abs_path, "frameworks/runtime-src/proj.win32/simulator.sln") 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 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 utils_cocos.os_is_mac(): ret = path.replace("\ ", " ") if utils_cocos.os_is_win32(): ret = ret.replace("\"", "") return ret
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 utils_cocos.os_is_mac(): ret = path.replace("\ ", " ") if utils_cocos.os_is_win32(): ret = ret.replace("\"", "") return ret
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 utils_cocos.os_is_mac(): return osx_keyword if utils_cocos.os_is_win32(): return win_keyword return {}
def get_depend_project_file_list(self): file_list = [] if utils_cocos.os_is_mac(): 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, "frameworks/runtime-src/proj.ios_mac/simulator.xcodeproj", 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)) elif utils_cocos.os_is_win32(): WIN32_PROJECT_TAG = "Project(\"" project_file_path = os.path.join(self.simulator_abs_path, "frameworks/runtime-src/proj.win32/simulator.sln") 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 utils_cocos.os_is_mac(): return osx_keyword if utils_cocos.os_is_win32(): return win_keyword return {}
def run(self): if self.is_clean_before_build: utils_cocos.rmdir(self.simulator_output_dir) # backup some files modify_files = self.get_depend_project_file_list() if utils_cocos.os_is_mac(): modify_files.append( os.path.join( self.simulator_abs_path, 'frameworks/runtime-src/proj.ios_mac/mac/Info.plist')) elif utils_cocos.os_is_win32(): 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 do_compile(self): if self.platform == 'all': self.compile_all() return if utils_cocos.os_is_mac(): support_platforms = SimulatorCompiler.SUPPORT_PLATFORMS['mac'] elif utils_cocos.os_is_win32(): support_platforms = SimulatorCompiler.SUPPORT_PLATFORMS['win'] else: support_platforms = SimulatorCompiler.SUPPORT_PLATFORMS['other'] if self.platform not in support_platforms: raise CustomError('%s is not support in current system.' % self.platform, CustomError.ERROR_WRONG_ARGS) if self.platform == 'win32': self.compile_for_win32() elif self.platform == 'android': self.compile_for_android() elif self.platform == 'ios': self.compile_for_ios() elif self.platform == 'mac': self.compile_for_osx()
def compile_android(self): print("compile android") # 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 utils_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 release --app-abi %s" % (cmd_path, proj_path, self.app_abi) utils_cocos.execute_command(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$" ] } excopy.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 utils_cocos.os_is_win32(): if utils_cocos.is_32bit_windows(): bit_str = "" else: bit_str = "-x86_64" sys_folder_name = "windows%s" % bit_str elif utils_cocos.os_is_mac(): sys_folder_name = "darwin-x86_64" # set strip execute file name if utils_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 not os.path.exists(strip_cmd_path): strip_cmd_path = os.path.join(ndk_root, "toolchains/arm-linux-androideabi-4.8/prebuilt/%s/arm-linux-androideabi/bin/%s" % (sys_folder_name.replace(bit_str, ""), 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 compile_mac_ios(self): if not utils_cocos.os_is_mac(): print("this is not mac platform, needn't compile") return print("to compile mac") xcode_proj_info = self.cfg_info[CocosLibsCompiler.KEY_XCODE_PROJS_INFO] XCODE_CMD_FMT = "xcodebuild -project \"%s\" -configuration Release -target \"%s\" %s CONFIGURATION_BUILD_DIR=%s" for key in xcode_proj_info.keys(): proj_path = os.path.join(self.repo_x, key) ios_out_dir = os.path.join(self.lib_dir, "ios") mac_out_dir = os.path.join(self.lib_dir, "mac") ios_sim_libs_dir = os.path.join(ios_out_dir, "simulator") ios_dev_libs_dir = os.path.join(ios_out_dir, "device") target = xcode_proj_info[key][CocosLibsCompiler.KEY_XCODE_TARGETS] # compile ios simulator build_cmd = XCODE_CMD_FMT % ( proj_path, "%s iOS" % target, "-sdk iphonesimulator ARCHS=\"i386 x86_64\" VALID_ARCHS=\"i386 x86_64\"", ios_sim_libs_dir) retVal = utils_cocos.execute_command(build_cmd) if 0 != retVal: print("[ERROR] compile ios simulator fail") return retVal # compile ios device build_cmd = XCODE_CMD_FMT % (proj_path, "%s iOS" % target, "-sdk iphoneos", ios_dev_libs_dir) retVal = utils_cocos.execute_command(build_cmd) if 0 != retVal: print("[ERROR] compile ios device fail") return retVal # compile mac build_cmd = XCODE_CMD_FMT % (proj_path, "%s Mac" % target, "", mac_out_dir) retVal = utils_cocos.execute_command(build_cmd) if 0 != retVal: print("[ERROR] compile mac fail") return retVal # generate fat libs for iOS for lib in os.listdir(ios_sim_libs_dir): sim_lib = os.path.join(ios_sim_libs_dir, lib) dev_lib = os.path.join(ios_dev_libs_dir, lib) output_lib = os.path.join(ios_out_dir, lib) lipo_cmd = "lipo -create -output \"%s\" \"%s\" \"%s\"" % ( output_lib, sim_lib, dev_lib) utils_cocos.execute_command(lipo_cmd) # remove the simulator & device libs in iOS utils_cocos.rmdir(ios_sim_libs_dir) utils_cocos.rmdir(ios_dev_libs_dir) if not self.disable_strip: # strip the libs ios_strip_cmd = "xcrun -sdk iphoneos strip -S %s/*.a" % ios_out_dir utils_cocos.execute_command(ios_strip_cmd) mac_strip_cmd = "xcrun strip -S %s/*.a" % mac_out_dir utils_cocos.execute_command(mac_strip_cmd)
def compile_android(self): print("compile android") # 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 utils_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 release --app-abi %s" % ( cmd_path, proj_path, self.app_abi) utils_cocos.execute_command(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$"] } excopy.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 utils_cocos.os_is_win32(): if utils_cocos.is_32bit_windows(): bit_str = "" else: bit_str = "-x86_64" sys_folder_name = "windows%s" % bit_str elif utils_cocos.os_is_mac(): sys_folder_name = "darwin-x86_64" # set strip execute file name if utils_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 not os.path.exists(strip_cmd_path): strip_cmd_path = os.path.join( ndk_root, "toolchains/arm-linux-androideabi-4.8/prebuilt/%s/arm-linux-androideabi/bin/%s" % (sys_folder_name.replace(bit_str, ""), 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 compile_mac_ios(self): if not utils_cocos.os_is_mac(): print("this is not mac platform, needn't compile") return print("to compile mac") xcode_proj_info = self.cfg_info[CocosLibsCompiler.KEY_XCODE_PROJS_INFO] XCODE_CMD_FMT = "xcodebuild -project \"%s\" -configuration Release -target \"%s\" %s CONFIGURATION_BUILD_DIR=%s" ios_out_dir = os.path.join(self.lib_dir, "ios") mac_out_dir = os.path.join(self.lib_dir, "mac") ios_sim_libs_dir = os.path.join(ios_out_dir, "simulator") ios_dev_libs_dir = os.path.join(ios_out_dir, "device") for key in xcode_proj_info.keys(): proj_path = os.path.join(self.repo_x, key) target = xcode_proj_info[key][CocosLibsCompiler.KEY_XCODE_TARGETS] if self.build_mac: # compile mac build_cmd = XCODE_CMD_FMT % (proj_path, "%s Mac" % target, "", mac_out_dir) retVal = utils_cocos.execute_command(build_cmd) if 0 != retVal: print("[ERROR] compile mac fail") return retVal if self.build_ios: # compile ios simulator build_cmd = XCODE_CMD_FMT % (proj_path, "%s iOS" % target, "-sdk iphonesimulator ARCHS=\"i386 x86_64\" VALID_ARCHS=\"i386 x86_64\"", ios_sim_libs_dir) retVal = utils_cocos.execute_command(build_cmd) if 0 != retVal: print("[ERROR] compile ios simulator fail") return retVal # compile ios device build_cmd = XCODE_CMD_FMT % (proj_path, "%s iOS" % target, "-sdk iphoneos", ios_dev_libs_dir) retVal = utils_cocos.execute_command(build_cmd) if 0 != retVal: print("[ERROR] compile ios device fail") return retVal if self.build_ios: # generate fat libs for iOS for lib in os.listdir(ios_sim_libs_dir): sim_lib = os.path.join(ios_sim_libs_dir, lib) dev_lib = os.path.join(ios_dev_libs_dir, lib) output_lib = os.path.join(ios_out_dir, lib) lipo_cmd = "lipo -create -output \"%s\" \"%s\" \"%s\"" % (output_lib, sim_lib, dev_lib) utils_cocos.execute_command(lipo_cmd) # remove the simulator & device libs in iOS utils_cocos.rmdir(ios_sim_libs_dir) utils_cocos.rmdir(ios_dev_libs_dir) if not self.disable_strip: # strip the libs if self.build_ios: ios_strip_cmd = "xcrun -sdk iphoneos strip -S %s/*.a" % ios_out_dir utils_cocos.execute_command(ios_strip_cmd) if self.build_mac: mac_strip_cmd = "xcrun strip -S %s/*.a" % mac_out_dir utils_cocos.execute_command(mac_strip_cmd)