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.bethle...@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.bethle...@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.spring...@gmail.com
_______________________________________________ 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