diff mbox

build: add needed missing libraries libm and librt

Message ID 1328720797-29857-1-git-send-email-roger.pau@entel.upc.edu
State New
Headers show

Commit Message

Roger Pau Monne Feb. 8, 2012, 5:06 p.m. UTC
libm is used in cutils.c, but the library was not specified
when linking some binaries, throwing the following error:

cutils.o: In function `strtosz_suffix_unit':
/home/royger/xen-clean/tools/qemu-xen-dir/cutils.c:354: undefined
reference to `__isnan'
/home/royger/xen-clean/tools/qemu-xen-dir/cutils.c:357: undefined
reference to `modf'
collect2: ld returned 1 exit status

According to modf man page [0], -lm should be used when linking.

librt is used in qemu-time.c, but again the library was not specified
at link time, throwing the following error:

/home/royger/xen-clean/tools/qemu-xen-dir/qemu-timer.c:597: undefined
reference to `timer_gettime'
/home/royger/xen-clean/tools/qemu-xen-dir/qemu-timer.c:610: undefined
reference to `timer_settime'
../qemu-timer.o: In function `dynticks_start_timer':
/home/royger/xen-clean/tools/qemu-xen-dir/qemu-timer.c:565: undefined
reference to `timer_create'
../qemu-timer.o: In function `dynticks_stop_timer':
/home/royger/xen-clean/tools/qemu-xen-dir/qemu-timer.c:583: undefined
reference to `timer_delete'
collect2: ld returned 1 exit status

According to timer_getttime man page [1], -lrt should be used when
linking.

[0] http://linux.die.net/man/3/modf
[1] http://linux.die.net/man/2/timer_gettime

Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>
---
 Makefile        |    4 ++--
 Makefile.target |    2 ++
 2 files changed, 4 insertions(+), 2 deletions(-)

Comments

Blue Swirl Feb. 18, 2012, 8:24 a.m. UTC | #1
On Wed, Feb 8, 2012 at 17:06, Roger Pau Monne <roger.pau@entel.upc.edu> wrote:
> libm is used in cutils.c, but the library was not specified
> when linking some binaries, throwing the following error:
>
> cutils.o: In function `strtosz_suffix_unit':
> /home/royger/xen-clean/tools/qemu-xen-dir/cutils.c:354: undefined
> reference to `__isnan'
> /home/royger/xen-clean/tools/qemu-xen-dir/cutils.c:357: undefined
> reference to `modf'
> collect2: ld returned 1 exit status
>
> According to modf man page [0], -lm should be used when linking.
>
> librt is used in qemu-time.c, but again the library was not specified
> at link time, throwing the following error:
>
> /home/royger/xen-clean/tools/qemu-xen-dir/qemu-timer.c:597: undefined
> reference to `timer_gettime'
> /home/royger/xen-clean/tools/qemu-xen-dir/qemu-timer.c:610: undefined
> reference to `timer_settime'
> ../qemu-timer.o: In function `dynticks_start_timer':
> /home/royger/xen-clean/tools/qemu-xen-dir/qemu-timer.c:565: undefined
> reference to `timer_create'
> ../qemu-timer.o: In function `dynticks_stop_timer':
> /home/royger/xen-clean/tools/qemu-xen-dir/qemu-timer.c:583: undefined
> reference to `timer_delete'
> collect2: ld returned 1 exit status
>
> According to timer_getttime man page [1], -lrt should be used when
> linking.
>
> [0] http://linux.die.net/man/3/modf
> [1] http://linux.die.net/man/2/timer_gettime

This is Linux man page, is this correct for all OS we support?

We already have a test for -lrt in configure, but it looks like it
does not detect your case correctly. You should fix that instead.

> Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>
> ---
>  Makefile        |    4 ++--
>  Makefile.target |    2 ++
>  2 files changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/Makefile b/Makefile
> index 301c75e..e2c3cd4 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -34,7 +34,7 @@ configure: ;
>
>  $(call set-vpath, $(SRC_PATH):$(SRC_PATH)/hw)
>
> -LIBS+=-lz $(LIBS_TOOLS)
> +LIBS+=-lz -lm -lrt $(LIBS_TOOLS)
>
>  ifdef BUILD_DOCS
>  DOCS=qemu-doc.html qemu-tech.html qemu.1 qemu-img.1 qemu-nbd.8 QMP/qmp-commands.txt
> @@ -170,7 +170,7 @@ test-coroutine: test-coroutine.o qemu-timer-common.o async.o $(coroutine-obj-y)
>  $(qapi-obj-y): $(GENERATED_HEADERS)
>  qapi-dir := $(BUILD_DIR)/qapi-generated
>  test-visitor.o test-qmp-commands.o qemu-ga$(EXESUF): QEMU_CFLAGS += -I $(qapi-dir)
> -qemu-ga$(EXESUF): LIBS = $(LIBS_QGA)
> +qemu-ga$(EXESUF): LIBS = $(LIBS_QGA) -lm
>
>  $(qapi-dir)/test-qapi-types.c $(qapi-dir)/test-qapi-types.h :\
>  $(SRC_PATH)/qapi-schema-test.json $(SRC_PATH)/scripts/qapi-types.py
> diff --git a/Makefile.target b/Makefile.target
> index a111521..95d6bc0 100644
> --- a/Makefile.target
> +++ b/Makefile.target
> @@ -33,6 +33,8 @@ endif
>  PROGS=$(QEMU_PROG)
>  STPFILES=
>
> +LIBS+=-lrt
> +
>  ifndef CONFIG_HAIKU
>  LIBS+=-lm
>  endif
> --
> 1.7.9
>
>
Andreas Färber Feb. 18, 2012, 4:21 p.m. UTC | #2
Am 18.02.2012 09:24, schrieb Blue Swirl:
> On Wed, Feb 8, 2012 at 17:06, Roger Pau Monne <roger.pau@entel.upc.edu> wrote:
>> libm is used in cutils.c, but the library was not specified
>> when linking some binaries, throwing the following error:
>>
>> cutils.o: In function `strtosz_suffix_unit':
>> /home/royger/xen-clean/tools/qemu-xen-dir/cutils.c:354: undefined
>> reference to `__isnan'
>> /home/royger/xen-clean/tools/qemu-xen-dir/cutils.c:357: undefined
>> reference to `modf'
>> collect2: ld returned 1 exit status
>>
>> According to modf man page [0], -lm should be used when linking.
>>
>> librt is used in qemu-time.c, but again the library was not specified
>> at link time, throwing the following error:
>>
>> /home/royger/xen-clean/tools/qemu-xen-dir/qemu-timer.c:597: undefined
>> reference to `timer_gettime'
>> /home/royger/xen-clean/tools/qemu-xen-dir/qemu-timer.c:610: undefined
>> reference to `timer_settime'
>> ../qemu-timer.o: In function `dynticks_start_timer':
>> /home/royger/xen-clean/tools/qemu-xen-dir/qemu-timer.c:565: undefined
>> reference to `timer_create'
>> ../qemu-timer.o: In function `dynticks_stop_timer':
>> /home/royger/xen-clean/tools/qemu-xen-dir/qemu-timer.c:583: undefined
>> reference to `timer_delete'
>> collect2: ld returned 1 exit status
>>
>> According to timer_getttime man page [1], -lrt should be used when
>> linking.
>>
>> [0] http://linux.die.net/man/3/modf
>> [1] http://linux.die.net/man/2/timer_gettime
> 
> This is Linux man page, is this correct for all OS we support?

No, not for Haiku or Mac OS X.

> We already have a test for -lrt in configure, but it looks like it
> does not detect your case correctly. You should fix that instead.
> 
>> Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>
>> ---
>>  Makefile        |    4 ++--
>>  Makefile.target |    2 ++
>>  2 files changed, 4 insertions(+), 2 deletions(-)
>>
>> diff --git a/Makefile b/Makefile
>> index 301c75e..e2c3cd4 100644
>> --- a/Makefile
>> +++ b/Makefile
>> @@ -34,7 +34,7 @@ configure: ;
>>
>>  $(call set-vpath, $(SRC_PATH):$(SRC_PATH)/hw)
>>
>> -LIBS+=-lz $(LIBS_TOOLS)
>> +LIBS+=-lz -lm -lrt $(LIBS_TOOLS)

NACK. You need to make sure it either lands in $(LIBS_TOOLS) or is added
via a new variable with host-dependent contents.

>>
>>  ifdef BUILD_DOCS
>>  DOCS=qemu-doc.html qemu-tech.html qemu.1 qemu-img.1 qemu-nbd.8 QMP/qmp-commands.txt
>> @@ -170,7 +170,7 @@ test-coroutine: test-coroutine.o qemu-timer-common.o async.o $(coroutine-obj-y)
>>  $(qapi-obj-y): $(GENERATED_HEADERS)
>>  qapi-dir := $(BUILD_DIR)/qapi-generated
>>  test-visitor.o test-qmp-commands.o qemu-ga$(EXESUF): QEMU_CFLAGS += -I $(qapi-dir)
>> -qemu-ga$(EXESUF): LIBS = $(LIBS_QGA)
>> +qemu-ga$(EXESUF): LIBS = $(LIBS_QGA) -lm

NACK. Either needs to do LIBS += or must go in $(LIBS_QGA) or new
conditionalized variable.

>>
>>  $(qapi-dir)/test-qapi-types.c $(qapi-dir)/test-qapi-types.h :\
>>  $(SRC_PATH)/qapi-schema-test.json $(SRC_PATH)/scripts/qapi-types.py
>> diff --git a/Makefile.target b/Makefile.target
>> index a111521..95d6bc0 100644
>> --- a/Makefile.target
>> +++ b/Makefile.target
>> @@ -33,6 +33,8 @@ endif
>>  PROGS=$(QEMU_PROG)
>>  STPFILES=
>>
>> +LIBS+=-lrt
>> +

>>  ifndef CONFIG_HAIKU
>>  LIBS+=-lm
>>  endif

Here's the special treatment that avoids adding -lm on Haiku host
because it doesn't have a libm.so (git-blame would've told you it's in
libroot.so there); on Darwin there's a compatibility symlink but it's in
libSystem.dylib actually and an ifndef would be appropriate as well.
POSIX does not mandate -lm for math functions.

Would moving this snippet to Makefile.objs help? What system are you on
anyway and are you actually using upstream qemu.git? openSUSE 12.1 does
not complain, and without a test case it's hard to find a solution here.

Andreas

>> --
>> 1.7.9
Roger Pau Monne Feb. 20, 2012, 11:56 a.m. UTC | #3
2012/2/18 Andreas Färber <afaerber@suse.de>:
> Am 18.02.2012 09:24, schrieb Blue Swirl:
>> On Wed, Feb 8, 2012 at 17:06, Roger Pau Monne <roger.pau@entel.upc.edu> wrote:
>>> libm is used in cutils.c, but the library was not specified
>>> when linking some binaries, throwing the following error:
>>>
>>> cutils.o: In function `strtosz_suffix_unit':
>>> /home/royger/xen-clean/tools/qemu-xen-dir/cutils.c:354: undefined
>>> reference to `__isnan'
>>> /home/royger/xen-clean/tools/qemu-xen-dir/cutils.c:357: undefined
>>> reference to `modf'
>>> collect2: ld returned 1 exit status
>>>
>>> According to modf man page [0], -lm should be used when linking.
>>>
>>> librt is used in qemu-time.c, but again the library was not specified
>>> at link time, throwing the following error:
>>>
>>> /home/royger/xen-clean/tools/qemu-xen-dir/qemu-timer.c:597: undefined
>>> reference to `timer_gettime'
>>> /home/royger/xen-clean/tools/qemu-xen-dir/qemu-timer.c:610: undefined
>>> reference to `timer_settime'
>>> ../qemu-timer.o: In function `dynticks_start_timer':
>>> /home/royger/xen-clean/tools/qemu-xen-dir/qemu-timer.c:565: undefined
>>> reference to `timer_create'
>>> ../qemu-timer.o: In function `dynticks_stop_timer':
>>> /home/royger/xen-clean/tools/qemu-xen-dir/qemu-timer.c:583: undefined
>>> reference to `timer_delete'
>>> collect2: ld returned 1 exit status
>>>
>>> According to timer_getttime man page [1], -lrt should be used when
>>> linking.
>>>
>>> [0] http://linux.die.net/man/3/modf
>>> [1] http://linux.die.net/man/2/timer_gettime
>>
>> This is Linux man page, is this correct for all OS we support?
>
> No, not for Haiku or Mac OS X.
>
>> We already have a test for -lrt in configure, but it looks like it
>> does not detect your case correctly. You should fix that instead.

