Ada_Ru форум

Обсуждение языка Ада

ю ЙЮЙ РСР Я ОПЕОПНЖЕЯЯНПНЛ?

Оставить новое сообщение

Сообщения

Литягин Александр Владимирович
ю ЙЮЙ РСР Я ОПЕОПНЖЕЯЯНПНЛ?
2005-07-27 08:17:47

бЯЕЛ ДЮПНБЮ.

ЕЯКХ УРН ЛЕМЪ Х ОНЛМХР, РН Ъ БЯЕ РЮЙ ФЕ РНЙЮ СВСЯЭ.

МЕДЮБМЮ ОНОПНАНБЮК Б GPS ЯЙНЛОХКХРЭ ОПНЦС testgtk- ДЕЛЙС ХГ gtkada2.0. Х НМЮ АКЮЦЮОЮКСВМЮ ГЮОМСКЮЯЭ МЮ ТЮИКЕ view_gl.adb - ЕЦН МЕАСКН ХАН НМ ДНКФЕ ОЮКСВЮРЭЯЪ ОПЕОПНЖЕЯХМЦНЛ ХГ view_gl.gpb. ЕРН АКЮЦНОНКСВМН

ОПНХЯУНДХР ЕЯКХ ЙНЛОХКХРЭ БЯЕ ВЕПЕГ make ТЮИК. МН ЛНЕ МЕНЙПЕОЬЕЕ

ЯНГМЮМХЕ БНЯЯРЮЕР ОПНРХБ ЕРНЦН АЕЯВЕКНБЕВМЮЦН ОНДУНДЮ.

бНОПНЯ : Б юДЕ ЕЯРЭ ЯРЮМДЮПРМШИ ОПЕОПНЖЕЯНП ДКЪ СЯКНБМНИ ЙНЛОХКЪЖХХ? Ъ МЕМЮЬЕК МЮ ЕРС РЕЛС Б ДНЙЕ МХВЕЦН(ЛНФЕ ОКНУН ХЯЙЮК?). еЯКХ МЕРС РН ЙЮЙ ЯНАЯМН ДЕКЮРЭ ЙНЛОХКЪЖХЧ СЯКНБМСЧ ЯХКЮЛХ РНЙЮ ЙНЛОХКЕПЮ? ЕРН БНАВЕ БНГЛНФМН?

Hello alexraynepe,

 

Wednesday, July 27, 2005, 11:17:47 AM, you wrote:

 

Всем дарова.

если хто меня и помнит, то я все так же тока учусь.

недавна попробовал в GPS скомпилить прогу testgtk- демку из gtkada2.0. и она благапалучна запнулась на файле view_gl.adb - его небуло ибо он долже палучаться препроцесингом из view_gl.gpb. ето благополучно происходит если компилить все через make файл. но мое неокрепшее сознание восстает против етого бесчеловечнаго подхода.

Вопрос : в Аде есть стандартный препроцесор для условной компиляции? я ненашел на ету тему в доке ничего(може плохо искал?). Если нету то как собсно делать компиляцию условную силами тока компилера? ето вобче возможно?

 

Препроцессор вроде не входит в стандарт Ada, но в поставке GNAT есть gnatprep - препроцессор для Ады. Поддерживает простые выражения

 

#if expression [then]

lines

#elsif expression [then]

lines

#elsif expression [then]

lines

...

#else

lines

#end if;

 

см. GNAT User's Guide для уточнения

 

Также можешь обратить внимание на файлы проектов (GNAT Project Manager, см.там же))

 

--

Best regards,

Vladyslav

On Wed, Jul 27, 2005 at 01:21:58PM +0300, Vladyslav Kozlovskyy wrote:

Hello alexraynepe,

 

Wednesday, July 27, 2005, 11:17:47 AM, you wrote:

 

Вопрос : в Аде есть стандартный препроцесор для условной компиляции? я ненашел на ету тему в доке ничего(може плохо искал?). Если нету то как собсно делать компиляцию условную силами тока компилера? ето вобче возможно?

 

Препроцессор вроде не входит в стандарт Ada, но в поставке GNAT есть gnatprep - препроцессор для Ады. Поддерживает простые выражения

 

 

Более распространенной практикой IMHO, чем использование

нестандартных препроцессоров, является написание

