¿Cómo determinar la arquitectura de compilación (32 bits / 64 bits) con hormiga?
Pregunta
Hemos heredado un archivo de compilación de hormigas, pero ahora necesitamos implementarlo en sistemas de 32 bits y 64 bits.
Los bits que no son de Java se realizan con GNUMakefiles donde simplemente llamamos " uname " para obtener la información ¿Existe una forma similar o incluso más fácil de imitar esto con la hormiga?
Solución
puede obtener las propiedades del sistema java ( http://java.sun.com/javase/6/docs/api/java/lang/System.html#getProperties () ) de la hormiga con $ {os.arch}. otras propiedades de interés pueden ser os.name, os.version, sun.cpu.endian y sun.arch.data.model.
Otros consejos
Tarde a la fiesta, pero qué diablos ...
$ {os.arch} solo le dice si la JVM es 32 / 64bit. Es posible que esté ejecutando la JVM de 32 bits en un sistema operativo de 64 bits. Prueba esto:
<var name ="os.bitness" value ="unknown"/>
<if>
<os family="windows"/>
<then>
<exec dir="." executable="cmd" outputproperty="command.ouput">
<arg line="/c SET ProgramFiles(x86)"/>
</exec>
<if>
<contains string="${command.ouput}" substring="Program Files (x86)"/>
<then>
<var name ="os.bitness" value ="64"/>
</then>
<else>
<var name ="os.bitness" value ="32"/>
</else>
</if>
</then>
<elseif>
<os family="unix"/>
<then>
<exec dir="." executable="/bin/sh" outputproperty="command.ouput">
<arg line="/c uname -m"/>
</exec>
<if>
<contains string="${command.ouput}" substring="_64"/>
<then>
<var name ="os.bitness" value ="64"/>
</then>
<else>
<var name ="os.bitness" value ="32"/>
</else>
</if>
</then>
</elseif>
</if>
<echo>OS bitness: ${os.bitness}</echo>
EDITAR: Como @GreenieMeanie señaló, esto requiere la biblioteca ant-contrib de ant-contrib.sourceforge.net
Aquí hay una respuesta que funciona (probé en Kubuntu 64, Debian 32, Windows 2000 y Windows XP) sin la necesidad de dependencias ANT externas u opcionales. Se basó en la respuesta de @ phatypus.
<project name="FindArchitecture" default="check-architecture" basedir=".">
<!-- Properties set: unix-like (if it is unix or linux), x64 (if it is 64-bits),
register- size (32 or 64) -->
<target name="check-architecture" depends="check-family,check-register" >
<echo>Register size: ${register-size}</echo>
<echo>OS Family: ${os-family}</echo>
</target>
<target name="check-family" >
<condition property="os-family" value="unix" else="windows">
<os family="unix" />
</condition>
<condition property="unix">
<os family="unix" />
</condition>
</target>
<target name="check-register" depends="reg-unix,reg-windows">
</target>
<!-- Test under GNU/Linux -->
<target name="reg-unix" if="unix">
<exec dir="." executable="uname" outputproperty="result">
<arg line="-m"/>
</exec>
<!-- String ends in 64 -->
<condition property="x64">
<matches string="${result}" pattern="^.*64<*>quot;/>
</condition>
<condition property="register-size" value="64" else="32">
<isset property="x64"/>
</condition>
</target>
<!-- Test under MS/Windows-->
<target name="reg-windows" unless="unix">
<!-- 64 bit Windows versions have the variable "ProgramFiles(x86)" -->
<exec dir="." executable="cmd" outputproperty="result">
<arg line="/c SET ProgramFiles(x86)"/>
</exec>
<!-- String ends in "Program Files (x86)" -->
<condition property="x64">
<matches string="${result}" pattern="^.*=.*Program Files \(x86\)"/>
</condition>
<condition property="register-size" value="64" else="32">
<isset property="x64"/>
</condition>
</target>
</project>
Puede pasar un parámetro al archivo de compilación con el valor que desee. Por ejemplo, si su objetivo es dist
:
ant -Dbuild.target=32 dist
o
ant -Dbuild.target=64 dist
y luego en su script de compilación Ant, realice diferentes acciones dependiendo del valor de la propiedad $ {build.target}
(también puede usar condiciones para establecer un valor predeterminado para la propiedad si no está establecida).
O puede verificar el valor de integrado propiedades del sistema , como $ {os.arch}
.
Por cierto, el os.arch (propiedad arch de la etiqueta os) que obtuve para Linux de 64 bits era amd64.
os.arch no funciona muy bien, otro enfoque es preguntarle a la JVM, por ejemplo:
~$ java -d32 test Mon Jun 04 07:05:00 CEST 2007 ~$ echo $? 0 ~$ java -d64 test Running a 64-bit JVM is not supported on this platform. ~$ echo $? 1
Eso tendría que estar en un script o un contenedor.
Suponiendo que está utilizando ANT para crear aplicaciones Java, ¿por qué necesitaría saber si es un arco de 32 bits o de 64 bits? Siempre podemos pasar parámetros a las tareas de hormigas. Una forma más limpia sería emitir programáticamente el archivo de propiedades del sistema utilizado por Ant antes de llamar a la compilación real. Existe esta publicación interesante http://forums.sun.com/thread.jspa?threadID = 5306174 .