Alexander Neundorf wrote:
On Wednesday 11 July 2007 06:01, Mike Talbot wrote:
Hi,
I'm working on quite a large baseline (>100 projects) that uses cmake
and am trying to find a way to allow users to select only a subset of
projects to include in the generated solution/makefile. I'd like users
to be able to specify one or more projects that they are working on and
for these projects and all dependent projects to be included in the
solution.
Assuming the user has set the cmake variable MY_PROJECT to the project
they are interested in, each project (called ${project}) has a
CMakeLists.txt with something like this in:
IF(MY_PROJECT STREQUAL ${project})
SET(${project}_SELECTED ON CACHE INTERNAL "Project selected")
ENDIF(MY_PROJECT STREQUAL ${project})
# ${project}_DEPENDS is a list of projects that ${project} depends on
# ${project}_SOURCES is a list of source files for ${project}
IF(${project}_SELECTED)
FOREACH(depend ${${project}_DEPENDS})
SET(${depend}_SELECTED ON CACHE INTERNAL "Dependent project selected")
ENDFOREACH(depend)
ADD_LIBRARY(${project} ${${project}_SOURCES})
TARGET_LINK_LIBRARIES(${project} ${${project}_DEPENDS})
ENDIF(${project}_SELECTED)
This assumes the project CMakeLists.txt are traversed topologically and
works fine the first time cmake is run. However on subsequent runs
(even if I reset all the ${project}_SELECTED variables to false at the
top-level CMakeLists.txt) the value of the ${project}_SELECTED variables
are no longer visible outside the CMakeLists.txt file where they are set
(but they were the first time).
I think SET(... CACHE) has no effect if the variable is already in the cache.
Then you have to use SET(... CACHE FORCE).
Tried that but it makes no difference (as described in the manual,
INTERNAL variables are always written to the cache). After a bit more
poking, it seems the problem is that I reset the variables in the
top-level CMakeLists.txt, which means the lower-level CMakeLists.txt
files' changes are not visible in the other CMakeLists.txt files. I
thought cache variables were global, but there seems to be some scoping
going on, f.e.
Top-level CMakeLists.txt:
SET(FOO OFF CACHE INTERNAL "")
ADD_SUBDIRECTORY(DirA)
ADD_SUBDIRECTORY(DirB)
In both DirA & DirB:
MESSAGE("FOO = ${FOO}")
SET(FOO ON CACHE INTERNAL "")
When I run cmake on this I get:
FOO = OFF (from DirA)
FOO = OFF (from DirB)
but the CMakeCache.txt after this has FOO=ON.
If I remove the top-level SET(FOO OFF...) command, then I get the
(expected) output:
FOO = ON (from DirA)
FOO = ON (from DirB)
this is irrespective of what FOO is set to in the cache at the start.
--
Mike Talbot
Core Petrel Architect (Abingdon)
Schlumberger
Lambourn Court, Wyndyke Furlong,
Abingdon Business Park, Abingdon,
Oxfordshire, OX14 1UJ, UK
Office: +44 (0)1235 543 488
Mobile: +44 (0)7790 382 746
_______________________________________________
CMake mailing list
[email protected]
http://www.cmake.org/mailman/listinfo/cmake