
    7j8.                        d dl Z d dlZd dlmZmZmZ d dlmZ d dlm	Z	m
Z
 d dlmZ d dlmZmZmZmZ d dlmZmZmZ d dlmZ d d	lmZ d d
lmZ d dlmZmZmZ d dl m!Z! ddgZ" G d d      Z# G d de#      Z$ G d de#      Z%y)    N)DictListUnion)Path)dottyDotty)cli)QMK_FIRMWAREINTERMEDIATE_OUTPUT_PREFIXHAS_QMK_USERSPACEQMK_USERSPACE)	find_makeget_make_parallel_argsparse_configurator_json)keyboard_folder)keymap_json)locate_keymap)is_under_qmk_firmwareis_under_qmk_userspaceunix_style_path)write_compilation_databaseFORCE_LAYOUT
CONVERT_TOc            	          e Zd Zd#dededeeef   fdZd Zd Z	de
d	efd
Zde
d	efdZd	efdZd$dededed	dfdZed	efd       Zed	efd       Zed	efd       Zed	efd       Zed	eeef   fd       Zej0                  deeef   fd       Zd	efdZd	eeef   fdZd	efdZd%dedefdZd&deded	dfdZd&deded	ee   fdZ d&ded ed	dfd!Z!d&deded	dfd"Z"y)'BuildTargetNkeyboardkeymapjsonc                    t        |      | _        | j                  j                  dd      | _        || _        d| _        d| _        d| _        i | _        t        |t              r |j                         | _        y || _        y )N/_   F)r   	_keyboardreplace_keyboard_safe_keymap	_parallel_clean
_compiledb_extra_args
isinstancer   to_dict_json)selfr   r   r   s       J/home/hanthebot/chat/keyboard/qmk_firmware/lib/python/qmk/build_targets.py__init__zBuildTarget.__init__   si    (2"nn44S#>'1$'>\T\\^
D
    c                 8    | j                    d| j                   S )N:)r   r   r.   s    r/   __str__zBuildTarget.__str__    s    --$++//r1   c           	         t        | j                  j                               dkD  r?d| j                   d| j                   dt        j                  | j                  d       dS d| j                   d| j                   dS )Nr   zBuildTarget(keyboard=	, keymap=, extra_args=T)	sort_keys))lenr*   itemsr   r   r   dumpsr4   s    r/   __repr__zBuildTarget.__repr__#   s    t%%'(1,*4==/4;;-}]a]g]ghlhxhx  EI  ^J  ]K  KL  M  M&t}}oYt{{m1MMr1   _BuildTarget__valuereturnc                 D    | j                         |j                         k  S N)r>   r.   r?   s     r/   __lt__zBuildTarget.__lt__(   s    }}!1!1!333r1   c                 f    t        |t              sy| j                         |j                         k(  S NF)r+   r   r>   rC   s     r/   __eq__zBuildTarget.__eq__+   s)    ';/}}'"2"2"444r1   c                 >    | j                         j                         S rB   )r>   __hash__r4   s    r/   rI   zBuildTarget.__hash__0   s    }}''))r1   parallelclean	compiledbc                 <    ||| _         ||| _        ||| _        y y rB   )r'   r(   r)   )r.   rJ   rK   rL   s       r/   	configurezBuildTarget.configure3   s.    %DNDK 'DO !r1   c                     | j                   S rB   )r#   r4   s    r/   r   zBuildTarget.keyboard;   s    ~~r1   c                     | j                   S rB   )r&   r4   s    r/   r   zBuildTarget.keymap?   s    ||r1   c                 n    | j                   s| j                          | j                   si S | j                   S rB   )r-   
_load_jsonr4   s    r/   r   zBuildTarget.jsonC   s)    zzOOzzIzzr1   c                 ,    t        | j                        S rB   )r   r   r4   s    r/   r   zBuildTarget.dottyK   s    TYYr1   c                 j    | j                   j                         D ci c]  \  }}||
 c}}S c c}}w rB   )r*   r<   )r.   kvs      r/   
extra_argszBuildTarget.extra_argsO   s-    !%!1!1!7!7!9:A1:::s   /ex_argsc                     |;t        |t              r*|j                         D ci c]  \  }}||
 c}}| _        y y y c c}}w rB   )r+   dictr<   r*   )r.   rX   rU   rV   s       r/   rW   zBuildTarget.extra_argsS   s=    :gt#<18AA1AD $=As   ?c                     | j                    d| j                   } | j                  di |}t        D ]  }||v s|d||    z  } |S )Nr!    )r%   r   	_all_varsTARGET_FILENAME_MODIFIERS)r.   env_varstargetvarsmodifiers        r/   target_namezBuildTarget.target_nameX   sd    ''($++7t~~))1 	/H4Ad8n-..	/ r1   c                     |j                         D ci c]  \  }}||
 }}}| j                  j                         D ]
  \  }}|||<    |S c c}}w rB   )r<   r*   )r.   r_   rU   rV   ra   s        r/   r]   zBuildTarget._all_varsa   sY    !)!12A122$$**, 	DAqDG	 3s   Ac                 H    t        t          | j                  di |       S )Nr\   )r   r   rc   )r.   r_   s     r/   _intermediate_outputz BuildTarget._intermediate_outputg   s*    123C43C3C3Oh3O2PQRRr1   dry_runbuild_targetc           
         t               gt        | j                        dddd}t        j                  j
                  j                  s|j                  d       t        j                  j
                  j                  rdnd}t        j                  j
                  j                  rdnd}|r|j                  d       |r|j                  |       |j                  d	| j                   d
