[CMake] What does `cross-platform' mean?
Bill Hoffman
bill.hoffman at kitware.com
Mon Nov 10 08:23:36 EST 2008
Jed Brown wrote:
>
> My point about CC and friends is that there are often standard
> environment variables for setting this stuff. I think it should be
> possible to select the version of packages with one variable. For Qt4,
> this is the qmake executable, for PETSc, it is (by convention) PETSC_DIR
> and PETSC_ARCH. With most packages, if the wrong version is found by
> default, the user is required to edit all the advanced cache entries or
> to delete the cache manually and try again with the correct variable
> set.
>
> ...
So, each find module should have a consistently named variable that can
control the prefix for finding the module. For example, FindFoo.cmake,
would have FOO_DIR. If that environment variable is set and CMake can
not find it, it is an error and nothing else is searched. This is how
CC,CXX, and FC work. Once it is found the environment variable is no
longer looked at. However, if the cmake cache variable of the same name
is ever changed then all variables for the module are reset.
>
>> There is some code inside CMake that does library path searching. It
>> might make sense to have a command that parses link lines and finds the
>> libraries. I am thinking a new command might be a good idea.
>
> I agree, it's really painful to do this in a robust way in CMake. The
> command needs significant semantics (like understanding nested shell
> quoting) to handle pathological inputs (which mine doesn't). For
> instance, if the library makefile system sets
>
> FOO_CFLAGS = -I/path/to/foo/include -DBAD='"Some -Ipathological string"'
>
> it would be nice to parse this correctly. I know this looks like
> over-engineering, but logic to parse this correctly must exist somewhere
> in CMake already.
We can try, but shell escaping is going to hard. I am not sure it comes
up that much. When pkg-config is run or a makefile fragment is run it
should already expand the shell quoting. I don't think CMake has any
business being a shell.
>
> ...
>
>> So, what does BuildSystem do to handle this? Is there anything that
>> can be learned?
>
> It's not elegant. It always assumes that the entire dependency graph
> needs to be linked (as with static libraries). The analogue of Find*
> modules recognize this and behave accordingly. Component Foo can always
> be selected using
>
> --with-foo-dir=/path/to/foo
>...
This is basically covered by having a FOO_DIR variable for each
FindFoo.cmake module.
> rely on a stale cache entry. I sometimes find myself repeatedly running
> this
>
> $ rm -r * && cmake .. -DFOO_VAR=blah
>
> to guarantee that the cache is not stale and all necessary tests are
> actually run.
I don't think we will be getting rid of the cache. However, having
dependent variables that when changed cause re-running of tests and
find_* stuff is a good idea.
be found
> there (maybe I should have spelled it -DFOO_DIR=/path/to/foo-1.2) then
> the module should not silently fall back on /usr/lib/libfoo.so.
>
> Any ideas on how to make these semantics accessible to module writers
> without a lot of custom effort?
>
I would think that some standard functions in something like
FindPackageHandleStandardArgs.cmake should help.
-Bill
More information about the CMake
mailing list