LINUX.ORG.RU

Выполнить скрипт\собрать библиоткеку xerces


0

0

Здраствуйте!

Пытаюсь собрать библиотеку Xerces2.8 из исходников.

в документации сказано, что нужно запускать скрипт runConfigure с определенными ключами, например так (из текущего каталога):

./runConfigure -plinux -cgcc -xg++

что задает целевую платформу Linux, использовать gcc в качетсве С компилятора и g++ в качестве С++ компилятора.

но не тут-то было. Дело в том, что это самый скрипт runConfigure написан на таком-то странном языке, немного отличающийся от обычных bash скриптов. В этом скрипте есть определение функции usage(), которая выводит информации об использовании данного скрипта (ключи)

usage() { echo "...." ... и так далее.

Так вот, мой bash ругается на объявление этой самой usage(), мол, неизвестная команда. (Для этого использовал bash --verbose ./runConfigure)

Также использовал другие интерпретаторы sh, bsh, zsh, tcsh, csh - нет результата.

Да, я новичок в Линуксе, использую дистрибутив Mandriva 2008.0.

Планирую разрабатывать софт под Линукс, а то все Windows, да Windows. Точнее портирую одну программу, написанную на С++(Windows). ДА, на Mandriva не было компилятора C++ - g++, пришлось собирать его руками - собрал и установил:) Даже работает. Я несколько программ им уже скомпилировал.

Основной мой вопрос касается скрипта: Таким его интерпретатором запускать?

Вот начало злополучного скрипта: #!/bin/sh # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # # # $Id: runConfigure 570389 2007-08-28 11:52:07Z cargilld $ #

# # runConfigure: # This script will run the "configure" script for the appropriate # platform. Only supported platforms are recognized. # # The following variables are defined and exported at the end of this # script. # # THREADS # BITSTOBUILD # TRANSCODER # MESSAGELOADER # NETACCESSOR # CC # CXX # CXXFLAGS # CFLAGS # LDFLAGS # LIBS #

usage() { echo "runConfigure: Helper script to run \"configure\" for one of the supported platforms" echo "Usage: runConfigure \"options\"" echo " where options may be any of the following:" echo " -p <platform> (accepts 'aix', 'beos', 'linux', 'freebsd', 'netbsd', 'solaris', 'hp-10', 'hp-11', 'openserver', 'unixware', 'os400', 'os390', 'irix', 'ptx', 'tru64', 'macosx', 'cygwin', 'qnx', 'interix', 'mingw-msys') [required; no default]" echo " -c <C compiler name> (e.g. gcc, cc, xlc_r, qcc, icc, icpc or ecc) [default is make default; cc for gnu make]" echo " -x <C++ compiler name> (e.g. g++, CC, aCC, xlC_r, xlC_rv5compat, QCC, icc, icpc or ecc) [default is make default; g++ for gnu make]" echo " -d (specifies that you want to build debug version) [default: no debug]" echo " -m <message loader> can be 'inmem', 'icu', 'MsgFile' or 'iconv' [default: inmem]" echo " -n <net accessor> can be 'fileonly', 'libwww', 'socket', 'winsock' or 'native' [default: socket]" echo " -t <transcoder> can be 'icu', 'Iconv400', 'Uniconv390', 'Win32', 'IconvFBSD', 'IconvGNU' or 'native' [default: native]" echo " -r <thread option> can be 'pthread' or 'dce' (AIX, HP-11, and Solaris) or 'sproc' (IRIX) or 'none' [default: pthread]" echo " -s (specifies that you want to build static libraries) [default: shared]" echo " -b <bitsToBuild> (accepts '64', '32') [default: 32]" echo " -l <extra linker options>" echo " -z <extra compiler options>" echo " -P <install-prefix>" echo " -C <any one extra configure options>" echo " -h (get help on the above commands)" }

ERROR_EXIT_CODE=1

if test ${1}o = "o"; then usage exit ${ERROR_EXIT_CODE} fi

