2012/12/21 Alan W. Irwin <ir...@beluga.phys.uvic.ca>: > My use case is I want to quickly test whether a data file that is external > to the source tree exists or not. So I naively tried to use if(IS_ABSOLUTE > fullpathname) for this purpose, but all that tests at the current time is > whether fullpathname starts with a slash or not. It does not test > whether fullpathname actually exists. > > To demonstrate this limitation use the following test script > > set(file /home/irwinx) > if(IS_ABSOLUTE ${file}) > message(STATUS "${file} is absolute") > else(IS_ABSOLUTE ${file}) > message(STATUS "${file} is not absolute") > endif(IS_ABSOLUTE ${file}) > > and run > > cmake -p test.cmake > > The result is > > -- /home/irwinx is absolute > > even though that absolute pathname does not exist. > > I suspect this behaviour is by design and not a bug, but in that case > please change the documentation to say that IS_ABSOLUTE (unlike > IS_SYMLINK and IS_DIRECTORY) just checks for a leading "/" regardless > of whether the PATH exists or not so that users know the actual limits > to the usefulness of IS_ABSOLUTE. > > I have brought this up because I think it is important to document the > limitations of IS_ABSOLUTE when the existence of IS_SYMLINK and > IS_DIRECTORY might lead the user to think there might be an existence > test with IS_ABSOLUTE.
The doc may be clarified but my point of view is that IS_SYMLINK and IS_DIRECTORY semantically requires the file to exists while IS_ABSOLUTE does not. Perhaps you should simply use: if(IS_ABSOLUTE ${file} AND EXISTS ${file}) > Obviously for my use case it does look like a > reasonable alternative is to use file(GLOB...) followed by a check of > the result variable to see if it is empty. But implementation of an > additional IF subcommand called IS_FILE which just checks for the > existence of the specified file would do this in fewer lines and does Precisely the purpose of if(EXISTS ${file}) I think. > seem to be a logical companion subcommand to IS_SYMLINK and IS_DIRECTORY. Check this: set(afile /home/irwinx) set(anexistingpath /tmp/) foreach (file ${anexistingpath} ${afile}) if(IS_ABSOLUTE ${file}) message(STATUS "${file} is absolute") else(IS_ABSOLUTE ${file}) message(STATUS "${file} is not absolute") endif(IS_ABSOLUTE ${file}) if(IS_ABSOLUTE ${file} AND EXISTS ${file}) message(STATUS "${file} is an existing absolute path") else() message(STATUS "${file} is not absolute or does not exists") endif() endforeach() which gives: $ cmake -P test-abs.cmake -- /tmp/ is absolute -- /tmp/ is an existing absolute path -- /home/irwinx is absolute -- /home/irwinx is not absolute or does not exists -- Erk Le gouvernement représentatif n'est pas la démocratie -- http://www.le-message.org -- Powered by www.kitware.com Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Follow this link to subscribe/unsubscribe: http://public.kitware.com/cgi-bin/mailman/listinfo/cmake-developers