[CMake] set_target_properties versus set_source_files_properties
Michael Wild
themiwi at gmail.com
Wed Sep 22 15:06:23 EDT 2010
On 22. Sep, 2010, at 17:49 , pellegrini wrote:
> Michael Wild a écrit :
>> On 22. Sep, 2010, at 14:09 , pellegrini wrote:
>>
>>
>>> Hello everybody,
>>>
>>> my question is in the title !
>>>
>>> I want to create a fortran static library using the following set of g95 compiler flags "-O3 -std=f2003 -funroll-loops -msse2"
>>>
>>> If I use:
>>>
>>> set_target_properties(my_static_lib PROPERTIES COMPILE_FLAGS "-O3 -std=f2003 -funroll-loops -msse2")
>>> or
>>> set_source_files_properties(${SRC_FILES} PROPERTIES COMPILE_FLAGS "-O3 -std=f2003 -funroll-loops -msse2")
>>>
>>> where ${SRC_FILES} is the list of source files used to compile my static library, the result is the same when starting the make process.
>>>
>>> So, in such a case is there a difference between those two functions ?
>>>
>>
>> Yes. The latter is if you need more fine-grained control (compile some files with other flags than the rest).
>>
>>
>>> Another question I have is when applying one or the other function, this will duplicate some of the compiler flags (e.g. O3). The only way I found to avoid this is to do the following:
>>>
>>> set(CMAKE_Fortran_FLAGS_RELEASE " ") set_target_properties(crysfml PROPERTIES COMPILE_FLAGS "-O3 -std=f2003 -funroll-loops -msse2")
>>>
>>> so everything looks as if by default the CMAKE_Fortran_FLAGS_RELEASE variable was set to "-O3" and then, the value stored in the COMPILE_FLAGS variable was appended to it (so in that case "-O3" + "-O3 -std=f2003 -funroll-loops -msse2" giving "-O3 -O3 -std=f2003 -funroll-loops -msse2"). Am I right ?
>>>
>>
>> Yes. RTFMing tells me:
>>
>> $ cmake --help-property COMPILE_FLAGS
>> cmake version 2.8.2
>> COMPILE_FLAGS
>> Additional flags to use when compiling this target's sources.
>>
>> The COMPILE_FLAGS property sets additional compiler flags used to
>> build sources within the target. Use COMPILE_DEFINITIONS to pass
>> additional preprocessor definitions
>>
>> So, it says that the flags are appended to the "standard" flags.
>>
>>
>>> thanks a lot
>>>
>>> Eric
>>>
>>
>> BTW: You shouldn't set -O3, -funroll-loops and -msse2 in COMPILE_FLAGS, since those are optimization flags. You should set them when you run cmake in CMAKE_Fortran_FLAGS_RELEASE.
>>
>> Michael
>>
>>
>
> thanks Michael fore the hint.
>
> So you mean that I should better write something like this if I really want to reset the compiler flags for the different kind of build (Debug, Release ...):
>
> if(CMAKE_BUILD_TYPE strequal Release)
>
> set(CMAKE_Fortran_FLAGS_RELEASE " ")
> set_target_properties(crysfml PROPERTIES COMPILE_Fortran_FLAGS_RELEASE "-O3 -std=f2003 -funroll-loops -msse2")
>
> elseif(CMAKE_BUILD_TYPE strequal Debug)
>
> set(CMAKE_Fortran_FLAGS_DEBUG " ") set_target_properties(crysfml PROPERTIES COMPILE_Fortran_FLAGS_DEBUG "-O3 -std=f2003 -funroll-loops -msse2")
>
> end()
>
> instead of using the COMPILE_FLAGS ?
>
> Eric
I'd suggest to leave it to the user, don't set those flags in the CMakeLists.txt at all. If you absolutely must/want to, remove the conditionals, the variables themselves act as "conditionals" in the sense that CMake only uses them for the corresponding configuration type. Your approach breaks down for multi-config IDE's (such as Visual Studio, Xcode etc.), where CMAKE_BUILD_TYPE is irrelevant. Also, it's not a good idea to just set them like you do, since it's very surprising for users if their changes in the cache don't have any effect.
The only reasonable way to really override the default compiler flags is probably to provide your own Compiler/*-Fortran.cmake files and set CMAKE_MODULE_PATH accordingly before the project() (or enable_language()) call that activates Fortran support.
Michael
--
There is always a well-known solution to every human problem -- neat, plausible, and wrong.
H. L. Mencken
-------------- next part --------------
A non-text attachment was scrubbed...
Name: PGP.sig
Type: application/pgp-signature
Size: 195 bytes
Desc: This is a digitally signed message part
URL: <http://www.cmake.org/pipermail/cmake/attachments/20100922/c872d27e/attachment.pgp>
More information about the CMake
mailing list