[CMake] How to use DEFINE_SYMBOL properly?
Michael Wild
themiwi at gmail.com
Tue Feb 9 10:24:20 EST 2010
CMake can't possibly do this in a good and general way. I'd hate it if it tried!
1. Many projects put much more stuff in the XXX_EXPORTS (or whatever-it's-called) macros. There's a huge variability, no two projects have the exact same requirements and conventions.
2. How would the __declspec(import)/__attribute__(visibility("hidden")) come in if the user-project doesn't use CMake but something else?
There are probably many more issues of which I didn't think of...
Michael
On 9. Feb, 2010, at 16:05 , Hilton Medeiros wrote:
> Well, that is exactly what I expect from CMake, it has
> done much more than this until now, this should be easy.
>
> As an example the library Ogre for 3D graphics rendering is
> known to support a lot of platforms and as you can see it is the same
> thing always:
>
> #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
> # if defined( OGRE_STATIC_LIB )
> # define _OgreExport
> # define _OgrePrivate
> # else
> # if defined( OGRE_NONCLIENT_BUILD )
> # define _OgreExport __declspec( dllexport )
> # else
> # if defined( __MINGW32__ )
> # define _OgreExport
> # else
> # define _OgreExport __declspec( dllimport )
> # endif
> # endif
> # define _OgrePrivate
> #endif
>
> #if OGRE_PLATFORM == OGRE_PLATFORM_LINUX || \
> OGRE_PLATFORM == OGRE_PLATFORM_APPLE || \
> OGRE_PLATFORM == OGRE_PLATFORM_IPHONE
> # if defined( OGRE_GCC_VISIBILITY )
> # define _OgreExport __attribute__ ((visibility("default")))
> # define _OgrePrivate __attribute__ ((visibility("hidden")))
> # else
> # define _OgreExport
> # define _OgrePrivate
> # endif
> #endif
>
> They support every 'big' system like Windows, Linux, MacOS and mobiles
> like Symbian and Iphone, and even MinGW.
>
> Your example that they can change this in the future would mean a
> massive rebuild of thousands of projects. If CMake supported this, it
> would mean a fix in CMake and all the projects based on its build system
> would have no problems whatsoever.
>
> Kind regards,
> Hilton
>
> On Tue, 9 Feb 2010 09:23:19 -0500
> Mike Jackson <mike.jackson at bluequartz.net> wrote:
>
>> Just to get some more clarification, what exactly do you mean by
>> "...this visibility macro turns out to be always the same thing in
>> every project...,"
>>
>> The only thing you can say for certain is that for the versions of
>> Visual Studio and GCC _currently_ released the macros seem to stay the
>> same. There is absolutely NO guarantee that Microsoft, Apple, GNU or
>> someone else will NOT change that in the future.
>>
>> So right now the code that needs to be included in your project via a
>> header file is pretty much "boilerplate" code and is simple and
>> straight forward to insert into your project.
>>
>> Also, if you are converting another non-cmake project to CMake then
>> how that projects goes about implementing their visibility macros may
>> be different than how CMake chose to do it.
>> _________________________________________________________
>> Mike Jackson mike.jackson at bluequartz.net
>>
>> On Tue, Feb 9, 2010 at 8:59 AM, Hilton Medeiros
>> <medeiros.hilton at gmail.com> wrote:
>>> Thanks a lot for the answers.
>>>
>>> Indeed, I already knew this macro, but I thought that since this
>>> visibility macro turns out to be always the same thing in every
>>> project, CMake would have it built in. I can't see why this is not
>>> the case yet.
>>>
>>> Well, back to #defines...
>>>
>>> Thanks again,
>>> Hilton
>>>
>>> On Tue, 9 Feb 2010 08:29:36 -0500
>>> Mike Jackson <mike.jackson at bluequartz.net> wrote:
>>>
>>>> http://www.cmake.org/Wiki/BuildingWinDLL
>>>>
>>>> _________________________________________________________
>>>> Mike Jackson mike.jackson at bluequartz.net
>>>> BlueQuartz Software www.bluequartz.net
>>>> Principal Software Engineer Dayton, Ohio
>>>>
>>>>
>>>>
>>>> On Tue, Feb 9, 2010 at 8:25 AM, Pau Garcia i Quiles
>>>> <pgquiles at elpauer.org> wrote:
>>>>> Hello,
>>>>>
>>>>> You are doing it wrong. You need to create a header file
>>>>> (myproject_exports.h, for instance) following
>>>>> http://gcc.gnu.org/wiki/Visibility . If you call your visibility
>>>>> macro target_EXPORTS, you do not need to modify the value of
>>>>> DEFINE_SYMBOL at all, CMake will automagically make use of it.
>>>>> You only need to do set_target_properties( target PROPERTIES
>>>>> DEFINE_SYMBOL my_visibility_macro ) if you want to use a
>>>>> different name for the macro (usually because it is an
>>>>> already-existing project which you are converting to CMake).
>>>>>
>>>>> On Tue, Feb 9, 2010 at 1:25 PM, Hilton Medeiros
>>>>> <medeiros.hilton at gmail.com> wrote:
>>>>>> Hello,
>>>>>>
>>>>>> From what I read and understood this DEFINE_SYMBOL property
>>>>>> should be defined like this (or something like this):
>>>>>>
>>>>>> On Windows, as shared library:
>>>>>> target_EXPORTS=__declspec(dllexport) On Linux, as shared
>>>>>> library: target_EXPORTS=__attribute__((visibility("default")))
>>>>>>
>>>>>>
>>>>>> So that I can use this symbol like this:
>>>>>>
>>>>>> class target_EXPORTS ExampleClass {...};
>>>>>>
>>>>>>
>>>>>> But on my machine (Linux, gcc) while building a shared library,
>>>>>> with CMake 2.8.0, I'm getting the error below because CMake is
>>>>>> defining this property with -Dtarget_EXPORTS=0:
>>>>>>
>>>>>> error: expected identifier before numeric constant
>>>>>>
>>>>>> What am I missing?
>>>>>>
>>>>>> Kind regards,
>>>>>> Hilton
>>>>>> _______________________________________________
>>>>>> 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://www.cmake.org/mailman/listinfo/cmake
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Pau Garcia i Quiles
>>>>> http://www.elpauer.org
>>>>> (Due to my workload, I may need 10 days to answer)
>>>>> _______________________________________________
>>>>> 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://www.cmake.org/mailman/listinfo/cmake
>>>>>
>>>
>>>
>
> _______________________________________________
> 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://www.cmake.org/mailman/listinfo/cmake
More information about the CMake
mailing list