альтернативных реализаций, для общих спецификаций.

Таким образом, все тексты остаются в стандарте Ада,

но на этапе сборки выбирается нужный.

 

Следовательно с ними можно работать, например утилитами

на ASIS, форматировщиками или другими инструментами

понимающими язык Ада, а вот с файлами со всякими

директивами препроцессора уже не получится.

 

--

Maxim Reznik

teplouhov@... wrote:

 

Кстати в 3.14/3.15 уже было что-то для проектов?

 

Что-то было в 3.15p. Но очень мало. С тех пор много воды утекло, GNAT Project Files является одним из ключевых моментов в рекламе GNAT-а. :)

Однако, использовать то, что существует в свободном доступе (предел - GCC 3.4.4) для более-менее навороченных проектов может оказаться не реально.

Я наткнулся на косяк с проектами библиотек, когда одна библиотека использует другую, то по мнению GNAT-а, всё содержимое используемой библиотеки необходимо принепременно засунуть в использующую.

 

Я тут пытался один проект откомпилить под виндами,

дак эти приколисты файл который компилирует написали

на чем-то вроде перла на ~10 экранов(естессно в линуксе-то

он стандартно есть, а где взять его для виндов так и не написали ;) ), причем так завернуто, что я сходу так и не понял чего он им

вообще запускает :)

 

Странновато это... Обычно в Linux-е используют AutoTools, где есть сгенерированный configure и куча создаваемых им Makefile-ов.

 

PS Я вообще смотрю наверно список "как не надо делать" был

бы даже полезней стандарта ;)

 

"Полный комплект" стандарта как раз и включает:

 

Reference Manual (RM) - собственно стандарт

Rationale - разъяснения что по чём

Quality and Style (Q&S) - как раз список чего делать не надо

On Wed, 27 Jul 2005 17:50:51 +0300, Maxim Reznik <reznikmm@...> wrote:

 

On Wed, Jul 27, 2005 at 01:21:58PM +0300, Vladyslav Kozlovskyy wrote:

Wednesday, July 27, 2005, 11:17:47 AM, you wrote:

 

> Вопрос : в Аде есть стандартный препроцесор для условной компиляции? я

> ненашел на ету тему в доке ничего(може плохо искал?). Если нету то как

> собсно делать компиляцию условную силами тока компилера? ето вобче

> возможно?

 

Препроцессор вроде не входит в стандарт Ada, но в поставке GNAT есть

gnatprep - препроцессор для Ады. Поддерживает простые выражения

 

Во блин. Я все думал, где я видел этот изврат, а оно оказывается еще

и в поставке... Этакий комплект с генератором глюков, чтобы не скучно

наверно было, в комплект к отладчику - чтобы без дела не валялся ;)))

(не, если осторожно то наверно можно, но ведь многим только дай...

Я тут какой-то исходник смотрел, дак так и не понял в чем разница от Ц ;) )

 

 

 

Более распространенной практикой IMHO, чем использование

нестандартных препроцессоров, является написание

альтернативных реализаций, для общих спецификаций.

Таким образом, все тексты остаются в стандарте Ада,

но на этапе сборки выбирается нужный.

 

Кстати в 3.14/3.15 уже было что-то для проектов?

 

Я тут пытался один проект откомпилить под виндами,

дак эти приколисты файл который компилирует написали

на чем-то вроде перла на ~10 экранов(естессно в линуксе-то

он стандартно есть, а где взять его для виндов так и не написали ;) ),

причем так завернуто, что я сходу так и не понял чего он им

вообще запускает :)

 

Остальное вроде было написано боле-мене культурно - несколько

каталогов с разными вариантами файлов, на которые судя по всему

устанавливались пути в зависимости от варианта компиляции этим

монстрофайлом перед запуском компилятора, по крайней мере если

все скопировать руками в один каталог то он даже пытался компилировать...

 

 

Следовательно с ними можно работать, например утилитами

на ASIS, форматировщиками или другими инструментами

понимающими язык Ада, а вот с файлами со всякими

директивами препроцессора уже не получится.

 

 

Да и вообще это как бы и не правильно, зачем тогда было

весь этот огород с контролем в компиляторе городить, если

одной такой директивой можно глюков наплодить...

 

Vladimir

PS Я вообще смотрю наверно список "как не надо делать" был

