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

StackOverflow https://stackoverflow.com/questions/218989

  •  03-07-2019
  •  | 
  •  

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?

¿Fue útil?

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 .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top