[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] Re: Pesky '#define current' in mini-os/sched.h



Samuel Thibault <samuel.thibault@xxxxxxxxxxxx> writes:

> Have you, like in the C example of stubdom/Makefile, propagated
> TARGET_CPPFLAGS, TARGET_CFLAGS, and added a rule like is done for other
> stubdom images in the "minios" paragraph of stubdom/Makefile?

No, I had no idea how to start with this, I stole the various flags
from the output of make c-stubdom and configured ncurses with those.

> That's not how it's supposed to be done. See the Cross-zlib paragraph
> for instance: the cross-zlib target not only configures & builds libz,
> but also installs it, the prefix being properly set during configuration
> into the cross-chain directory.

Oh yes, I copied that, but forgot the install step, because the build
itself was so tedious.

> Ferenc Wagner, le Mon 27 Apr 2009 22:29:02 +0200, a .ANicrit :
>
>> I couldn't track how it's done for libpci & libz for qemu-stubdom
>> (ioemu?) yet.
>
> It's all in stubdom/Makefile: they get installed within the
> cross-root-$(GNU_TARGET_ARCH) hierarchy, where the linker finds it
> thanks to the TARGET_LDFLAGS variable.
>
>> This make magic is somewhat convoluted,
>
> It's no magic, it's makefiles :)

Ok, do I have to extend the # Links section as well?

>> So, where should I add it for proper operation?
>
> Just the same way as zlib & C stubdom examples.

I may be blind, but there's no -l linker option in stubdom/Makefile.

>> /home/wferi/xen/xen-3.3.1/stubdom/mini-os-x86_32-c/mini-os.o: In function 
>> `grub_memalign':
>> /home/wferi/xen/grub2/util/misc.c:263: undefined reference to 
>> `posix_memalign'
>
> It should just be a matter of setting it as an alias for newlib's
> memalign, by adding a macro into newlib/libc/include/malloc.h for
> instance.  Ideally it should be reported to newlib's upstream actually.

Thanks for the tip.

>> /home/wferi/xen/grub2/util/getroot.c:215: undefined reference to `lstat'
>> /home/wferi/xen/xen-3.3.1/stubdom/ncurses-x86_32/ncurses/../ncurses/./tty/lib_tstp.c:159:
>>  undefined reference to `tcgetpgrp'
>> /home/wferi/xen/xen-3.3.1/stubdom/ncurses-x86_32/ncurses/../ncurses/./tty/lib_tstp.c:159:
>>  undefined reference to `getpgrp'
>> /home/wferi/xen/xen-3.3.1/stubdom/ncurses-x86_32/ncurses/../ncurses/./tinfo/lib_kernel.c:143:
>>  undefined reference to `tcflush'
>
> Should be fixed by the patch below.

And thanks for the patch!  Will try once I get a correct build
infrastructure.

>> /home/wferi/xen/xen-3.3.1/stubdom/ncurses-x86_32/ncurses/../ncurses/./tinfo/lib_baudrate.c:244:
>>  undefined reference to `cfgetospeed'
>
> I'm a bit surprised you actually got code using cfgetospeed compiled in
> the miniOS environment.  It's supposed to return something like B9600,
> but that's not defined by newlib!

Yeah, I copied those defines from my libc headers.  Figured I won't
need them after all, as the MiniOS console won't care, so I can stub
them out later.  But wanted a proof of concept first of all.

>> /home/wferi/xen/xen-3.3.1/stubdom/ncurses-x86_32/ncurses/../ncurses/./tinfo/lib_kernel.c:67:
>>  undefined reference to `fpathconf'
>
> Same issue: how did you get that code to compile? _PC_VDISABLE is not
> defined...  I believe you are not using the cross-chain flags.

Hmm, I don't remember hacking around this...

>> /home/wferi/xen/xen-3.3.1/stubdom/ncurses-x86_32/ncurses/../ncurses/./tinfo/access.c:112:
>>  undefined reference to `access'
>> /home/wferi/xen/xen-3.3.1/stubdom/ncurses-x86_32/ncurses/../ncurses/./tinfo/access.c:125:
>>  undefined reference to `access'
>
> Mmmm, the fsif protocol does not provide an access operation to
> implement that properly. You could add a dummy implementation in
> lib/sys.c that just open()/close() it and return proper error codes if
> any and it should be fine for ncurses' use cases.

Thanks, that's about what I expected.  Will do.

Until then, here are my notes from the yesterday session.  If you have
further comments, I'd be glad to hear them.

Thanks,
Feri.

---------------------------------------------------

1. wferi@rs22:~/xen/xen-3.3.1/stubdom/ncurses-x86_32/ncurses$ gcc 
-DHAVE_CONFIG_H -I../ncurses -I. -I. -I../include  -DNDEBUG 
-I/home/wferi/xen/xen-3.3.1/stubdom/cross-root-i686/i686-xen-elf/include/ncurses
 -isystem /home/wferi/xen/xen-3.3.1/stubdom/../extras/mini-os/include 