бы даже полезней стандарта ;)

 

-- Using Opera's revolutionary e-mail client: http://www.opera.com/m2/

Да и вообще это как бы и не правильно, зачем тогда было

весь этот огород с контролем в компиляторе городить, если

одной такой директивой можно глюков наплодить...

 

Загадочная фраза. Как можно препроцессором "наплодить глюков", которые будут противоречить "огороду с контролем в компиляторе" если на выходе препроцессора должна получаться программа на Аде?

 

ВФ.

препроцессор обычно используют для замены конструкций целиком,

причем все варианты по определению синтаксически правильные,

так что тут никакой дальнейший контроль компилятором уже помоч не может.

 

О каких же глюках Вы говорите? Пока непонятно...

 

ВФ

On Thu, 28 Jul 2005 09:53:09 +0200, Vasiliy Fofanov <fofanov@...> wrote:

 

Да и вообще это как бы и не правильно, зачем тогда было

весь этот огород с контролем в компиляторе городить, если

одной такой директивой можно глюков наплодить...

 

Загадочная фраза. Как можно препроцессором "наплодить глюков", которые

будут противоречить "огороду с контролем в компиляторе" если на выходе

препроцессора должна получаться программа на Аде?

 

препроцессор обычно используют для замены конструкций целиком,

причем все варианты по определению синтаксически правильные,

так что тут никакой дальнейший контроль компилятором уже помоч не может.

 

Vladimir

 

-- Using Opera's revolutionary e-mail client: http://www.opera.com/m2/

On Thu, 28 Jul 2005 12:16:39 +0200, Vasiliy Fofanov <fofanov@...> wrote:

 

препроцессор обычно используют для замены конструкций целиком,

причем все варианты по определению синтаксически правильные,

так что тут никакой дальнейший контроль компилятором уже помоч не может.

 

О каких же глюках Вы говорите? Пока непонятно...

 

Первое что попробуют сделать Ц-ники(да и не только они) - это использовать

препроцессор в Ц-шном стиле вместо generic и тп. (не зря же нагорожен

такой огород с generic пакетами и тп, хотя вполне обходились одними #include

и #define ;) )

 

Ну и читаемость таких исходников как-то не очень(по крайней мере по мне ;) ),

даже не знаю с чем сравнить, разве что с прогой на перле ;) (а в этих местах

это особенно актуально - в отличии от библиотек и тп которые пишутся один

раз разработчиком и почти никогда не меняются, с условной компиляцией и тп

приходится иметь дело уже пользователю)

 

В общем не знаю насколько подобные штуки нужны вообще, но как миниум их

следует рассматривать в одной категории с *unchecked* модулями и тп.

 

Vladimir

 

-- Using Opera's revolutionary e-mail client: http://www.opera.com/m2/

teplouhov@... wrote:

 

Первое что попробуют сделать Ц-ники(да и не только они) - это использовать препроцессор в Ц-шном стиле вместо generic и тп. (не зря же нагорожен такой огород с generic пакетами и тп, хотя вполне обходились одними #include

и #define ;) )

 

Возможно, но я такого никогда не наблюдал.

 

 

В общем не знаю насколько подобные штуки нужны вообще, но как миниум их следует рассматривать в одной категории с *unchecked* модулями и тп.

Для языка стандарта на подобный препроцессор не существует вовсе. А следовательно, он может быть использован только на страх и риск

разработчика без каких-либо гарантий.

 

 

--

Vadim Godunko

Я уже ;) Я тут искал что-то по слову "Ada", дак всяких проектов насмотрелся, сразу подумал что какой-то один из новых языков - извратили так, что с ходу и не узнаешь ;)

 

Видимо, тут самое время привести пример реального кода. Пока мягко говоря не убеждает.

 

А оно после этого может называться программой на Аде? ;)

 

Естественно "программой на Аде" называется результат работы препроцессора.

Довольно интересный юридический прикол - если стандарт не допускает расширений, то похоже что нет...

 

А где Вы извиняюсь увидели "расширение языка"? Попробуйте откомпилировать препроцессорный файл напрямую КОМПИЛЯТОРОМ ЯЗЫКА, и расскажите нам чем это закончилось.

 

ВФ

On Fri, 29 Jul 2005 06:29:13 +0400, Vadim Godunko <vgodunko@...> wrote:

