o
    h|                     @   s   d dl Z d dlZd dlZd dlZd dlmZ ee  Z	ee
j Zed e Zed e Zee d dlmZ d dlmZ d dlZd dlZd dlmZ eG dd	 d	Zd
edefddZdd Ze  dS )    N)	dataclasslibbin)compile_urcl_to_executable)Elf32)	Tracebackc                   @   s:   e Zd ZU eed< eed< ejed< ejed< eed< dS )CommandLineArgumentssource_fileoutput_fileexecutable_formatmachine_typeis_mainN)	__name__
__module____qualname__str__annotations__targetExecutableFormatIsabool r   r   2/home/seanl/mnt/public/Repos/urclelf/./__main__.pyr      s   
 

r   source_pathoptionsc              	   C   s   t | dW}t| tjt|jtjjtj	j
tjj|j|jd}t|tr*|}nt| t  t |jd}|| W d    n1 sGw   Y  W d    d S W d    d S 1 s_w   Y  d S )Nr)r   executable_typer   r   zw+b)openr   readr   CompileOptionsTargetr   	ByteOrderLITTLEOsAbiSYSVExecutableTypeOBJECTr   r   
isinstancebytesprintexitr
   write)r   r   fileprogrambytes_for_filer   r   r   command_line_compile   s(   
	"r/   c                  C   s  t jdd} | d | jddd | jddd	d
d | jddddd | jddddd | tjdd  }|jd u r\|jdd dd d }t	
| t	 }t||_|j dkrhtjj}n&|j dv rttjj}n|j dkrtjj}ntd|j  d t  |j dkrtjj}n|j d krtjj}ntd!|j  d t  t|j|j||j |d"}t|j| d S )#Nz&Compiles URCL code to x86 executables.)descriptionr	   z-or
   )destz-fr   elfzoutput file format)r1   defaulthelpz-libr   
store_truez.pass this if this file is not the entry point.)r1   actionr4   z-mmachinei386z%instruction set of the target machine   /.r   z.or   )r2   NcoffzExecutable file format 'z' not known.x64zMachine type ')r	   r
   r   r   r   )argparseArgumentParseradd_argument
parse_argssysargvr
   r	   splitBIN_DIRjoinpathresolverelative_tor   r   lowerr   r   FLATELFCOFFr)   r*   r7   r   X86X64exec_file_typer   r   r/   )argument_parserkfilenameoutput_pathr   r7   r   r   r   main/   sB   







rU   )r?   rC   ospathlibdataclassesr   PathgetcwdrH   OLD_CWD__file__parentCURRENT_DIRrG   rI   LIB_DIRrF   chdircompiler   r2   r   r   x86errorr   r   r   r/   rU   r   r   r   r   <module>   s(    

'