В самом начале хочу заметить что я не занимаюсь языком C++
В время сборки c++ получаюсь ошибки для разрешеня которых мне не хватаеть знаний. Я много работал в c++ но это было ещё в QNX 4.*. Так то что представляю касаеться языков:
c, ada, gfortran и objc.
Эсли бы удалось сделать c++ 4.* тогда можна бы заняться компилятором java и языка d.
То что тепер представляю это состаяние на сегодня.
С времён когда я начинал много изменилось и прежде всего ест значительно проще построит компилятор языка c под QNX.
Источники я беру по адресу:
ftp://gcc.gnu.org/pub/gcc/releases/
или
ftp://gcc.gnu.org/pub/gcc/snapshots/
можна использовать всё или если нас не интересует к примеру ada и java то нужны только gcc-core-* и тот язык который нас интересует.
Я всё делаю в каталоге /src
/src/gcc-4.2.0
И ёще одно сам компилятор написан в c и встаёт вопрос какой компилятор использовать ? Можно пробовать qcc но естественно 3.3.5. Я использую всегда предудушую скомпилированную gcc
Дело ещё в том что в принципе компиляцию надо делат используя bootstrap. Это ведёть к тому что процес проводиться три раза. Сначала стоиться xgcc - это новый компилятор который называеться xgcc чтобы отличить его от gcc который был использован.
И тот же xgcc используеться два раза для построения компилятора. И затем сравниваеться эти две постройки.
Эсли совподають тогда процесс идёт далше и строиться библётеки и другое.
В случае языка ada не можна использовать bootstrap.
Изменения:
1. на верхним уровне я делаю изменения в:
libtool.m4
*qnx* | *nto*)
lt_cv_deplibs_check_method=pass_all
;;
# This must be Linux ELF.
linux-gnu*)
lt_cv_deplibs_check_method=pass_all
;;
===========================
ltcf-cxx.sh
nto-qnx*)
ld_shlibs=yes
;;
*)
# FIXME: insert proper C++ library support
ld_shlibs=no
;;
======================
ltconfig
*nto* | *qnx*)
version_type=linux
need_lib_prefix=no
need_version=no
library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so${major} ${libname}.so'
soname_spec='${libname}${release}.so$major'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=no
hardcode_into_libs=yes
dynamic_linker='ldqnx.so'
;;
*)
dynamic_linker=no
;;
esac
====================================
ltmain.sh
qnx)
major=".$current"
versuffix=".$current"
;;
sunos)
major=".$current"
versuffix=".$current.$revision"
;;
............................
каталог libiberty
в getpagesize.c
#endif /* GNU_OUR_PAGESIZE */
/*
int
getpagesize (void)
{
return (GNU_OUR_PAGESIZE);
}*/
#ifdef __QNXNTO__
int
getpagesize(void)
{
return (int)sysconf(_SC_PAGESIZE);
}
#endif
===============================
И саме главное в
gcc/config/i386
надо поменять nto.h и t-nto
nto.h
.............................
/* Definitions for Intel 386 running QNX/Neutrino.
Copyright (C) 2002, 2003 Free Software Foundation, Inc.
This file is part of GCC.
GCC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GCC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#undef DEFAULT_PCC_STRUCT_RETURN
#define DEFAULT_PCC_STRUCT_RETURN 1
#undef TARGET_VERSION
#define TARGET_VERSION fprintf (stderr, " (QNX/Neutrino/i386 ELF)"[img]http://qnx.org.ru/components/minibb/img/smilies/wink.gif[/img];
#define HANDLE_PRAGMA_PACK_PUSH_POP 1
/* Allow stabs and dwarf, and make stabs the default for Neutrino */
#undef PREFERRED_DEBUGGING_TYPE
#define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
#undef DBX_REGISTER_NUMBER
#define DBX_REGISTER_NUMBER(n)
(TARGET_64BIT ? dbx64_register_map[n] : svr4_dbx_register_map[n])
/* When generating stabs debugging, use N_BINCL entries. */
#define DBX_USE_BINCL
/* Make LBRAC and RBRAC addresses relative to the start of the
function. The native Solaris stabs debugging format works this
way, gdb expects it, and it reduces the number of relocation
entries. */
#define DBX_BLOCKS_FUNCTION_RELATIVE 1
#undef TARGET_OS_CPP_BUILTINS
#define TARGET_OS_CPP_BUILTINS()
do
{
builtin_define_std ("__X86__"[img]http://qnx.org.ru/components/minibb/img/smilies/wink.gif[/img];
builtin_define_std ("__QNXNTO__"[img]http://qnx.org.ru/components/minibb/img/smilies/wink.gif[/img];
builtin_define_std ("__QNX__"[img]http://qnx.org.ru/components/minibb/img/smilies/wink.gif[/img];
builtin_define_std ("__ELF__"[img]http://qnx.org.ru/components/minibb/img/smilies/wink.gif[/img];
builtin_define_std ("__LITTLEENDIAN__"[img]http://qnx.org.ru/components/minibb/img/smilies/wink.gif[/img];
builtin_assert ("system=qnx"[img]http://qnx.org.ru/components/minibb/img/smilies/wink.gif[/img];
builtin_assert ("system=qnxnto"[img]http://qnx.org.ru/components/minibb/img/smilies/wink.gif[/img];
builtin_assert ("system=nto"[img]http://qnx.org.ru/components/minibb/img/smilies/wink.gif[/img];
builtin_assert ("system=unix"[img]http://qnx.org.ru/components/minibb/img/smilies/wink.gif[/img];
builtin_assert ("system=posix"[img]http://qnx.org.ru/components/minibb/img/smilies/wink.gif[/img];
}
while (0)
#undef THREAD_MODEL_SPEC
#define THREAD_MODEL_SPEC "posix"
#ifdef CROSS_COMPILE
#define SYSROOT_SUFFIX_SPEC "x86"
#endif
#undef CPLUSPLUS_CPP_SPEC
#define CPLUSPLUS_CPP_SPEC
"-nostdinc -nostdinc++
-isystem /usr/qnx630/target/qnx6/usr/include/c++/3.3.5
%(cpp_cpu)
%{posix:-D_POSIX_SOURCE}"
#undef CPP_SPEC
#define CPP_SPEC
"-idirafter /usr/qnx630/target/qnx6/usr/include
-isystem /usr/qnx630/target/qnx6/usr/include
%(cpp_cpu) %{posix:-D_POSIX_SOURCE}"
#undef STARTFILE_SPEC
#define STARTFILE_SPEC
"%{!shared:
%{!symbolic:
%{pg:/usr/qnx630/target/qnx6/x86/lib/mcrt1.o%s}
%{!pg:%{p:/usr/qnx630/target/qnx6/x86/lib/mcrt1.o%s}
%{!p:/usr/qnx630/target/qnx6/x86/lib/crt1.o%s}}}}
/usr/qnx630/target/qnx6/x86/lib/crti.o%s
%{fexceptions: /usr/qnx630/target/qnx6/x86/lib/crtbegin.o%s}
%{!fexceptions: /usr/qnx630/target/qnx6/x86/lib/crtbegin.o}"
#undef ENDFILE_SPEC
#define ENDFILE_SPEC
"%{fexceptions: /usr/qnx630/target/qnx6/x86/lib/crtend.o%s}
%{!fexceptions: /usr/qnx630/target/qnx6/x86/lib/crtend.o}
/usr/qnx630/target/qnx6/x86/lib/crtn.o"
#undef LINK_SPEC
#define LINK_SPEC
"%{h*} %{v:-V}
%{b} %{Wl,*:%*}
%{static:-dn -Bstatic}
%{shared:-G -dy -z text}
%{symbolic:-Bsymbolic -G -dy -z text}
%{G:-G}
%{YP,*}
%{!YP,*:%{p:-Y P,/usr/qnx630/target/qnx6/x86/lib}
%{!p:-Y P,/usr/qnx630/target/qnx6/x86/lib}}
-L /usr/qnx630/target/qnx6/x86/lib
-L /usr/qnx630/target/qnx6/x86/usr/lib
-L /usr/qnx630/target/qnx6/x86/opt/lib
%{Qy:}
%{!Qn:-Qy}
-b elf32-i386 -m i386nto
%{!shared: --dynamic-linker /usr/lib/ldqnx.so.2}"
#undef LIB_SPEC
#define LIB_SPEC "
%{shared:-lc}
%{!shared:%{!symbolic:-lc -dn -Bstatic -lc}}"
#undef SIZE_TYPE
#define SIZE_TYPE "unsigned int"
#undef PTRDIFF_TYPE
#define PTRDIFF_TYPE "int"
#undef WCHAR_TYPE
#define WCHAR_TYPE "unsigned int"
#undef WCHAR_TYPE_SIZE
#define WCHAR_TYPE_SIZE BITS_PER_WORD
#define NO_IMPLICIT_EXTERN_C 1
=====================================
t-nto
...........................
T_CFLAGS = -D__QNXTARGET__
CRTSTUFF_T_CFLAGS = -fPIC -fno-omit-frame-pointer
TARGET_LIBGCC2_CFLAGS = -fPIC -fexceptions
FIXPROTO_DEFINES = -D__QNX__ -D__QNXNTO__ -D__X86__ -D__GNUC__ -D__LITTLEENDIAN__
EXTRA_PARTS = crtbegin.o
===================================
Компиляцию яведу используя сначала build-ntox86.nto
который вызываеть build-nto
build-ntox86.nto
.............................................
#!/bin/sh
target=ntox86 ./build-nto
=================================
build-nto
.............................................
#!/bin/sh
basedir=`pwd`
if [ -z "$target" ]; then
echo "Don't run this script without setting target!"
exit 1
fi
case "$target" in
nto*) dir=/usr/local ;;
*) dir=/opt/QNXsdk/host/qnx6/x86/usr ;;
esac
rm -rf nto/$target
mkdir -p nto/$target
cd nto/$target
#export CC="env QCC_CONF_PATH=$QCC_CONF_PATH QNX_TARGET=$QNX_TARGET QSSL_TARGET=$QNX_TARGET qcc -Vgcc_ntox86"
export ADAC=/usr/local/bin/gcc
#export CC="qcc -V3.3.1,gcc_ntox86"
CXX="qcc -V3.3.5,gcc_ntox86"
CC="gcc -v -save-temps"
CPP="gcc -E"
#export CFLAGS="-O2"
CFLAGS="-save-temps -g -O2"
LIBCFLAGS="-g -O2"
LIBCXXFLAGS="-g -O2 -fno-implicit-templates"
#export CC="qcc"
LDFLAGS="-Wl,-s"
if $basedir/configure
--srcdir=$basedir
--program-suffix=4.2.0
--enable-version-specific-/">