[CMake] Re: Sharing code between projects

kitts kitts.mailinglists at gmail.com
Fri Aug 24 15:03:02 EDT 2007


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?
-- 
Cheers!
kitts


More information about the CMake mailing list