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 _______________________________________________ CMake mailing list CMake@cmake.org http://www.cmake.org/mailman/listinfo/cmake