[CMake] Dependencies and libraries..How does it work?

J.S. van Bethlehem j.s.van.bethlehem at astro.rug.nl
Fri Jun 17 05:54:47 EDT 2011


Hej David,

You're either very confusing in explaining your needs or you just don't 
understand what CMake does. CMake knows that it needs to build MY_LIB 
before MY_APP, because supposedly you have written code in the 
lists-file that tells CMake so.

I can't be sure, but I feel you really need to check out the 
documentation a bit more; on the other hand, if you never created a 
build-system before I think the available documentation is quite 
overwhelming and maybe close to incomprehensible. It certainly took me 
quite a while to figure out how to convert my manually coded Makefiles 
into CMake lists-files properly.

Anyways: let me spit it out a bit for you. Suppose this is the structure 
of your sources:
main_tree/
  source1.cc
  source2.cc
  my_app.cc
  my_lib/
    src1.cc
    src2.cc

(Note that I made the my_lib directory a sub-directory; this is not 
strictly necessary, but certainly preferable)
Now we create a lists-file in the sub-dir. I'll not write all the 
details, but provide the main parts you'll need:

add_library(MY_LIB src1.cc src2.cc)

Hej.... that's all there is to it. Of course you could and (probably) 
should create a variable that stores the sources for MY_LIB. Now CMake 
knows about the library and what sources to use for it. Let's move to 
the main dir. Here we do:

add_subdirectory(my_lib)
add_executable(MY_APP my_app.cc)
target_link_libraries(MY_APP MY_LIB)

That's all there is to it. Now CMake knows that there is some executable 
MY_APP that is to be compiled from my_app.cc (of course the list of 
sources is not limited to one) and also that it needs MY_LIB to link it. 
CMake will automatically make sure the library gets build before linking 
- it must, since the executable can't be build without the library to 
begin with. Your job is to write a lists-file that describes 
dependencies - CMake will then figure out how the project is to be build 
and creates Makefiles for it (BTW: reading your mail I got the feeling 
that maybe you are under the impression that CMake actually builds the 
project - if that's case, you misunderstood. CMake will create Makefiles 
for you; subsequently you'll have to call make to build the project - 
make help will get you a listing of all targets CMake created for you. 
Or in yet other words: the two lines of code you wrote will never, ever, 
build anything. It will only create Makefiles.)

Since you are new to CMake I'd also urge you to have a look at 
http://www.cmake.org/cmake/help/cmake_tutorial.html

Hope this helps.

Greetsz, Jakob


On 06/17/2011 11:06 AM, David Springate wrote:
> Hi,
>
> Thanks for the reply - but I think you might have misunderstood my 
> question.
>
> I want to setup CMake so that when I call Cmake like so (for MY_APP):
> mkdir build && cd build
> cmake .. -G Xcode
>
> that the cmake call will be able to 'know' that it needs MY_LIB, find 
> where the MY_LIB CMakeLists.txt file is, build it, and then continue 
> with the cmake call for MY_APP.
>
> Any ideas?
>
> David
>
> On 17 June 2011 08:18, J.S. van Bethlehem 
> <j.s.van.bethlehem at astro.rug.nl 
> <mailto:j.s.van.bethlehem at astro.rug.nl>> wrote:
>
>     Hej David,
>
>     >From your description I think all your build script needs to do is:
>
>     mkdir build && cd build
>     cmake ..
>     make MY_APP
>
>     Further, assuming your library also gets build with CMake, you
>     probably have an add_directory(../MY_LIB ../MY_LIB) in your main
>     lists-file (otherwise you should) and then the link_directories()
>     command is not needed. I created sort of a 'standard' machinery
>     for building a list of 'sub-packages' using CMake. It's not well
>     documented and probably still has many issues, but I could mail it
>     to you if you think it may help you get started and if you're
>     interested.
>
>     Greetsz,
>     Jakob
>
>     On 06/16/2011 11:54 PM, David Springate wrote:
>
>         Hi,
>
>         I am new to CMake - and whilst I am immediately impressed with
>         it's relative ease of use - I have a 'noob' question, I'm sure!
>
>         I have the following:
>         A library called MY_LIB that builds with a cmake command (I
>         have created a nice CMakeLists.txt file)
>         An application called MY_APP that builds a nice application -
>         and even links in MY_LIB using:
>         link_directories("../MY_LIB")
>         target_link_libraries(MY_APP MY_LIB)
>
>         Now, first of all I know that I'm not supposed to use relative
>         paths.. but we'll call a side issue.. (though I'd be happy to
>         hear the correct way of doing things!) - the real problem that
>         I have is this:
>
>         Give than MY_LIB is built using CMake and MY_APP is built
>         using CMake.. how can I setup my build scripts so that I can
>         call CMake once for MY_APP, it'll realise that it needs
>         MY_LIB, which hasn't yet been built, invoke CMake for MY_LIB
>         and then link itself with MY_APP?
>
>         I ask because I use libraries heavily to organise my code (and
>         reuse) and would love to switch to CMake for all my building
>         (XCode 4 has forced my hand!) but I can't seem to figure this out.
>
>         Please help a newcomer out - any help is greatly appreciated!
>
>         Thanks,
>
>         David
>
>     _______________________________________________
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.cmake.org/pipermail/cmake/attachments/20110617/3386ee27/attachment.htm>


More information about the CMake mailing list