I've fixed the librt test in configure to work properly on my system,
that's uclibc 0.9.33.

>>
>>> Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>
>>> ---
>>>  Makefile        |    4 ++--
>>>  Makefile.target |    2 ++
>>>  2 files changed, 4 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/Makefile b/Makefile
>>> index 301c75e..e2c3cd4 100644
>>> --- a/Makefile
>>> +++ b/Makefile
>>> @@ -34,7 +34,7 @@ configure: ;
>>>
>>>  $(call set-vpath, $(SRC_PATH):$(SRC_PATH)/hw)
>>>
>>> -LIBS+=-lz $(LIBS_TOOLS)
>>> +LIBS+=-lz -lm -lrt $(LIBS_TOOLS)
>
> NACK. You need to make sure it either lands in $(LIBS_TOOLS) or is added
> via a new variable with host-dependent contents.
>
>>>
>>>  ifdef BUILD_DOCS
>>>  DOCS=qemu-doc.html qemu-tech.html qemu.1 qemu-img.1 qemu-nbd.8 QMP/qmp-commands.txt
>>> @@ -170,7 +170,7 @@ test-coroutine: test-coroutine.o qemu-timer-common.o async.o $(coroutine-obj-y)
>>>  $(qapi-obj-y): $(GENERATED_HEADERS)
>>>  qapi-dir := $(BUILD_DIR)/qapi-generated
>>>  test-visitor.o test-qmp-commands.o qemu-ga$(EXESUF): QEMU_CFLAGS += -I $(qapi-dir)
>>> -qemu-ga$(EXESUF): LIBS = $(LIBS_QGA)
>>> +qemu-ga$(EXESUF): LIBS = $(LIBS_QGA) -lm
>
> NACK. Either needs to do LIBS += or must go in $(LIBS_QGA) or new
> conditionalized variable.
>
>>>
>>>  $(qapi-dir)/test-qapi-types.c $(qapi-dir)/test-qapi-types.h :\
>>>  $(SRC_PATH)/qapi-schema-test.json $(SRC_PATH)/scripts/qapi-types.py
>>> diff --git a/Makefile.target b/Makefile.target
>>> index a111521..95d6bc0 100644
>>> --- a/Makefile.target
>>> +++ b/Makefile.target
>>> @@ -33,6 +33,8 @@ endif
>>>  PROGS=$(QEMU_PROG)
>>>  STPFILES=
>>>
>>> +LIBS+=-lrt
>>> +
>
>>>  ifndef CONFIG_HAIKU
>>>  LIBS+=-lm
>>>  endif
>
> Here's the special treatment that avoids adding -lm on Haiku host
> because it doesn't have a libm.so (git-blame would've told you it's in
> libroot.so there); on Darwin there's a compatibility symlink but it's in
> libSystem.dylib actually and an ifndef would be appropriate as well.
> POSIX does not mandate -lm for math functions.
>
> Would moving this snippet to Makefile.objs help? What system are you on
> anyway and are you actually using upstream qemu.git? openSUSE 12.1 does
> not complain, and without a test case it's hard to find a solution here.

