[CMake] Dependencies and libraries..How does it work?
David Springate
david.springate at gmail.com
Fri Jun 17 06:03:57 EDT 2011
Thanks for that helpful summary Jacob - and indeed you are correct I was
getting very confused (overtime is getting to me!) and forgetting of course
cmake doesn't actually *build* the product - but I do want it to generate
the makefiles that the project is dependant on, as you outlined.
Now, my setup is basically as you outlined in your example - except that the
library is not located in a subdirectory of the main_tree.
I have an environment variable (let's call it LIB_SRC) that contains the
path to the root of my library source.
How can I inform the app's CMakeLists.txt file that the lib source is
located at LIB_SRC so that the 'target_link_libraries(MY_APP MY_LIB)' call
doesn't fail?
I'm guessing that add_subdirectory isn't ideal in this case..
Thanks again for a really helpful reply,
David
On 17 June 2011 10:54, J.S. van Bethlehem <j.s.van.bethlehem at astro.rug.nl>wrote:
> **
> 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>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
>>>
>> _______________________________________________
>>
>
>
> _______________________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Please keep messages on-topic and check the CMake FAQ at:
> http://www.cmake.org/Wiki/CMake_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://www.cmake.org/mailman/listinfo/cmake
>
--
David Springate
david.springate at gmail.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.cmake.org/pipermail/cmake/attachments/20110617/ed8a3d9d/attachment-0001.htm>
More information about the CMake
mailing list