3
!a_	!                 @   s   d dl m Z  d dlZd dlZd dlZd dlZd dlZdd Zddddd	d
dddd	ddddd	dZdd Zdd Z	dd Z
dd Zdd Zd.ddZdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd/d)d*Zd+d, Zed-kre  dS )0    )pprintNc             C   s   t jdd| j S )Nz\s+ )resubstrip)string r   N/home/aniruddha/Desktop/UnitTestSetup/test/cbmc/proofs/make_common_makefile.pycleanup_whitespace    s    r
   linux/z-Dz-I)platform	separatordefineincludedarwinZwin32\z/Dz/I)r   Zmacoswindowsc              C   s,   x&t j D ]\} }tj|d kr
| S q
W dS )Nr   r   )platform_definitionsitemssysr   )r   Z
definitionr   r   r	   default_platform<   s    r   c                sF   dt |  d fdd}fdd j fdd||D S )	Nr   r   c                s   | j    S )N)split)r   )from_separatorr   r	   escape_separatorG   s    z.patch_path_separator.<locals>.escape_separatorc                s   | j  S )N)replace)r   )r   to_separatorr   r	   change_separatorJ   s    z.patch_path_separator.<locals>.change_separatorc                s   g | ]} |qS r   r   ).0escaped)r   r   r	   
<listcomp>M   s   z(patch_path_separator.<locals>.<listcomp>)r   join)opsysr   r   r   )r   r   r   r	   patch_path_separatorC   s    r#   c             C   sT   | dkr|S |d	krP|d k	rP|d
 dkr6t jdd|S |d dkrPt jdd|S |S )Nr   COMPILE_ONLYCOMPILE_LINK   z/Foz/Fo\s+z/Fez/Fe\s+)r$   r%   r'   )r   r   )r"   linekeyvaluer   r   r	   patch_compile_outputP   s    r+   c              C   s*   t j } | jddttt dd | j S )Nz--systemZOSz*Generate makefiles for operating system OS)metavarchoicesdefaulthelp)argparseArgumentParseradd_argumentr   strr   
parse_args)parserr   r   r	   get_arguments_   s    r6   c             C   sN   i }t | 8}x0tj|j D ]\}}dd |D |t|< qW W d Q R X |S )Nc             S   s   g | ]}t |qS r   )r
   )r   r*   r   r   r	   r    u   s   z-read_variable_definitions.<locals>.<listcomp>)openjsonloadr   r
   )filenameZvariableZ_filer)   valuesr   r   r	   read_variable_definitionsq   s    
r<   c             C   sf   |rdj |jdnd}| j|r2| t|d  n||  }x&| |gD ]}|j|}|d k	rD|S qDW d S )Nz{}__ )formatrstrip
startswithlenget)r)   definesprefixZkey2Z_key_valuer   r   r	   find_definition_oncey   s    "
rG   c             C   s.   |\}}}t | |dp,t | |dp,t | |dS )NHOC)rG   )r)   rD   common_definesopsys_definesharness_definesr   r   r	   find_definition   s    
rN   c                sR   |j |}|sdS |d	kr, fdd|D }fdd|D }dj||dj|S )
Nr>   INCDEFc                s   g | ]}t  |qS r   )r#   )r   r*   )r"   r   r	   r       s   z(construct_definition.<locals>.<listcomp>c                s   g | ]}d j  |qS )z	{}{} \)r?   )r   r*   )value_prefixr   r	   r       s    z{}_{} = \
{}
	# empty

)rO   rP   )rC   r?   r!   )r"   
key_prefixrQ   r)   Zdefinitionsr;   linesr   )r"   rQ   r	   construct_definition   s    

rU   c             C   s<   t ||}|r8|dkr&tjj|d }|jdj|| d S )NFREERTOS_PLUS_TCPPROOFSr   z{} = {}
)rV   rW   )rN   ospathabspathwriter?   )r"   r   rD   makefiler*   r   r   r	   write_define   s
    
r]   c       
      C   s   |\}}}x|t dddg|||gD ]b\}}xXt t|  d t|  d ddgddd	d
gD ]*\}}t| ||||}	|	rV|j|	d  qVW q"W d S )NrJ   rI   rH   r   r   r>   rO   rP   OPTZ	CBMCFLAGSrR   )zipr   rU   r[   )
r"   rD   r\   rK   rL   rM   rS   rQ   r)   r   r   r   r	   write_common_defines   s    

r`   c       
         s   t |}x|D ]|}t| |}tjd|} fdd|D }xDt||D ]6\}}	|	d k	rH|jdj|dj|	}t| |||	}qHW |j	| qW W d Q R X d S )Nz@(\w+)@c                s   g | ]}t | qS r   )rN   )r   r)   )rD   r   r	   r       s    z"write_makefile.<locals>.<listcomp>z@{}@r   )
r7   r#   r   findallr_   r   r?   r!   r+   r[   )
r"   templaterD   r\   Z	_templater(   keysr;   r)   r*   r   )rD   r	   write_makefile   s    


rd   c             C   s   d}| dkr|j | d S )Na  
################################################################
# Build configuration file to run cbmc under cbmc-batch in CI

define encode_options
'=$(shell echo $(1) | sed 's/ ,/ /g' | sed 's/ /;/g')='
endef

cbmc-batch.yaml:
	@echo "Building $@"
	@$(RM) $@
	@echo "jobos: ubuntu16" >> $@
	@echo "cbmcflags: $(call encode_options,$(CBMCFLAGS) --unwinding-assertions)" >> $@
	@echo "goto: $(ENTRY).goto" >> $@
	@echo "expected: $(H_EXPECTED)" >> $@

################################################################
r   )r[   )r"   	_makefiletargetr   r   r	   write_cbmcbatchyaml_target   s    rg   Makefilec             C   sZ   t |dF}t| d|| t| d|| t| || t| ||| t| | W d Q R X d S )NwrV   rW   )r7   r]   r`   rd   rg   )r"   rb   rD   r\   re   r   r   r	   makefile_from_template   s    rj   c              C   sB   t  } td}t| jdkrdnd}i }t| jd|||fd d S )NzMakefileCommon.jsonr   zMakefileWindows.jsonzMakefileLinux.jsonzMakefile.templatezMakefile.common)r6   r<   systemrj   )argsrK   rL   rM   r   r   r	   main   s    rm   __main__)N)rh   )r   r8   r   r   rX   r0   r
   r   r   r#   r+   r6   r<   rG   rN   rU   r]   r`   rd   rg   rj   rm   __name__r   r   r   r	   <module>   sD   
	