I've added a configure test to check for libm, just like the librt
test, so we no longer need the libm Haiuku conditional in the
Makefile, does that sound ok?

Regards, Roger.

>
> Andreas
>
>>> --
>>> 1.7.9
>
> --
> SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
> GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg
diff mbox

Patch

diff --git a/Makefile b/Makefile
index 301c75e..e2c3cd4 100644
--- a/Makefile
+++ b/Makefile
@@ -34,7 +34,7 @@  configure: ;
 
 $(call set-vpath, $(SRC_PATH):$(SRC_PATH)/hw)
 
-LIBS+=-lz $(LIBS_TOOLS)
+LIBS+=-lz -lm -lrt $(LIBS_TOOLS)
 
 ifdef BUILD_DOCS
 DOCS=qemu-doc.html qemu-tech.html qemu.1 qemu-img.1 qemu-nbd.8 QMP/qmp-commands.txt
@@ -170,7 +170,7 @@  test-coroutine: test-coroutine.o qemu-timer-common.o async.o $(coroutine-obj-y)
 $(qapi-obj-y): $(GENERATED_HEADERS)
 qapi-dir := $(BUILD_DIR)/qapi-generated
 test-visitor.o test-qmp-commands.o qemu-ga$(EXESUF): QEMU_CFLAGS += -I $(qapi-dir)
-qemu-ga$(EXESUF): LIBS = $(LIBS_QGA)
+qemu-ga$(EXESUF): LIBS = $(LIBS_QGA) -lm
 
 $(qapi-dir)/test-qapi-types.c $(qapi-dir)/test-qapi-types.h :\
 $(SRC_PATH)/qapi-schema-test.json $(SRC_PATH)/scripts/qapi-types.py
diff --git a/Makefile.target b/Makefile.target
index a111521..95d6bc0 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -33,6 +33,8 @@  endif
 PROGS=$(QEMU_PROG)
 STPFILES=
 
+LIBS+=-lrt
+
 ifndef CONFIG_HAIKU
 LIBS+=-lm
 endif