[CMake] Re: Sharing code between projects

kitts kitts.mailinglists at gmail.com
Sun Aug 26 17:08:10 EDT 2007


On Saturday 25 Aug 2007 12:33:02 am kitts wrote:
> On Friday 24 Aug 2007 11:43:12 pm kitts wrote:
> > On Friday 24 Aug 2007 9:41:26 pm James Bigler wrote:
> > > >> Code is organized as;
> > > >> src/common
> > > >> src/project1
> > > >> src/project2
> > > >>
> > > >> The CMakeLists.tst files are located inside for each project which
> > > >> sets the right compiler and sources to be built. Now i want common
> > > >> to be included in each of these proejects and build separately for
> > > >> each by inheriting all the settings for that project.
> > > >>
> > > >> What is the best way to achieve this? I cant use ADD_SUBDIRECTORY()
> > > >> as it is really a sibling folder (cmake complains if I use
> > > >> "../common").
> > > >
> > > > Does anybody have a solution around this? The only way i could think
> > > > of is to copy the common folder during configure time and run cmake
> > > > again inside it by using the current cache. This is not a very
> > > > efficient way as not all of the common folder code is necessary in
> > > > every project. Also code changes in the common directory will not
> > > > result in an update in the project.
> > >
> > > Have a look at LOAD_CACHE in the documentation.  This will allow you to
> > > load in cache variables from another cmake build.
> > >
> > > Also look at EXPORT_LIBRARY_DEPENDENCIES if you need to get out library
> > > dependencies of your project.  With that file you can simply IMPORT()
> > > said file in your new project and life gets happy again.  I've done
> > > this with projects that build static libraries, and I need to tell an
> > > external project the library dependencies.
> >
> > I am now trying something like this:
> >
> > if(NOT IS_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/common)
> >     file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/common)
> >     execute_process(COMMAND cmake ${CMAKE_SOURCE_DIR}/../common
> >                     WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/common
> >                     RESULT_VARIABLE _ERROR
> >     )
> >     if(_ERROR)
> >         file(REMOVE_RECURSE ${CMAKE_CURRENT_BINARY_DIR}/common)
> >         message(FATAL_ERROR "Failed to configure shared code")
> >     endif(_ERROR)
> > endif(NOT IS_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/common)
> >
> > I call make inside with common as the working directory with
> > add_custom_command (PRE_BUILD).
> >
> > As with the the LOAD_CACHE, is there such an option that can be passed
> > when calling the cmake executable?
> >
> > The other problem with the above approach is if there is a change in the
> > project variables, the common code is not updated. I would want to merge
> > common into the project in a way as though it were a subdirectory. Is
> > this possible?
>
> Thanks to all who helped. This currently works for me;
>
> In the projects CMakeLists.txt:
>
> if(NOT IS_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/common)
>     file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/common)
> endif(NOT IS_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/common)
>
> execute_process(COMMAND cmake -D
> LOAD_CACHE_DIR:PATH=${CMAKE_CURRENT_BINARY_DIR}
> ${CMAKE_SOURCE_DIR}/../common WORKING_DIRECTORY
> ${CMAKE_CURRENT_BINARY_DIR}/common RESULT_VARIABLE _ERROR
> )
>
> if(_ERROR)
>     file(REMOVE_RECURSE ${CMAKE_CURRENT_BINARY_DIR}/common)
>     message(FATAL_ERROR "Failed to configure shared code")
> endif(_ERROR)
>
> add_custom_target(common ALL make
>                     WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/common
>                     COMMENT "Building the common library"
> )
>
> add_executable(exec ${SRCS})
> add_dependencies(exec common)
>
> And in common/CMakeLists.txt
>
> message(STATUS "Loading cache from ${LOAD_CACHE_DIR}")
> LOAD_CACHE(${LOAD_CACHE_DIR})
> project(common)
>
> However, i am all ears for a cleaner solution as this way common does not
> receive the same arguments that the project receives. Things like;
>
> make clean
> make rebuild_cache
> make VERBOSE=1
> ...
>
> Is there a way by which i can pass the same command to build common as was
> received by project?

All that mentioned above is not needed! I should have read the documentation 
with a lil more patience!

add_subdirectory(${CMAKE_SOURCE_DIR}/../common common)
does the job!
-- 
Cheers!
kitts


More information about the CMake mailing list