o
    Hi                     @   s^   d dl Z d dlZd dlmZ d dlmZ d dlZd dlZdd ZdddZ	d	d
 Z
dd ZdS )    N)XcodeProject)ProjectFilesc              
   C   s  zt | }||}|std| d W dS | }t|dr't|jng }t|dr1|jnd }t|dr;|j	nd }|
|j}|r_t|dr_||jv rV|j| ntd| d	 ntd
 ||jv rm|j|= ntd| d |D ]3}	|	|jv r|
|	}
|
rt|
drt|
j}|D ]}||jv r|j|= q|j|	= qwtd|	 d qw|r||jv r|
|}|rt|drt|j}|D ]}||jv r|j|= qtd| d q|j|= ntd| d |r||jv r|d}|r|d |
| |j|= ntd| d |  W dS  ty? } ztd|  td tjtjd td W Y d }~dS d }~ww )N%   错误: 在项目中未找到名为 '   ' 的 Target。FbuildPhasesbuildConfigurationListproductReferencetargetsu   警告: Target UUID u"    不在项目 targets 列表中。u;   警告: 无法获取主项目对象或其 targets 列表。u$    不在 project.objects 字典中。filesu   警告: Build Phase UUID u    不在 project.objects 中。buildConfigurationsu!   警告: Build Configuration UUID u&   警告: Build Configuration List UUID u    不存在或已清理。Productsr   u$   警告: Product File Reference UUID T   处理项目时发生错误: <------------------------------------------------------------file)r   loadget_target_by_nameprintget_idhasattrlistr   r   r   
get_object
rootObjectr	   removeobjectsr
   r   get_groups_by_nameremove_childsave	Exception	traceback	print_excsysstdout)pbx_pathtarget_nameprojecttarget_to_deletetarget_uuidbuild_phase_uuidsbuild_configuration_list_uuidproduct_reference_uuidproject_object
phase_uuid	phase_objbuild_file_uuidsbf_uuidconfig_list_objbuild_config_uuidsconfig_uuidproducts_groupe r5   E/data/storage/obfuscation/tool/ObjectiveC/oc_custom/custom_pbxproj.pydelete_target_using_pbxproj   sp   
















r7   Fc              
   C   s  zbt | }||}|std| d W dS |j}||}|s-td| d W dS d}	|jD ]$}