teplouhov@... wrote:

 

Первое что попробуют сделать Ц-ники(да и не только они) - это использовать

препроцессор в Ц-шном стиле вместо generic и тп. (не зря же нагорожен

такой огород с generic пакетами и тп, хотя вполне обходились одними

#include

и #define ;) )

 

Возможно, но я такого никогда не наблюдал.

 

 

Я уже ;) Я тут искал что-то по слову "Ada", дак всяких проектов

насмотрелся, сразу подумал что какой-то один из новых языков - извратили

так, что с ходу и не узнаешь ;)

 

 

В общем не знаю насколько подобные штуки нужны вообще, но как миниум их

следует рассматривать в одной категории с *unchecked* модулями и тп.

 

Для языка стандарта на подобный препроцессор не существует вовсе. А

следовательно, он может быть использован только на страх и риск

разработчика без каких-либо гарантий.

 

А оно после этого может называться программой на Аде? ;)

 

Довольно интересный юридический прикол - если стандарт не допускает

расширений, то похоже что нет... Как это не печально ("ааа, опять не дают!" ;) ),

но похоже для борьбы с криворукими извращенцами довольно полезно - лекции

и проповеди о хорошем стиле до них доходят плохо ;)

 

Vladimir

PS Вот какой-то препроцессор более высокого уровня(хотябы yacc-подобное что-то

или какой-то аналитический препроцессор вроде reduce/rlisp) возможно и был бы полезен,

тк на соответствующих задачах может дать серьезный выигрышь и по скорости,

и по качеству (за счет уменьшения объема кода в несколько раз)... Правда тут наведенных

глюков может быть еще больше - чем умнее программа, тем более навороченные глюки

может наплодить, так что стоит ли подобные вещи пременять(и как именно - всегда ли

нужно прогонять через него программу, либо можно ограничиться только дата-файлами)

это отдельный философский вопрос ;)

 

-- Using Opera's revolutionary e-mail client: http://www.opera.com/m2/

On Fri, 29 Jul 2005 10:33:50 +0200, Vasiliy Fofanov <fofanov@...> wrote:

 

Я уже ;) Я тут искал что-то по слову "Ada", дак всяких проектов

насмотрелся, сразу подумал что какой-то один из новых языков - извратили

так, что с ходу и не узнаешь ;)

 

Видимо, тут самое время привести пример реального кода. Пока мягко говоря

не убеждает.

 

А оно после этого может называться программой на Аде? ;)

 

Естественно "программой на Аде" называется результат работы препроцессора.

 

Довольно интересный юридический прикол - если стандарт не допускает

расширений, то похоже что нет...

 

А где Вы извиняюсь увидели "расширение языка"? Попробуйте откомпилировать

препроцессорный файл напрямую КОМПИЛЯТОРОМ ЯЗЫКА, и расскажите нам чем это закончилось.

 

ну. "В договоре что написано? Программа на Аде? А это что за .... и почему

оно не компилируется..."

 

 

Vladimir

 

-- Using Opera's revolutionary e-mail client: http://www.opera.com/m2/

ну. "В договоре что написано? Программа на Аде? А это что за .... и почему оно не компилируется..."

 

Потому что перед тем как стать программой на Аде это должно быть обработано дополнительной утилитой. Никакого противоречия стандарту нет. Если программа на Аде предоставлена вам в виде скажем zip-архива, является ли это расширением языка? :)

 

ВФ

On Fri, 29 Jul 2005 10:33:50 +0200, Vasiliy Fofanov <fofanov@...> wrote:

 

Я уже ;) Я тут искал что-то по слову "Ada", дак всяких проектов

насмотрелся, сразу подумал что какой-то один из новых языков - извратили

так, что с ходу и не узнаешь ;)

 

Видимо, тут самое время привести пример реального кода. Пока мягко говоря

не убеждает.

 

 

Ну вот например из того что первое под руку попалось - MaRTE OS - внутри там

почти все на Аде(правда с гнусными make файлами ;) ), а в завершение картины

маслом вот такая перловка, которая соответственно все это и собирает...

 

Это хоть и не совсем сама программа, но ошибок на данном этапе может быть

больше всего - компиляцию придется делать пользователю, который первый раз

ее вообще видит, к тому-же тут может что-то и зависеть от конфигурации

