[CMake] How to apply the --as-needed linker flag?

Michael Hertling mhertling at online.de
Tue Dec 7 08:23:18 EST 2010


On 11/28/2010 09:10 AM, Alan W. Irwin wrote:
> On 2010-11-28 06:39+0100 Michael Hertling wrote:
> 
>> On 11/27/2010 06:45 PM, Alan W. Irwin wrote:
>>> I just discovered that many Linux distros these days use the
>>> --as-needed Linux linker option by default.  At first glance that
>>> option makes a lot of sense since it tends to reduce startup times.
>>> But I guess there are some caveats as well which is probably why CMake
>>> does not adopt this linker option by default for Linux builds.
>>> However, I would at least like to try this option for my own Linux
>>> builds without forcing it using target_link_libraries. Is it possible
>>> to specify linker options such as --as-needed using environment
>>> variables and/or -D options?
>>
>> On Linux, CMake takes account of the LDFLAGS environment variable
>> for the initial configuration of the build directory, so saying
>>
>> LDFLAGS="-Wl,--as-needed" cmake <path/to/srcdir>
>>
>> enables "--as-needed" for this build directory - forever.
> 
> Thanks, Michael, that was exactly what I needed.  I was completely
> unaware that environment variable worked for CMake despite many years
> of using CMake on Linux.  Is the LDFLAGS environment variable
> documented for CMake anywhere?  I couldn't find it in the
> documentation you get with "cmake --help-full", and it is also not
> documented at http://www.cmake.org/Wiki/CMake_Useful_Variables. The
> useful environment variables CXXFLAGS, CFLAGS, and FFLAGS that allow
> you to specify general compiler flags in a convenient way are
> undocumented as well, and that is a real shame.

AFAIK, these variables aren't documented anywhere apart from
occasionally appearing on the mailing list. However, a quick

> grep "\\\$ENV{[A-Za-z0-9_]\+}" -r . | sed "s%^.*\\\$ENV{\([A-Za-z0-9_]\+\)}.*\$%\1%" | sort -u

in the modules' directory reveals all of them which are read from
the environment. Apparently, the relevant ones are CC/CFLAGS, CXX/
CXXFLAGS, FC/FFLAGS, LDFLAGS, and RC/RCFLAGS for WIN32. Because of
their special meaning for a project's initial configuration, there
should be an enhancement of the useful-variables section, indeed.

Regards,

Michael


More information about the CMake mailing list