||
}|r@t|dsAq2|rO||jv rN|j|= d}	q2||j|< d}	q2|	r`|	  W dS W dS  t
y } ztd|  td	 tjtjd
 td	 W Y d}~dS d}~ww )u  
    修改或删除 Target 的构建设置
    
    参数:
        pbx_path (str): project.pbxproj 文件的路径
        target_name (str): 目标 Target 的名称
        setting_key (str): 要修改的设置键名，例如 'GCC_PREPROCESSOR_DEFINITIONS'
        new_value (any, optional): 新的设置值，如果 delete=True 则忽略此参数
        delete (bool, optional): 如果为 True，则删除该设置项，默认为 False
        
    返回:
        bool: 操作成功返回 True，否则返回 False
    r   r   Fu   错误: 无法获取 Target 'u   ' 的构建配置列表。buildSettingsTr   r   r   N)r   r   r   r   r   r   r   r   r8   r   r   r   r    r!   r"   )r#   r$   setting_key	new_valuedeleter%   targetbuild_config_list_idbuild_config_listmodified	config_idconfigr4   r5   r5   r6   modify_target_build_settingc   sF   






rB   c                 C   s   t | |dg dS )u  
    清空 Target 的预处理器定义 (GCC_PREPROCESSOR_DEFINITIONS)
    
    参数:
        pbx_path (str): project.pbxproj 文件的路径
        target_name (str): 目标 Target 的名称
        
    返回:
        bool: 操作成功返回 True，否则返回 False
    GCC_PREPROCESSOR_DEFINITIONSF)rB   )r#   r$   r5   r5   r6   %clear_target_preprocessor_definitions   s   rD   c           1         sr  zt | t t  g }|D ]*}tj|}|| tj|}|r;tj|r;tj|}|dvr;|| q|D ]}ztj|}g g }g j	dD ]C}|
 v r^qUd}	t|drq||jkso||jv rqd}	|	st|drtj|j}
||
ks||jv rd}	|	r| |
  qUdd D   j	d	D ]}|
 v rqt|d
r|jv r|| |
  qj	d	D ]k}|
 v rqt|d
r<|jjv r<j|j }d}	t|dr||jv rd}	|	st|dr||jv rd}	|	r<|| |
 vr.| |
   |
  |
  |
  qч fddj	dD ]}|| qOdd |D dD ]#}j	|D ]}t|drt|j}fdd|jD |_qiqaj	dD ]}t|dsqt|j}fdd|jD |_qd}tj }|D ]&}t|drt|d|
 n|
 }t|dsАq|j}|jvrېqj| }t|dsq|j}|D ]}|jvrqj| }t|dr	t|ddnd}t|dsq|j}dD ]}d}z||v p't||}W n ty= } zW Y d}~qd}~ww |rd}z||v rM|| nt||d}W n tyh } zW Y d}~qd}~ww |du rpqt|trDg }|D ]D} d}!|D ]4}"|"| v rd|" | v sd|" d| v sd|" | v sd|" d| v s| |"rd}! nq|!r||  qzt|t|krB|rz|||< W nn ty  } z"zt||| W n ty }# zW Y d}#~#nd}#~#ww W Y d}~nDd}~ww z||= W n9 ty? } z,zt|| W n ty4 }# zzd||< W n   Y W Y d}#~#nd}#~#ww W Y d}~nd}~ww d}qt|trg }$|D ]}"d|" dd|" dd |" d!|" d|" d"d|" d"d |" dd!|" dd#|" dd$|" d#|" d"d$|" dd%|" dd&|" d%|" d"d&|" dg}%d'|" d(d)|" d(d*|" d(d+|" d,d-|" d,d.|" d,g}&d/|" dd0|" dd1|" dg}'|%|& |' }(|$|( qN|})d}*|$D ]}+|+|)v r|) |+d2})d}*q|D ]E}"d3t!"|" d4 d5t!"|" d4 d6t!"|" d4 g},|,D ]%}-t!#|-|)}.|.r7|.D ]}/|) d|/ dd2})|) |/ d2})d}*q qq|*r|) d7d8$ })d9|)v rV|) d9d:})d9|)v sK|)$d;})|)rz|)||< W nn ty } z"zt|||) W n ty }# zW Y d}#~#nd}#~#ww W Y d}~nDd}~ww z||= W n9 ty } z,zt|| W n ty }# zzd||< W n   Y W Y d}#~#nd}#~#ww W Y d}~nd}~ww d}qqq|D ]}|
 jv rj|
 = q݈D ]}|
 jv rj|
 = qt%D ]}|
 jv rj|
 = qW q> tyF } zt&d<| d=|  t&d> t'j(t)j*d? t&d> W Y d}~q>d}~ww zjg }0j	d	D ]}t|d
rj|jjvse|j v rj|0| qP|0rd@d |0D dD ]#}j	|D ]}t|drt|j}fdAd|jD |_qqx|0D ]}|
 jv rj|
 = qW n) ty } zt&dB|  t&d> t'j(t)j*d? t&d> W Y d}~nd}~ww z+  W W dS  ty } zt&dC|  t&d> t'j(t)j*d? t&d> W Y d}~W dS d}~ww  ty8 } zt&dD|  t&d> t'j(t)j*d? t&d> W Y d}~dS d}~ww )Eu%  
    从项目中删除文件或文件夹及其所有相关引用
    
    参数:
        pbx_path (str): project.pbxproj 文件的路径
        file_paths (list): 要删除的文件或文件夹路径列表
        
    返回:
        bool: 操作成功返回 True，否则返回 False
    )OSFrameworksCNFrameworksPBXFileReferenceFnameTpathc                 S      g | ]}|  qS r5   r   ).0refr5   r5   r6   
<listcomp>       z-remove_files_from_project.<locals>.<listcomp>PBXBuildFilefileRefc                    s  |   v rd S d}t| dr| j|ks|| jv rd}nt| dr-| j|ks+|| jv r-d}|r?| vr?|  |    t| drt| jD ]}|jv r|vrɈj| }t|dr|j	dkrd}t|drw||jkst||jv rwd}nt|dr||jks||jv rd}|s|r|  vr| |    |   |   qI|j	dkrɈ|| |r|vrɈ| |   qId S d S )	NFrH   TrI   childrenisarG   PBXGroup)
r   r   rH   rI   appendaddr   rR   r   rS   )groupr$   should_removechild_idchildchild_should_remove)all_removed_file_refscollect_group_contentsfile_ref_idsfile_refs_to_removegroups_to_cleanprocessed_idsr%   r5   r6   r]     sH   








z9remove_files_from_project.<locals>.collect_group_contentsrT   c                 S   rJ   r5   rK   rL   bfr5   r5   r6   rN   T  rO   )PBXFrameworksBuildPhasePBXResourcesBuildPhasePBXSourcesBuildPhaser
   c                       g | ]}| vr|qS r5   r5   rL   f)build_file_idsr5   r6   rN   \      rR   c                    s*   g | ]}| vr|d d D vr|qS )c                 S   rJ   r5   rK   )rL   gr5   r5   r6   rN   f  rO   z8remove_files_from_project.<locals>.<listcomp>.<listcomp>r5   )rL   c)r^   r`   r5   r6   rN   e  s    r   r   u   未命名配置r8   )FRAMEWORK_SEARCH_PATHSLIBRARY_SEARCH_PATHSHEADER_SEARCH_PATHSN/.\z"$(SRCROOT)/../"z"$(SRCROOT)/../*/z$(SRCROOT)/../z$(SRCROOT)/../*/z/"z"$(SRCROOT)/../CNFrameworks/z$(SRCROOT)/../CNFrameworks/z"$(SRCROOT)/../OSFrameworks/z$(SRCROOT)/../OSFrameworks/z"\"$(SRCROOT)/../OSFrameworks/z\""z"\"$(SRCROOT)/../CNFrameworks/z"\"$(SRCROOT)/../z\"$(SRCROOT)/../OSFrameworks/z\"z\"$(SRCROOT)/../CNFrameworks/z\"$(SRCROOT)/../z"/Users/*/OSFrameworks/z"/Users/*/CNFrameworks/z