системы и структуры каталогов, версии того-же перла и тп...

(хорошо если процедура используется сразу - тогда это приведет сразу к зависанию

и грозит только несколькими часа ковыряния в этом дерьме, но если случайно

прилинкуется редкоиспользуемая процедура от другой платформы то получиться

веселый глюк, который не известно когда выплывит)

 

Кстати, если подобные вещи писать на LUA или AdaScript то читаемость должна

быть получше, может это вариант вместо проектов и make-файлов?

 

==== minstall ====

#!/usr/bin/perl

# -W

# MaRTE OS - Main installation script

use Cwd;

 

# die for wrong path

sub wrong_path_die_error

{

my $msg = shift(@_);

die "&#92;nERROR: $msg&#92;n" .

" Are you sure GNAT 'bin/' directory is in front of your&#92;n" .

" &#92;$PATH environment variable?.&#92;n" .

"&#92;nInstallation aborted.&#92;n";

}

 

# Set $MPATH

$MPATH = cwd;

 

# Welcome

print "&#92;n Welcome to MaRTE OS installation process&#92;n";

print " ========================================&#92;n";

print " Copyright (C) 2005&#92;n" .

" Universidad de Cantabria, SPAIN&#92;n&#92;n";

print

"The installation does not affect any file out of the current&#92;n" .

"directory.&#92;n&#92;n" .

"To perform successfully this installation GNAT version 3.14p, 3.15p or&#92;n" .

"GAP1.0 should be already installed in your system and GNAT 'bin/'&#92;n" .

"directory should be in front of your &#92;$PATH environment variable.&#92;n&#92;n" .

"New &#92;"Linux&#92;" and &#92;"Linux_lib&#92;" architectures only supported for GAP1.0.&#92;n&#92;n";

 

print "Press any key to start the installation..."; <STDIN>;

 

# default values for architecture dependent options

$PENTIUM_TARGET = "TRUE";

$P6_TARGET = "FALSE";

$VIRTUAL_TIMER = "USE_ITIMER";

 

#---------------------------------------------------------------

# Look for GCC and GNAT verions and for GNAT path

printf "&#92;nChecking your GCC and GNAT versions installed...&#92;n";

$gcc_bin_path="";

$gnatmake_bin_path="";

$gnat_libs_path="";

$gcc_version="";

$gnat_version="";

 

open SYS_OUT, "which gcc|";

$gcc_bin_path=<SYS_OUT>;

$gcc_bin_path=~ s/gcc&#92;n//; # remove gcc&#92;n

if ( $gcc_bin_path =~ /: no gcc in &#92;(/ ) {

wrong_path_die_error "No gcc found";

}

close SYS_OUT;

 

open (SYS_OUT, "which gnatmake|");

$gnatmake_bin_path=<SYS_OUT>;

$gnatmake_bin_path=~ s/gnatmake&#92;n//; # remove gnatmake&#92;n

if ( $gnatmake_bin_path =~ /: no gcc in &#92;(/ ) {

wrong_path_die_error "No gnatmake found";

}

close SYS_OUT;

 

open (SYS_OUT, "gcc -v 2>&1|");

@lines = <SYS_OUT>;

foreach $line (@lines) {

if ( $line =~ /Reading specs from (.*)$/ ) {

$gnat_libs_path=$1;

}

if ( $line =~ /^gcc versi.n&#92;s+(&#92;S+)&#92;s+/ ) {

$gcc_version = $1;

}

}

close SYS_OUT;

$gnat_libs_path=~ s/&#92;/specs$//; # remove ending "/specs"

 

open (SYS_OUT, "gnatmake -v 2>&1|");

@lines = <SYS_OUT>;

foreach $line (@lines) {

if ( $line =~ /^GNATMAKE&#92;s+(&#92;S+)&#92;s+/ ) {

$gnat_version = $1;

if ($gnat_version eq "GAP") {

# look for GAP version

$line =~ /^GNATMAKE&#92;s+(GAP [0-9&#92;.]*) /;

$gnat_version = $1;

}

}

}

close SYS_OUT;

printf " Found gcc version:&#92;t&#92;"$gcc_version&#92;"&#92;t(in $gcc_bin_path)&#92;n";

