Hi, James!

Thanks for referring me to the Chicken system. Their CMakeLists.txt is a
good read on how things should flow.

Now regarding the relinking problem, I wish I could change the whole setup,
but it's an older corporate system.

And since the circular dependencies are so bad, it is (sort-of) OK to employ
dirty tricks. ;)

I've solved my problem by creating the list of objects files given the list
of source files, using a path like this as prefix:
${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${target}.dir/${src_path}/${src_name}${CMAKE_CXX_OUTPUT_EX

Looks evil, but it saves me 10min in build time, as I use this ${obj} list to relink directly. =)

Alex Ciobanu



James Bigler wrote:
Hi,

Alexandru Ciobanu wrote:
Hi!

I am using CMake to build three libraries. They are located
in separate folders (with separata CMakeLists.txt):

libA/
  ./CmakeLists.txt

libB/
  ./CmakeLists.txt

libC/
  ./CmakeLists.txt

All the problems are caused by the circular dependency among
these libraries:
   libA - depends on libB and libC
   libB - depends on libA and libC
   libC - depends on libA and libB


I am able to build them with CMake, but that involves compiling
the source files two times (for each library). It is done this way:

in libA/CmakeLists.txt
    add_library ( libA_tmp ${srcA} )

    add_library ( libA ${srcA} )
    target_link_libraries ( libA libB libC )

in libB/CmakeLists.txt
    add_library ( libB_tmp ${srcB} )
    target_link_libraries ( libB_tmp libA_tmp )

    add_library ( libB ${srcB} )
    target_link_libraries ( libB libA_tmp libC_tmp )

in libC/CmakeLists.txt
    add_library ( libC_tmp ${srcC} )
    target_link_libraries ( libC_tmp libA_tmp )

    add_library ( libC ${srcC} )
    target_link_libraries ( libC libA_tmp libB_tmp )

In a nutshell:
1. I build tmp version of all the libs ( having a few undefined references ) 2. I link agains the tmp versions of the libs to build the final (complete) library

The problem:
  I have to build each library from sources two times each.

Is there a way to reuse the generated *.o files from the first add_library() clause?
What I am looking for is something like this (for libA):

    add_library ( libA_tmp ${srcA} )

    # get list of generated object files in ${objA}

    # now only linking will be done ( no recompile )
    add_library ( libA ${objA} )
    target_link_libraries ( libA libB libC )

So, is there a simple way to achieve this? Or I would have to generate the
list of objects from the list of source files by hand?

I'm not sure about the object file thing. I know that where the object files get placed is not exposed in the CMake API, but there are examples of this being done (I think the Chicken language build does something like this).

Taking that aside, one would ask why you have three separate libraries that depend on the contents of each other. If it's possible why not make just a single library from the sources in A, B and C? I've done this in my project for sources that span several directories.

Another possibility is to create a fourth single library from that links against lib{A,B,C}_tmp and use that single library in place of lib{A,B,C} thus resolves all the dependencies.

In general, I've been more happy avoiding circular library dependencies than trying to support them. Some operating systems can get really cranky trying to do this.

James
_______________________________________________
CMake mailing list
CMake@cmake.org
http://www.cmake.org/mailman/listinfo/cmake



_______________________________________________
CMake mailing list
CMake@cmake.org
http://www.cmake.org/mailman/listinfo/cmake

Reply via email to