[waffle] [PATCH 10/33] cmake: build with fPIC when possible

Chad Versace chad.versace at linux.intel.com
Wed Jul 16 21:22:50 PDT 2014


On 07/15/2014 07:44 AM, Jose Fonseca wrote:
> On 07/07/14 18:28, Emil Velikov wrote:
>> Some of our third_party libraries may be build without it thus we'll
>> fail at
>> link tim.
>>
>> Signed-off-by: Emil Velikov <emil.l.velikov at gmail.com>
>> ---
>>   cmake/Modules/WaffleDefineCompilerFlags.cmake | 2 ++
>>   1 file changed, 2 insertions(+)
>>
>> diff --git a/cmake/Modules/WaffleDefineCompilerFlags.cmake
>> b/cmake/Modules/WaffleDefineCompilerFlags.cmake
>> index 4d149c8..96a7a10 100644
>> --- a/cmake/Modules/WaffleDefineCompilerFlags.cmake
>> +++ b/cmake/Modules/WaffleDefineCompilerFlags.cmake
>> @@ -50,6 +50,8 @@ if(waffle_on_linux)
>>       waffle_add_c_flag("-Werror=missing-prototypes"
>> WERROR_MISSING_PROTOTYPES)
>>   endif()
>>
>> +waffle_add_c_flag("-fPIC" WITH_FPIC)
>> +
>>   waffle_check_thread_local_storage()
>>
>>   if(waffle_has_tls)
>>
> 
> Another way of fixing this is doing like in Apitrace:
> 
> -
> https://github.com/apitrace/apitrace/blob/master/cmak/ConvenienceLibrary.cmake
> 
> 
> -
> https://github.com/apitrace/apitrace/commit/c56b9acc6abcae465b916f6ebafa3a282d1f36fc
> 
> 
> This gives more control.  For example, unlike a blanket -FPIC flag,
> executables won't be needlessly compiled with FPIC.

Jose, your add_convenience_library() function may be unneeded. See the
manpage quote below.

Emil, did you intend to compile *everything*, including executables,
with PIC?

On master, Waffle is already building shared libraries with PIC. I
verified it with:

$ ninja clean
$ ninja -v libwaffle-1.so | grep -e '-o libwaffle'
... cc  -fPIC ... -o lib/libwaffle-1.so.0.3.90 ...

CMake's default behavior is to build shared libraries with PIC. From
man://cmake(1) :

>    set_target_properties
>        ...
>        POSITION_INDEPENDENT_CODE
>               Whether to create a position-independent target
> 
>               The  POSITION_INDEPENDENT_CODE property determines whether posi‐
>               tion independent executables or shared libraries  will  be  cre‐
>               ated.   This  property  is true by default for SHARED and MODULE
>               library targets and false otherwise.  This property is  initial‐
>               ized  by  the  value  of  the  variable  CMAKE_POSITION_INDEPEN‐
>               DENT_CODE if it is set when a target is created.


More information about the waffle mailing list