| j                   d| j                   d| j                   d| j                   d| d| ddg        | j                  di |}|j                         D ]  \  }}	|j                  | d|	         |S )Nz-rz-Rz-fzbuilddefs/build_keyboard.mkz-struefalse-nz	KEYBOARD=zKEYMAP=zKEYBOARD_FILESAFE=zTARGET=r!   zVERBOSE=zCOLOR=zSILENT=falsezQMK_BIN="qmk"=r\   )r   r   r'   r	   configgeneralverboseappendcolorextendr   r   r%   r]   r<   )
r.   rg   rh   r_   compile_argsrp   rr   ra   rU   rV   s
             r/   _common_make_argszBuildTarget._common_make_argsj   s   K
#DNN3
 
 	

 
 *
 zz!!))%JJ..66&G**,,22%-'dkk]# !4!4 56d))*!DKK=9wi UG	
 		 t~~))JJL 	,DAq1#Qqc
+	, r1   c                     t        d      )Nz-prepare_build() not implemented in base classNotImplementedErrorr.   rh   rg   r_   s       r/   prepare_buildzBuildTarget.prepare_build   s    !"QRRr1   c                     t        d      )Nz/compile_command() not implemented in base classrw   ry   s       r/   compile_commandzBuildTarget.compile_command   s    !"STTr1   
skip_cleanc                     | j                   dd|i|  | j                  d|dd|}t        dz  }t        d|||d|}|rE|j	                         r5t
        r/t        j                  t        |      t        t        dz               |S )Nrh   Trh   rg   zcompile_commands.json)commandoutput_pathr}   r\   )
rz   r|   r
   r   existsr   shutilcopystrr   )r.   rh   r}   r_   r   r   rets          r/   generate_compilation_databasez)BuildTarget.generate_compilation_database   s    AAA&$&&[L$[RZ["%<<(uk^hultu;%%',=KKK(#m>U.U*VW
r1   c                    | j                   s| j                  ret               dg}|r|j                  d       t        j
                  j                  ddj                  |             t	        j                  |d       | j                  r|s | j                  d|dd|  | j                  d||d	|  | j                  dd
|i|}t        j
                  j                  ddj                  |             |sEt	        j                  d       t	        j                  |d      }|j                  r|j                  S y y )NrK   rl   zCleaning with {fg_cyan}%s F)capture_outputT)rh   r}   r   rh   z!Compiling keymap with {fg_cyan}%s
r\   )r(   r)   r   rq   r	   loginfojoinrunr   rz   r|   echo
returncode)r.   rh   rg   r_   r   r   s         r/   compilezBuildTarget.compile   s   ;;$// {G,Gt$GGLL4chhw6GHGGGE2??7.D..fLUYf]efRgRR&$&&MLMHM8#((7:KLHHTN'''%8C~~~~%  r1   rB   )NNN)FNrF   )#__name__
__module____qualname__r   r   rZ   r   r0   r5   r>   objectboolrD   rG   intrI   rN   propertyr   r   r   r   r   rW   setterrc   r]   r   rf   ru   rz   r   r|   r   r   r\   r1   r/   r   r      s    I Ic ItU{9K I0N
4f 4 45f 5 5
*# *(# (T (T (]a ( #      d    u     ;DcN ; ; B$sCx. B B tCH~ S$ S% %S %NS# St S\` SUC U U^bcf^g U# RV os &C & &VZ &r1   r   c                   l     e Zd Zddededef fdZd Zd Zdded	ed
dfdZ	dded	ed
e
e   fdZ xZS )KeyboardKeymapBuildTargetNr   r   r   c                 *    t         |   |||       y )Nr   r   r   )superr0   )r.   r   r   r   	__class__s       r/   r0   z"KeyboardKeymapBuildTarget.__init__   s    (6Er1   c                     t        | j                  j                               dkD  r*d| j                   d| j                   d| j                   dS d| j                   d| j                   dS )Nr   zKeyboardKeymapTarget(keyboard=r7   r8   r:   )r;   r*   r<   r   r   r4   s    r/   r>   z"KeyboardKeymapBuildTarget.__repr__   si    t%%'(1,3DMM?)DKK=Xefjfvfvewwxyy/i}TUVVr1   c                 N    t        | j                  | j                        | _        y rB   )r   r   r   r-   r4   s    r/   rR   z$KeyboardKeymapBuildTarget._load_json   s     <
r1   rh   rg   r@   c                      y rB   r\   ry   s       r/   rz   z'KeyboardKeymapBuildTarget.prepare_build       r1   c           
          | j                   d	||d|} | j                  d	i |}t        | j                  | j                  |j                  d            }t        |      rit        |      s^|j                  }|j                  dt        |       dt        |       dt        |       dt        |       dt        |       g       |S )