printf " Found gnat version:&#92;t&#92;"$gnat_version&#92;"&#92;t(in $gnatmake_bin_path)&#92;n";

printf " GNAT compiler libraries in:&#92;n $gnat_libs_path&#92;n";

 

if ( !(-e "$gnat_libs_path/adainclude") ) {

wrong_path_die_error "Directory $gnat_libs_path/adainclude doesn't exist";

}

if ( !(-e "$gnat_libs_path/adalib") ) {

wrong_path_die_error "Directory $gnat_libs_path/adalib doesn't exist";

}

 

%gnat_vs_gcc = ("3.13p", "2.8.1",

"3.14p", "2.8.1",

"3.15p", "2.8.1",

"GAP 1.0.0", "3.2.3");

if ($gcc_version ne $gnat_vs_gcc{$gnat_version}) {

wrong_path_die_error "GNAT and gcc versions don't match. Expected gcc version $gnat_vs_gcc{$gnat_version}";

}

 

if ($gnat_version eq "GAP 1.0.0") {

$gnat_version="GAP1.0";

} else {

$gnat_version=~ s/p$//; # remove ending p (3.15p -> 3.15)

}

$GNAT_PATH=$gnat_libs_path;

 

print "Press any key to continue..."; <STDIN>;

 

#--------------------------------------------------------------------

# Ask for target arquitecture

print "&#92;nOn which architecture do you wish to run MaRTE applications?&#92;n" .

" Following options are supported:&#92;n" .

" - x86: x86 bare machine&#92;n" .

" - linux: Linux operating system&#92;n" .

" - linux_lib: Linux operating system (using Linux file system)&#92;n";

do {

print " Please chose your architecture (x86, linux, linux_lib)...";

chop ($ARCHITECTURE = <STDIN>);

if ($ARCHITECTURE eq "x86" || $ARCHITECTURE eq "linux" ||

$ARCHITECTURE eq "linux_lib" ) {

$ok = 1;

} else {

$ok = 0;

print " Valid answers are x86 and linux... Try again.&#92;n";

}

} while (!$ok);

if (($ARCHITECTURE eq "linux" || $ARCHITECTURE eq "linux_lib") &&

$gnat_version ne "GAP1.0") {

die "&#92;"Linux&#92;" and &#92;"Linux_lib&#92;" architectures only supported for GAP1.0.&#92;n&#92;n";

}

 

#-----------------------------------------------------------------------

# Ask architecture dependent options

 

# ARCHITECTURE x86

if ($ARCHITECTURE eq "x86") {

# Ask for the type of the target processor

print "&#92;nDoes your target computer have a Pentium processor or above?&#92;n";

print " If you answer yes the Pentium Time Stamp Counter will be used to&#92;n" .

" measure the time (fast method), if not the PC timers will be used&#92;n" .

" instead (slow method but valid for i386, i486 and Pentiums).&#92;n";

print " (y,N)?";

if (<STDIN> =~ /^[Y,y]/) {

$PENTIUM_TARGET = "TRUE";

 

print "&#92;nDoes your target computer have a P6 processor or above?&#92;n";

print " If you answer yes the Local APIC Timer will be used to implement&#92;n" .

" the system timers (faster and more accurate method), if not the&#92;n" .

" PC timers will be used instead (slow method but valid for i386,&#92;n" .

" i486 and Pentiums).&#92;n";

print " (y,N)?";

if (<STDIN> =~ /^[Y,y]/) {

$P6_TARGET = "TRUE";

}

}

}

 

# ARCHITECTURE linux

if ($ARCHITECTURE eq "linux" || $ARCHITECTURE eq "linux_lib") {

printf " Using standard Linux timers";

$VIRTUAL_TIMER = "USE_ITIMER";

# print "&#92;nDo you have installed High Resolution Timer Linux Kernel Patch&#92;n";

# print " If you have installed High Resolution Time Linux Kernel Patch&#92;n" .

# " you can use it in order to improve timer response&#92;n";

# print " (y,N)?...";

# if (<STDIN> =~ /^[Y,y]/) {

# printf " Using High Resolution Timer Linux Kernel Patch";

# $VIRTUAL_TIMER = "CONFIG_USE_HIGH_RESOLTION_TIMERS";

# } else {

# printf " Using standard Linux timers";

# $VIRTUAL_TIMER = "USE_ITIMER";

# }

}

 