if test ${XERCESCROOT}o = "o"; then echo ERROR : You have not set your XERCESCROOT environment variable echo Though this environment variable has nothing to do with creating echo makefiles, this is just a general warning to prevent you from echo pitfalls in future. To use this script other than for -h output please echo set an environment variable called XERCESCROOT to indicate where you echo installed the XERCES-C files, and run this command again to proceed. echo See the documentation for an example if you are still confused. if test $1 != "-h"; then exit ${ERROR_EXIT_CODE} fi echo fi

if test $1 = "-h"; then usage exit ${ERROR_EXIT_CODE} fi

# Set up the default values for each parameter debug=off # by default debug is off transcoder=native # by default use native transcoder msgloader=inmem # by default use inmem message loader netaccessor= # the default is platform-dependant thread=pthread # by default use POSIX threads configureoptions="" bitsToBuild=32 # by default 32 bit build assumed libtype=shared # by default build shared libraries

# Check the command line parameters if test -x /usr/bin/getopt -o -x bin/getopt; then # # os400 Users will need to comment out the next line. getoptErr=`getopt p:c:x:dm:n:t:r:sb:l:z:P:C:h $*` if [ $? != 0 ] then usage exit ${ERROR_EXIT_CODE} fi # Now get the command line parameters set -- `getopt p:c:x:dm:n:t:r:sb:l:z:P:C:h $*` while [ $# -gt 0 ] do case $1 in -p) platform=$2; shift 2;;

-c) ccompiler=$2; shift 2;;

-x) cppcompiler=$2; shift 2;;

-d) debug=on; shift;;

-m) msgloader=$2; shift 2;;

-n) netaccessor=$2; shift 2;;

-t) transcoder=$2; shift 2;;

-r) thread=$2; shift 2;;

-s) libtype=static; shift;;

-b) bitsToBuild=$2; shift 2;;

-z) compileroptions="$compileroptions $2"; shift 2;;

-l) linkeroptions="$linkeroptions $2"; shift 2;;

-P) configureoptions="$configureoptions --prefix=$2"; shift 2;;

-C) configureoptions="$configureoptions $2"; shift 2;;

-h) usage exit ${ERROR_EXIT_CODE};;

--) shift; break;;

*) echo "unknown option $1" usage exit ${ERROR_EXIT_CODE};; esac done

else

Собирать руками в приличных дистрибутивах -- моветон. Соответственно, надо было получше посмотреть в репозитории, прежде чем компилировать g++ руками.

Xerces, наверняка, тоже есть в репозитории. Заголовочные файлы лежат в пакете вида xerces*-devel или libxerces*-devel.

Ну и по теме: обнови баш, он должен бы понимать такие конструкции.

О! Вот ещё: проверь, что в том файле разделители строки стоят по-юниксному, а не CRLF как в виндо-досе.

gaa ★★
()

Читать не пробовали?

:~[1]$ ./runConfigure -plinux -cgcc -xg++
ERROR : You have not set your XERCESCROOT environment variable
Though this environment variable has nothing to do with creating
makefiles, this is just a general warning to prevent you from
pitfalls in future. To use this script other than for -h output please
set an environment variable called XERCESCROOT to indicate where you
installed the XERCES-C files, and run this command again to proceed.
See the documentation for an example if you are still confused.

Сделать:
$export XERCESCROOT=`pwd`
$cd src/xercesc
$./runConfigure -plinux -cgcc -xg++

gena2x ★★★
()
Ответ на: комментарий от gena2x

переменную XERCESROOT я устанавливал. Дело не в этой переменной. До проверки переменной XERCESROOT дело не доходит.

Скрипт сразу гаркается на usage().... Дело в bash или в разделителях строк. Буду проверять.

GhostPPP
() автор топика
Ответ на: комментарий от GhostPPP

вот, что собственно выводится на экран в моем случае:

[peter@localhost xercesc]$ ./runConfigure bash: ./runConfigure: /bin/sh^M: bad interpreter: No such file or directory [peter@localhost xercesc]$ sh sh-3.2$ ./runConfigure sh: ./runConfigure: /bin/sh^M: bad interpreter: No such file or directory sh-3.2$ exit exit [peter@localhost xercesc]$

да, использую версию bash 3.2.17(2)-release sh версия 3.2, как видно из текста выше

GhostPPP
() автор топика
Ответ на: комментарий от gaa