"/Users/*/ z["\s,](.*?/OSFrameworks/z	/?)["\s,]z["\s,](.*?/CNFrameworks/z["\s,](.*?/z   z,,,z ,u   ❌ 处理文件 u    时出错: r   r   c                 S   rJ   r5   rK   rb   r5   r5   r6   rN   a  rO   c                    rg   r5   r5   rh   )orphaned_idsr5   r6   rN   f  rk   u!   ❌ 清理孤立引用时出错: u!   ❌ 保存项目文件时出错: u"   
❌ 处理项目时发生错误: ),r   r   setosrI   basenamerU   dirnamer   get_objects_in_sectionr   r   rH   rV   updaterQ   lenr
   rR   r   get_targetsgetattrr   r   r8   r   
isinstanceendswithsetattrdelattrstrextendreplacereescapefindallstripreversedr   r   r    r!   r"   r   )1r#   
file_pathsframework_names	file_path	file_name
parent_dirparent_namebuild_files_to_removefile_refrX   path_basename
build_filerW   
phase_typephaseoriginal_countmodified_settingsr	   r<   r$   r=   r>   
config_idsr@   rA   config_namebuild_settingskeyhas_keyr4   original_value	new_pathsrI   	keep_pathfne2patternsbase_patternsnested_quote_patternsabsolute_patternscurrent_patternsr:   r?   patternframework_regex_patternsregex_patternregex_matchesmatchorphaned_build_filesr5   )	r\   rj   r]   r^   r_   r`   rx   ra   r%   r6   remove_files_from_project   s|  









1


$



"
Z

	


























	  8	


r   )NF)r!   rz   pbxprojr   pbxproj.pbxextensionsr   r   r   r7   rB   rD   r   r5   r5   r5   r6   <module>   s    
[@