#---------------------------------------------------------------------------

# Generate utilities with default boot parameteres

print "&#92;nGenerating utilities...&#92;n";

system("utils/minstall_scripts $MPATH $GNAT_PATH " .

"192.168.1.1 /export/marte target.domain.name " .

"$PENTIUM_TARGET $P6_TARGET $gnat_version $ARCHITECTURE " .

"$VIRTUAL_TIMER") == 0 or

die "Can't execute 'utils/minstall_scripts'";

 

#---------------------------------------------------------------------------

# Configure architecture specific files and directories

print "&#92;nConfiguring architecture specific files and directories...&#92;n";

system("utils/march_chgs") == 0 or

die "Can't execute 'utils/march_chgs'&#92;n";

 

#---------------------------------------------------------------------------

# Make symbolic links

#print "&#92;nMaking symbolic links...&#92;n";

#system ("utils/mklinks") == 0 or die "Can't make symbolic links";

 

#---------------------------------------------------------------------------

# Compile the kernel and make the auxiliary libraries (libmc, libm, ...)

print "&#92;nCompiling all files (using full optimization options)...&#92;n";

system ("export PATH=&#92;$PATH:$MPATH/utils/; mkall -gnatn -O3 -gnatp -cargs -w") == 0 or

die "Error while making all";

 

#---------------------------------------------------------------------------

# If architecture is "linux" or "linux_lib" nothing more need to be done

if ($ARCHITECTURE eq "linux" || $ARCHITECTURE eq "linux_lib") {

print "&#92;nMaRTE OS installation finished :-)&#92;n";

print "You may want to add &#92;n" .

"$MPATH/utils &#92;n" .

"to your &#92;$PATH environment variable to have direct access to MaRTE&#92;n" .

" tools (mgnatmake, mgcc, mkkernel, mkall, etc.)&#92;n";

exit(0);

}

 

#---------------------------------------------------------------------------

# Ask for boot parameters

print "&#92;nEnter boot parameters...&#92;n";

$ok = 0;

do {

print "HOST IP number (example: 192.69.1.34)...";

chop ($HOST_IP_NUM = <STDIN>);

if ($HOST_IP_NUM =~ /^&#92;d{1,3}&#92;.&#92;d{1,3}&#92;.&#92;d{1,3}&#92;.&#92;d{1,3}$/) {

$ok = 1;

} else {

print "$HOST_IP_NUM doesn't looks like a NUMERIC IP direction... " .

"Try again.&#92;n";

}

} while (!$ok);

 

$ok = 0;

do {

print "Directory to be exported to the target (example: /export/marte)...";

chop ($EXPORTED_DIR = <STDIN>);

if ($EXPORTED_DIR =~ /^&#92;//) {

$ok = 1;

} else {

print "$EXPORTED_DIR should be a absolute path... Try again.&#92;n";

}

} while (!$ok);

 

$ok = 0;

do {

print "TARGET IP name (example: target.ctr.unican.es)...";

chop ($TARGET_IP_DIR = <STDIN>);

if ($TARGET_IP_DIR =~ /(&#92;w&#92;.)+&#92;w/) {

$ok = 1;

} else {

print "$TARGET_IP_DIR doesn't looks like and IP name... Try again.&#92;n";

}

} while (!$ok);

 

#----------------------------------------------------------------------------

# Generate utilities with actual boot parameters

print "&#92;nGenerating utilities...&#92;n";

system("utils/minstall_scripts $MPATH $GNAT_PATH " .

"$HOST_IP_NUM $EXPORTED_DIR $TARGET_IP_DIR " .

"$PENTIUM_TARGET $P6_TARGET $gnat_version $ARCHITECTURE " .

"$VIRTUAL_TIMER") == 0 or

die "Can't execute 'utils/minstall_scripts'";

 

#----------------------------------------------------------------------------

# Create boot floppy

print "&#92;nCreating boot floppy...&#92;n";

if (system("$MPATH/utils/mkbootfloppy") != 0) {

print "&#92;nTry executing 'utils/mkbootfloppy' with superuser privileges&#92;n";

}

 

#----------------------------------------------------------------------------

# Ask user to execute 'mexport'

print "&#92;nIn order to export the directory $EXPORTED_DIR you should &#92;n" .

"execute 'utils/mexport' with superuser privileges &#92;n";

 

#----------------------------------------------------------------------------

print "&#92;nMaRTE OS installation script finished :-)&#92;n";

print " You may want to add &#92;"$MPATH/utils&#92;" &#92;n" .

" to your &#92;$PATH environment variable to have direct access to MaRTE&#92;n" .

" tools (mgnatmake, mgcc, mkkernel, mkall, etc.)&#92;n";

==================

 

 

Vladimir

 

-- Using Opera's revolutionary e-mail client: http://www.opera.com/m2/

teplouhov@... wrote:

 

Кстати, если подобные вещи писать на LUA или AdaScript то читаемость должна быть получше, может это вариант вместо проектов и make-файлов?

 

И всё же это не совсем хороший пример ;)

 

