[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