Nrg   rh   r   )force_layoutMAIN_KEYMAP_PATH_1=MAIN_KEYMAP_PATH_2=MAIN_KEYMAP_PATH_3=MAIN_KEYMAP_PATH_4=MAIN_KEYMAP_PATH_5=r\   )ru   r]   r   r   r   getr   r   parentrs   r   )r.   rh   rg   r_   rt   ra   keymap_locationkeymap_directorys           r/   r|   z)KeyboardKeymapBuildTarget.compile_command   s    -t--egLe\de
 t~~))'t{{QUQYQYZhQij!/2;PQ`;a.55%o6F&G%HI%o6F&G%HI%o6F&G%HI%o6F&G%HI%o6F&G%HI!  r1   rB   rF   )r   r   r   r   rZ   r0   r>   rR   r   rz   r   r|   __classcell__r   s   @r/   r   r      sh    F Fc F FW
=# t \` C  ^bcf^g r1   r   c                   \     e Zd Z fdZd Zd Zd
dededdfdZd
dedede	e   fd	Z
 xZS )JsonKeymapBuildTargetc                     t        |t              r|| _        nd | _        t        |      } |j                  dd      |d<   t
        |   |d   |d   |       y )Nr   default_jsonr   r   )r+   r   	json_pathr   r   r   r0   )r.   r   r   r   s      r/   r0   zJsonKeymapBuildTarget.__init__   s[    i&&DN!DN&y1 "(N;X$z"24>PTUr1   c           	         t        | j                  j                               dkD  r7d| j                   d| j                   d| j
                   d| j                   d	S d| j                   d| j                   d| j
                   dS )Nr   zJsonKeymapTarget(keyboard=r7   z, path=r8   r:   )r;   r*   r<   r   r   r   r4   s    r/   r>   zJsonKeymapBuildTarget.__repr__   s    t%%'(1,/i}T[\`\j\j[kkxy}  zJ  zJ  yK  KL  M  M+DMM?)DKK=PWX\XfXfWgghiir1   c                      y rB   r\   r4   s    r/   rR   z JsonKeymapBuildTarget._load_json   r   r1   Nrh   rg   r@   c                     | j                   d	i |}|dz  }|dz  }| j                  r%|j                         rt        j                  |       |j                  dd       t        j                  | j                  d      } |j                         rBt        j                  t        j                   |j                  d            d      }||k(  rd }|r |j                  |d       y y )
Nsrckeymap.jsonT)exist_okparents),r3   )
separatorszutf-8)encodingr\   )rf   r(   r   r   rmtreemkdirr   r=   loads	read_text
write_text)	r.   rh   rg   r_   intermediate_outputgenerated_files_pathr   new_contentold_contents	            r/   rz   z#JsonKeymapBuildTarget.prepare_build   s    7d77C(C2U:*]:;;"))+12 	""D$"? jjzB;**TZZ0E0E0Ew0W%XeopKk)" "K"";A r1   c           
          | j                   d||d|} | j                  di |}|dz  }|dz  }|j                  dt        |       dt        |       dt        |       dt        |       dt        |       d	| d
| g       |S )Nr   r   r   r   r   r   r   r   zKEYMAP_JSON=zKEYMAP_PATH=r\   )ru   rf   rs   r   )r.   rh   rg   r_   rt   r   r   r   s           r/   r|   z%JsonKeymapBuildTarget.compile_command  s    -t--egLe\de7d77C(C2U:*]:!/2E"F!GH!/2E"F!GH!/2E"F!GH!/2E"F!GH!/2E"F!GH;-(/01
 	 r1   rF   )r   r   r   r0   r>   rR   r   r   rz   r   r|   r   r   s   @r/   r   r      sT    Vj
B# Bt B\` B0C  ^bcf^g r1   r   )&r   r   typingr   r   r   pathlibr   
dotty_dictr   r   milcr	   qmk.constantsr
   r   r   r   qmk.commandsr   r   r   qmk.keyboardr   qmk.infor   
qmk.keymapr   qmk.pathr   r   r   qmk.compilation_databaser   r^   r   r   r   r\   r1   r/   <module>r      sm      $ $  #  d d S S (   $ S S ? ,\: ]& ]&@! !H>K >r1   