Дело в том, что сборка операционной системы - значительно более сложная задача, чем классическая задача сборки и установки программы.

 

Поэтому для упрощения жизни вполне можно использовать и perl. :)

 

Что же касается использования LUA, AdaScript и ещё чего - либо, то это не есть хорошая идея. В первую очередь из-за значительного снижения уровня переносимости.

 

Те же AutoTools хотя и написаны на perl + shell, но для исполнения сгенерированных ими программ (configure) не требуется ничего более, чем born shell. Это обеспечивает фактически идеальную переносимость, но даже здесь бывают сложности :(

 

GNAT Project files теоретически должны решить все сложности

использования AutoTools. Но, но, но... Есть ещё целый огород вопросов, которые в них не решены. Хотя в общем случае при разработке простой программы (не привязанной непосредственно к платформозависимым

интерфейсам) они годятся как нельзя идеально!

 

 

--

Vadim Godunko

 

 

 

 

Vadim Godunko п©п╦я┬п╣я┌:

 

teplouhov@... wrote:

п я│я┌п╟я┌п╦, п╣я│п╩п╦ п©п╬п╢п╬п╠п╫я▀п╣ п╡п╣я┴п╦ п©п╦я│п╟я┌я▄ п╫п╟ LUA п╦п╩п╦ AdaScript я┌п╬ я┤п╦я┌п╟п╣п╪п╬я│я┌я▄ п╢п╬п╩п╤п╫п╟

п╠я▀я┌я▄ п©п╬п╩я┐я┤я┬п╣, п╪п╬п╤п╣я┌ я█я┌п╬ п╡п╟я─п╦п╟п╫я┌ п╡п╪п╣я│я┌п╬ п©я─п╬п╣п╨я┌п╬п╡ п╦ make-я└п╟п╧п╩п╬п╡?

 

п≤ п╡я│я▒ п╤п╣ я█я┌п╬ п╫п╣ я│п╬п╡я│п╣п╪ я┘п╬я─п╬я┬п╦п╧ п©я─п╦п╪п╣я─ ;)

 

п  я┌п╬ п╪я┐ п╤п╣ п╦ п╫п╣ я─п╟п╠п╬я┌п╟я▌я┴п╦п╧....

 

--

п║ я┐п╡п╟п╤п╣п╫п╦п╣п╪,

п░п╩п╣п╨я│п╣п╧ п╝. пёп╩п╟я│п╣п╡п╦я┤

(A.STAKANOV)

http://www.livejournal.com/users/a_stakanov/

Vladyslav Kozlovskyy wrote:

 

>собсно делать компиляцию условную силами тока компилера? ето вобче >возможно?

 

 

Вот пример на эту тему. Функция возвращает число в формате big endian на всех архитектурах.

 

function Swap_Little_Endian

(S : in Interfaces.Unsigned_16) return Interfaces.Unsigned_16 is

use System;

Big_Endian : constant Boolean := Default_Bit_Order = High_Order_First; begin

if Big_Endian then

return S;

else

return Interfaces.Rotate_Left (S, 8);

end if;

end Swap_Little_Endian;

 

Так как константа Big_Endian может быть вычислена на этапе компиляции, то компилятор

включит код либо после if либо после else не выполняя самой проверки уже известной константы.

Вроде бы это даже в стандарте языка оговаривается. Но что то в ломы сейчас в RM ковыряться.

Новое сообщение:
Страницы: 1

Чтобы оставить новое сообщение необходимо Зарегистрироваться и Войти