-D__MINIOS__ -DHAVE_LIBC -isystem 
/home/wferi/xen/xen-3.3.1/stubdom/../extras/mini-os/include/posix -isystem 
/home/wferi/xen/xen-3.3.1/stubdom/../tools/xenstore  -isystem 
/home/wferi/xen/xen-3.3.1/stubdom/../extras/mini-os/include/x86 -isystem 
/home/wferi/xen/xen-3.3.1/stubdom/../extras/mini-os/include/x86/x86_32 -U 
__linux__ -U __FreeBSD__ -U __sun__ -nostdinc -isystem 
/home/wferi/xen/xen-3.3.1/stubdom/../extras/mini-os/include/posix -isystem 
/home/wferi/xen/xen-3.3.1/stubdom/cross-root-i686/i686-xen-elf/include -isystem 
/usr/lib/gcc/i486-linux-gnu/4.3.2/include -isystem 
/home/wferi/xen/xen-3.3.1/stubdom/lwip-x86_32/src/include -isystem 
/home/wferi/xen/xen-3.3.1/stubdom/lwip-x86_32/src/include/ipv4 -I/ho
 me/wferi/xen/xen-3.3.1/stubdom/include  -O1 -fno-omit-frame-pointer 
-fno-optimize-sibling-calls  -m32 -march=i686 -m32 -march=i686 -g 
-fno-strict-aliasing -std=gnu99 -Wall -Wstrict-prototypes -Wno-unused-value 
-Wdeclaration-after-statement   -fno-stack-protector   --param 
max-inline-insns-single=1200 -c ../objects/tty_update.c -o 
../objects/tty_update.o 

That is, both lwip -isystem pathes missed the -x86_32 bit (the original was the 
result
of adapting the zlib cross-compilation stanza in stubdom/Makefile:

NCURSES_URL?=ftp://invisible-island.net/ncurses
NCURSES_VERSION=5.7

[...]

###############
# Cross-ncurses
###############

ncurses-$(NCURSES_VERSION).tar.gz:
        $(WGET) $(NCURSES_URL)/$@

ncurses-$(XEN_TARGET_ARCH): ncurses-$(NCURSES_VERSION).tar.gz
        tar xzf $<
        mv ncurses-$(NCURSES_VERSION) $@

NCURSES_STAMPFILE=$(CROSS_ROOT)/$(GNU_TARGET_ARCH)-xen-elf/lib/libncurses.a
.PHONY: cross-ncurses
cross-ncurses: $(NCURSES_STAMPFILE)
$(NCURSES_STAMPFILE): ncurses-$(XEN_TARGET_ARCH) $(NEWLIB_STAMPFILE)
        ( cd $< && \
          CFLAGS="$(TARGET_CPPFLAGS) $(TARGET_CFLAGS)" CC=$(CC) ./configure 
--prefix=$(CROSS_PREFIX)/$(GNU_TARGET_ARCH)-xen-elf --with-build-cppflags="" 
--with-build-cflags="" --with-build-ldflags="" --with-build-libs="" && \
          $(MAKE) libs && \
          $(MAKE) install.libs )

The --with-build-* options do nothing, so two utilities must be compiled by 
hand.

1b. Fix the two include pathes in stubdom/Makefile:

TARGET_CPPFLAGS += -isystem $(CURDIR)/lwip-x86_32/src/include
TARGET_CPPFLAGS += -isystem $(CURDIR)/lwip-x86_32/src/include/ipv4

(Probably helps after reconfiguration only.)

2. Some other file required renaming the local variable holding the current
screen from 'current' to 'currrent' (cca. 3 occurences) due to some strange
Xen include clash?!

3. 'columns' in the above tty_update.c has a similar problem.  Moving
#include <curses.priv.h> past #include <sys/select.h> solves this, but still 
gives
../ncurses/./tty/tty_update.c:351: warning: implicit declaration of function 
$B!F(Bselect$B!G(B

4. Add to ../ncurses/./tinfo/lib_baudrate.c, above 'static struct speed const 
speeds[] =':

/* Copied from Linux' /usr/include/bits/termios.h, Mini-OS has no support for 
these */
#define  B0     0000000         /* hang up */
#define  B50    0000001
#define  B75    0000002
#define  B110   0000003
#define  B134   0000004
#define  B150   0000005
#define  B200   0000006
#define  B300   0000007
#define  B600   0000010
#define  B1200  0000011
#define  B1800  0000012
#define  B2400  0000013
#define  B4800  0000014
#define  B9600  0000015
#define  B19200 0000016
#define  B38400 0000017

5. Add to the head of ../ncurses/./tinfo/lib_kernel.c:

/* Copied from Linux' /usr/include/bits/termios.h, Mini-OS has no support for 
these */
#define VERASE 2
#define VKILL 3
#define TCIFLUSH        0

Maybe #undef TERMIOS would be better?  This still leaves:
../ncurses/./tinfo/lib_kernel.c:143: warning: implicit declaration of function 
$B!F(Btcflush$B!G(B

6. #include <curses.priv.h> problem in ../ncurses/./tty/lib_twait.c, too.

7. These alone get us a libncurses.a!

8. The 'form' part still does not compile, because the field 'current' in 
../form/form.h
clashes with the #define current at
/home/wferi/xen/xen-3.3.1/stubdom/../extras/mini-os/include/mini-os/sched.h:51:1
This is the same problem as 2., but without an easy fix, as this 'current' 
isn't a
local variable.

9. Actually, deleting #define current get_current() from 
extras/mini-os/include/mini-os/sched.h
made libncurses++.a build, but broke make c-stubdom...  According to Keir 
Fraser, the simplest fix is:

#ifdef __MINIOS__
#define current get_current()
#endif

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.