<?xml version="1.0" encoding="UTF-8"?>
<!--
  ANT Buildfile
 
  Copyright 2020-2023 IS2T. All rights reserved.
  IS2T PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
-->
<!-- Project name must not change (used by local deploy tools) -->
<project name="emb.dynamic.feature.intern" default="board" xmlns:tools="antlib:com.is2t.elf.tool.stripper">

	<import file="dynamicFeatureCommon.xml"/>

	<!-- 
		Feature Link using SOAR2: 
		- SOAR-R generates a .fso
		- SOAR-O generates a .fo
		Note: Partial Linker is not used.
	-->

	<!-- Input properties -->
	<fail unless="kernel.filename"/>
	<fail unless="platform.dir"/>

	<loadproperties srcfile="${scripts.dir}/soar2.properties" prefix="soar2"/>
	<import file="dynSOAR2PathDefinition.xml"/>
	<import file="kdatGenDefinition.xml"/>

	<!-- Silently skip if soar is unavailable (e.g virtual device strip - execSOAR will be set to false later) -->
	<taskdef name="dynSOAR2CSTask" classname="${soar2.cs.classname}" classpathref="soar2-r.dyn.classpath.path" onerror="ignore"/>
	<taskdef name="dynSOAR2OTask" classname="${soar2.o.classname}" classpathref="soar2-o.dyn.classpath.path" onerror="ignore"/>

	<!-- 
		This resource is required by image/font generators scripts (unused) 
	-->
	<resources id="dynamicLink.lscf.path"/>

	<target name="activity/soar">
		<start.subactivity
			activity.id="${soar2.activity.id}"
			message="${soar2.activity.msg}"
			parent.activity.id="${activity.root.id}"
		/>
	</target>

	<!--
		feature.output.name & feature.deploy.file are used by other launches.
		feature.output.name must be the real name of the builded feature.
		feature.deploy.file must be the absolute path of the builded feature.
	-->
	<target name="mkdirs/feature">
		<property name="feature.extrafiles.output.dir" value="${application.output.dir}/feature"/>
		<property name="feature.output.basename" value="${application.main.class}"/>

		<basename property="feature.output.basename.without.ext" file="${feature.output.basename}" suffix=".fo"/>
		<property name="feature.output.name" value="${feature.output.basename.without.ext}.fo"/>
		<property name="featuredebug.output.name" value="${feature.output.basename.without.ext}.fodbg"/>
		<property name="fso.output.name" value="${feature.output.basename.without.ext}.fso"/>
		<property name="feature.deploy.file" value="${application.output.dir}/${feature.output.name}"/>
		<property name="fso.deploy.file" value="${application.output.dir}/${fso.output.name}"/>
		<property name="feature.debug.file" value="${application.output.dir}/${featuredebug.output.name}"/>
		<property name="feature.map.file" value="${application.output.dir}/${feature.output.basename.without.ext}.map"/>
		<!-- Define empty test options if not set by the testsuite module -->
		<property name="com.microej.soar.asmverify.file" value=""/>
		<property name="com.microej.soar-r.errordescription.file" value=""/>
		<property name="com.microej.soar-o.errordescription.file" value=""/>

		<!-- '.debug.soar' section generation (enabled by default) -->
		<property name="com.microej.soar.debuginfos.enabled" value="true"/>
		<!-- produce debug lines information (enabled by default) -->
		<property name="com.microej.soar.debuglines.enabled" value="true"/>
		<!-- map file generation (enabled by default) -->
		<property name="com.microej.soar.map.file.enabled" value="true"/>

		<mkdir dir="${feature.extrafiles.output.dir}"/>
	</target>

	<target name="soar-r" depends="mkdirs/feature,activity/soar">
		<condition property="soar2.verbose.level" value="9" else="0">
			<isset property="execution.verbose"/>
		</condition>
		<condition property="soar2.sanity.check" value="true" else="false">
			<isset property="execution.verbose"/>
		</condition>
		<property name="soar.bytecode.verifier" value="true"/>
		<dynSOAR2CSTask
			sanityCheck="${soar2.sanity.check}"
			verboseLevel="${soar2.verbose.level}"
			kernelFilename="${kernel.filename}"
			outputDir="${feature.extrafiles.output.dir}"
			outputName="${feature.output.basename.without.ext}"
			endianness="${arch.endianness}"
			symbolPrefix="${arch.symbol.prefix}"
			floatingRepresentation="${decimal.impl}"
			expectedErrorsFilename="${com.microej.soar-r.errordescription.file}"
			rootTypes="${overall.requires}"
			rootImmutables="${overall.immutables}"
			rootResources="${overall.resources}"
			externalResourcesDir="${externalResources.output.dir}"
			generateDebugLines="${com.microej.soar.debuglines.enabled}"
			verifyBytecode="${soar.bytecode.verifier}"
		>
			<classpath>
				<path path="${overall.classpath}"/>
			</classpath>
		</dynSOAR2CSTask>
	</target>

	<target name="kdat-gen" depends="mkdirs/feature,activity/soar" unless="kdat.filename">
		<!-- 
			Generate the .kdat file on demand from the Kernel executable if it is not already provided.
			By default, this is silently done. The generated ouput file is printed only when execution verbose is enabled. 
		-->
		<kdatGen verboseLevel="${soar2.verbose.level}" sanityCheck="${soar2.sanity.check}" kernelFilename="${kernel.filename}" outputProperty="kdat.filename"/>
	</target>

	<target name="soar-o" depends="soar-r,kdat-gen">
		<dynSOAR2OTask
			sanityCheck="true"
			verboseLevel="${soar2.verbose.level}"
			kdatFilename="${kdat.filename}"
			outputDir="${feature.extrafiles.output.dir}"
			outputName="${feature.output.basename.without.ext}"
			endianness="${arch.endianness}"
			sharedObjectFilename="${feature.extrafiles.output.dir}/${feature.output.basename.without.ext}.so"
			symbolPrefix="${arch.symbol.prefix}"	
			asmVerifyFilename="${com.microej.soar.asmverify.file}"
			generateDebugInfos="${com.microej.soar.debuginfos.enabled}"
			expectedErrorsFilename="${com.microej.soar-o.errordescription.file}"
			generateMapFile="${com.microej.soar.map.file.enabled}"
		/>
	</target>

	<target name="strip" depends="soar-o">
		<tools:elfStripper 
			inputfile="${feature.extrafiles.output.dir}/${feature.output.basename.without.ext}.o" 
			outputfile="${feature.extrafiles.output.dir}/${feature.output.basename.without.ext}_s.o" 
			keepSymbols="${arch.symbol.prefix}_java_signature_start,${arch.symbol.prefix}_java_kernel_signature_start,${arch.symbol.prefix}_java_header_types_start,${arch.symbol.prefix}_java_features_start" 
			keepSections=".soar.rel" 
			actions="removeDebugSections,removeUnusedSymbols,turnToLocalSymbols" 
		/>
	</target>

	<target name="deploy" depends="strip">
		<copy file="${feature.extrafiles.output.dir}/${feature.output.basename.without.ext}_s.o" tofile="${feature.deploy.file}"/>
		<copy file="${feature.extrafiles.output.dir}/${feature.output.basename.without.ext}.o" tofile="${feature.debug.file}"/>
		<copy file="${feature.extrafiles.output.dir}/${feature.output.basename.without.ext}.so" tofile="${fso.deploy.file}"/>
		<!-- Copy link map file (if option set) -->
		<copy file="${feature.extrafiles.output.dir}/${feature.output.basename.without.ext}.map" tofile="${feature.map.file}" failonerror="false"/>
	</target>

	<!-- Workbench Entry point  -->
	<target name="board" depends="dyninit,deploy,finish"/>

	<!-- Intern entry point to stop just after SOAR execution -->
	<target name="soarOnly" depends="dyninit,soar-o"/>

</project>