¿Cómo determinar la arquitectura de compilación (32 bits / 64 bits) con hormiga?

votos
18

Hemos heredado un archivo de compilación de ant, pero ahora necesitamos implementarlo tanto en sistemas de 32 bits como de 64 bits.

Los bits que no son Java se hacen con GNUMakefiles donde simplemente llamamos uname para obtener la información. ¿Hay alguna manera similar o incluso más fácil de imitar esto con la hormiga?

Publicado el 20/10/2008 a las 15:09
por usuario
En otros idiomas...                            


7 respuestas

votos
3

Simplemente puede pasar un parámetro al archivo de compilación con el valor que desee. Por ejemplo, si tu objetivo es dist:

ant -Dbuild.target=32 dist

o

ant -Dbuild.target=64 dist

y luego en su script de compilación Ant, tome diferentes acciones dependiendo del valor de la ${build.target}propiedad (también puede usar condiciones para establecer un valor predeterminado para la propiedad si no está configurado).

O bien, puede verificar el valor de las propiedades integradas del sistema , como ${os.arch}.

Respondida el 20/10/2008 a las 15:21
fuente por usuario

votos
0

os.arch no funciona muy bien, otro enfoque es preguntar a la JVM, por ejemplo:

    ~ $ java -d32 prueba
    Lun jun 04 07:05:00 CEST 2007
    ~ $ echo $?
    0
    ~ $ java -d64 prueba
    La ejecución de una JVM de 64 bits no es compatible con esta plataforma.
    ~ $ echo $?
    1

Eso tendría que estar en un guión o en un envoltorio.

Respondida el 20/10/2008 a las 15:25
fuente por usuario

votos
0

Suponiendo que está utilizando ANT para crear aplicaciones Java, ¿por qué debería saber si se trata de un arco de 32 bits o de 64 bits? Siempre podemos pasar parámetros a las tareas de hormiga. 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 interesante publicación http://forums.sun.com/thread.jspa?threadID=5306174 .

Respondida el 20/10/2008 a las 15:26
fuente por usuario

votos
10

puede obtener las propiedades del sistema java ( http://java.sun.com/javase/6/docs/api/java/lang/System.html#getProperties () ) de hormiga con $ {os.arch}. otras propiedades de interés podrían ser os.name, os.version, sun.cpu.endian y sun.arch.data.model.

Respondida el 20/10/2008 a las 15:35
fuente por usuario

votos
11

Tarde a la fiesta, pero qué diablos ...

$ {} Os.arch sólo le dice si la JVM es de 32/64-bit. Puede 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>

EDIT: Como @GreenieMeanie señaló, esto requiere la biblioteca ant-contrib de ant-contrib.sourceforge.net

Respondida el 17/01/2011 a las 01:22
fuente por usuario

votos
1

Por cierto, el os.arch (propiedad arco de la etiqueta OS) Tengo para Linux de 64 bits era amd64.

Respondida el 17/02/2011 a las 00:10
fuente por usuario

votos
7

Aquí es una respuesta que funciona (he probado en Kubuntu 64, Debian 32, Windows 2000 y Windows XP) sin la necesidad de dependencias ANT externos 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$"/>
        </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>
Respondida el 23/01/2012 a las 15:04
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more