Как определить архитектуру сборки (32 бит /64 бит) с помощью ant?
Мы унаследовали файл сборки ant, но теперь его нужно развернуть как на 32-битную, так и на 64-битную системы.
Не-Java-биты выполняются с помощью GNUMakefiles, где мы просто вызываем "uname", чтобы получить информацию. Есть ли подобный или даже более простой способ имитировать это с помощью ant?
Ответы
Ответ 1
вы можете получить свойства системы java (http://java.sun.com/javase/6/docs/api/java/lang/System.html#getProperties()) из ant с помощью ${os.arch}. другими интересными объектами могут быть os.name, os.version, sun.cpu.endian и sun.arch.data.model.
Ответ 2
Поздно к вечеринке, но что за черт...
${os.arch} сообщает только, является ли JVM 32/64 бит. Возможно, вы используете 32-битную JVM на 64-битной ОС. Попробуйте следующее:
<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:
Как отметил @GreenieMeanie, для этого требуется библиотека ant -contrib из ant -contrib.sourceforge.net
Ответ 3
Вот ответ, который работает (я тестировал на Kubuntu 64, Debian 32, Windows 2000 и Windows XP) без необходимости внешних или необязательных зависимостей ANT. Это было основано на ответе @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>
Ответ 4
Вы можете просто передать параметр в файл сборки со значением, которое вы хотите. Например, если ваша цель dist
:
ant -Dbuild.target=32 dist
или
ant -Dbuild.target=64 dist
а затем в Ant build script, выполните различные действия в зависимости от значения свойства ${build.target}
(вы также можете использовать условия, чтобы установить значение по умолчанию для свойства, если оно не установлено).
Или вы можете проверить значение built-in свойства системы, например ${os.arch}
.
Ответ 5
BTW, os.arch(свойство arch тега os), которое я получил для 64-разрядного Linux, было amd64.
Ответ 6
os.arch не работает очень хорошо, другой подход задает JVM, например:
~$ 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
Это должно быть в script или обертке.
Ответ 7
Предполагая, что вы используете ANT для создания Java-приложения, зачем вам нужно знать, является ли это 32-разрядной архитектурой или 64-разрядной? Мы всегда можем передавать параметры в задачи ANT. Более чистым способом было бы программно исправить файл свойств системы, используемый ANT, прежде чем вызывать фактическую сборку. Это интересное сообщение http://forums.sun.com/thread.jspa?threadID=5306174.