а вот g++ (или С++) в репозитарии не было, как нет и сейчас.

Xerces тоже нет в репозитарии.

попробую еще bash3.2 скачать, скомпилировать, установить отдельный каталог, потом попробовать

GhostPPP
() автор топика
Ответ на: комментарий от GhostPPP

вот описание. если по буржуински не понимаешь просто выполни эту команду -> []cat <infile> | tr -d ``\r'' > <outfile>

6.22 Trying to install snort it says: ``bad interpreter: No such file or directory''

Usually this error comes from editing files on Windows machines. Often it shows up on the ./configure step. The configure script should be looking for the /bin /sh shell as its interpreter. If /bin/sh doesn't exist then you'll get this error. Check that whatever comes after the #! on the first line of configure is actually there.

If the file has been edited on a Windows machine it can sometimes Add CR/LF (VM) characters on the end of each line, so #!/bin/sh becomes #!/bin/shVM and as the ctrl-v/ctrl-m characters are special, and hidden by default on most editors, it can create a really hard to find problem. To remove the extra CR characters that UNIXish machines don't like, simply use the dos2unix command:

* []dos2unix <infile> <outfile>

If your OS doesn't have dos2unix, then you can use:

* []cat <infile> | tr -d ``\r'' > <outfile>

anonymous
()
Ответ на: комментарий от anonymous

./runConfigure:

cat runConfigure | tr -d ``\r'' > pisdezConfigure mv pisdezConfigure runConfigure

вот так;)

anonymous
()
Ответ на: комментарий от GhostPPP

Скачал bash отсюда http://ftp.gnu.org/gnu/bash/bash-3.2.tar.gz

Скомпилировал, установил в --prefix=/home/peter/build/bash-install
--exec-prefix=/home/peter/build/ebash-install

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

НО, установился сам bash в /home/peter/build/ebash-install/bin/bash.

Так что теперь если делаю:
[peter@localhost bin]$ bash --version
GNU bash, version 3.2.17(2)-release (i586-mandriva-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.

Вызывается bash из дистрибутива Mandriva.
А если запускаю bash из /home/peter/build/ebash-install/bin/bash
то запускается мой скомпилированный bash (что видно по --version),

[peter@localhost bin]$ ./bash --version
GNU bash, version 3.2.0(1)-release (i686-pc-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc. 

Теперь делаю так:
[peter@localhost bin]$ [peter@localhost xercesc]$ /home/peter/build/ebash-install/bin/bash ./runConfigure --help
: command not founde 22:
: command not founde 43:
'/runConfigure: line 44: syntax error near unexpected token `
'/runConfigure: line 44: `usage()
[peter@localhost xercesc]$ /home/peter/build/ebash-install/bin/bash --version
GNU bash, version 3.2.0(1)-release (i686-pc-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.
[peter@localhost xercesc]$ bash --version
GNU bash, version 3.2.17(2)-release (i586-mandriva-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc. 

То есть и скомпилированный мной bash выдает ошибку! В чем грабли не пойму! Разве что с переводами строк надо попробывать!


GhostPPP
() автор топика
Ответ на: комментарий от GhostPPP

Ха, понял - поменяй первую строчку в #!/bin/sh на #!/bin/bash.

Для того, чтобы сконвертить концы строк есть команда dos2unix.

Проверить что концы строк правильные можно так:

Это unix:
:~/Compile/xerces-c-src_2_8_0/src/xercesc$ cat runConfigure | hexdump -c|head -1
0000000 # ! / b i n / s h \n # \n # L i

Это DOS:
:~/Compile/xerces-c-src_2_8_0/src/xercesc$ cat runConfigure | hexdump -c|head -10000000 # ! / b i n / s h \r \n # \r \n #


$dos2unix runConfigure.sh

gena2x ★★★
()
Ответ на: комментарий от gena2x

Всем спасибо!

Проблема была тривиальной - переводы конца строк были в Windows-формате. И первую строчку менять не пришлось. Исходники Xerces я брал из архива, скачанного полгода назад. А когда качал Xerces мне предлагали на выбор - или Windows или Unix формат перевода строк. Тогда я был на винде и естественно выбрал win.

GhostPPP
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.