[CMake] un circle dependency

luxInteg lux-integ at btconnect.com
Fri Nov 12 08:47:24 EST 2010


On Thursday 11 November 2010 21:55:31 Alexander Neundorf wrote:
> On Thursday 11 November 2010, luxInteg wrote:
> > Greetings
> > 
> > I am learning cmake.
> > 
> >   I think I now know how to generate libraries and executables but  I
> >   have
> > 
> > not yet grasped  how  the tree and   directory structure is handled and
> > by conseqence how one navigates therein.
> > 
> > 
> > I have this problem.  Lets say my   build tree has these directories
> > 
> > L---$originalSourceTree/build/lib
> > M---$originalSourceTree/build/bin
> > 
> > libraries   say libA.so libB.a are in L.  I want to generate  
> > executables A.bin and B.bin in M but
> > they each need  to link to  newly generated  libraries  libA.so libB.a
> > 
> > 
> > a) how do I direct cmake  (in the CMakeLists.txt/base directory) to build
> > the libraries in ( L )above   first  -i.e. before atempting to do finds
> > of nonexistant libraries  ?
> 
> The add_library() commands must be before the add_executable() commands,
> otherwise the libraries "A" and "B" are not yet know when you do
> target_link_libraries(exe A B)
> 
> Beside that, the dependencies in the generated makefiles are complete, so
> whenever you do a build, cmake makes sure that the libraries are up-to-date
> before it builds the executable.
> 
> > b) if I   insert lines such 'find_library(LIB  libA  path ../lib'   in
> > the CmakeLists.txt in the base directory  this  results in an error  so
> > what does one insert?
> 
> find_library() is not necessary, you can simply use the names of the
> library targets when linking against them.

thanks  for the help,

I added 

ADD_DEPENDENCIES(libA  ../path/to/A_exec )

to the CMakeLists.txt in  ~/lib directory (i.e.L)

---AND
add_executable(A.exec fileA.c)
target_link_libraries(A.exec  libA )

to the CMakeLists.txt  in the ~/bin directory (i.e.M) a

and it seems to have worked



-----A   related problem is   described below

I have this  file:- (orig_A_exec.out) in in the ~/bin (of the source tree)
after building A_exec  as explained above   I tried running the shall command 
below

EXECUTE_PROCESS(COMMAND ./A_exec > new_A_exec.out  
- diff orig_A_exec.out   new_A_exec.out )

but I did not see      neither new_A_exec.out  nor orig_A_exec.out in ~/bin in 
the build directory (i.e.M) i.e nothing happened.


I am using a bash  shell.  some guidance on how to execute bash  commands in 
cmake  would be appreciated.


luxInteg


More information about the CMake mailing list