Brandon J. Van Every wrote:
Pavel Volkovitskiy wrote:


It's not my CMakeList.txt, i use sim-im as example of program with cmake based buildsystem CMakeList.txt (from sim-im sources) always checks for ASPELL but doesn't uses it if USE_KDE=TRUE

I want to know if this common practice (find everything even if you don't need it) or if this CMakeList.txt has bugs
(ie it shouldn't check for aspell if it's not going to be used)

CMake doesn't search for anything unless the programmer says so. So it's not like Automake in that regard; you're never going to be looking for hordes of useless stuff, unless the programmer actually wanted to do that. When the programmer wants to find something, the following paradigm is common:

FIND_LIBRARY(LIBRARY_PATH ...)
IF(LIBRARY_PATH)
 blah
ELSE(LIBRARY_PATH)
 blah
ENDIF(LIBRARY_PATH)

That is, the find is performed unconditionally, and the results are used conditionally. This isn't a bug, it's just a style. The call is FIND_LIBRARY, not REQUIRE_LIBRARY. Nothing has been promised about how the results will be used.

There's nothing stopping anyone from writing code like

IF(KDE)
 FIND_LIBRARY(ASPELL_PATH ...)
 blah
ELSE(KDE)
 blah
ENDIF(KDE)

but nobody's going to do that without a motive. It sounds like the real problem here is that conary is improperly designed.

it's strange to find something if you are not going to use it
It takes time, resources, but yeah it cheap :)


Now about buildrequrements auto-discover.
after conary build binary package with configure script it looks in config.log to discover build requrements of package (ie if configure scripts checks for libaspell.so -> aspell should be added as build requirements for this package)

with cmake based build system i guess CMakeCache.txt is equivalent for config.log
so now conary builds package
(ie cmake; make; make install)
and then looks in CMakeCache.txt and if it found "ASPELL_LIBRARIES:FILEPATH=/usr/lib64/libaspell.so"
it adds aspell as build requirement for package

Why dos conary assume that a mere path is a build requirement? That's a bad assumption / a hack.

It doesn't assume this. Library dependencies usually descovered from elf binaries (and this is correct way, because if foo uses libbla.so.3.1 it needs libbla.so during build) But also during build often used various binaries (like /usr/bin/zip ) and it difficult to discover this So conary looks on config.log (and in CMakeCache.txt in my tree too) for founded paths then it checks if that path belongs to some installed packages and if conary found it, it tells that this path (package) _probably_ a build requirement. And it recipe writer job to check this.
This helps _a_lot_ to get correct build requirements
conary has a tool named rMake to build packages in clean chroot, the correct build requirements is really important.


the problem is that sim-im always tries to find aspell library even if it will not use it during build

so i wonder if there is better way exist to auto-discover real build requirements of package

That I don't know. I haven't RTFM on that issue, or needed it for my own work. I defer to others on this point. A reliable mechanism would indeed be the basis for a correct conary design.

It's not a bug if conary unconditionally will tell about this build requirements, because in real world
this recipie will has:
=========
if not Flags.kde:
  buildRequires.append('aspell:devel')
=========

or something like this. so comment about possibly aspell requirement is useful for any case

But i want to make conary as smart as possible :) so if this possible to get founded paths,
which is really used during build - i really want to know it :)

--
Pavel
_______________________________________________
CMake mailing list
[email protected]
http://www.cmake.org/mailman/listinfo/cmake

Reply via email to