[CMake] Build library with specific compil flags for a few files
Hello everybody, I have a library for which almost all the files should be compiled (e.g. g95) with the same compilation flags (that I will call later flag_debug, flag_release ...) excepted a few ones for which I have to use slightly different compilation flags (called later flag1_debug, flag1_release ...). As in both cases the flags are different from the default ones, I was told on the cmake list to create a personal Compiler/G95-Fortran.cmake file that was placed in my Src directory and that contains the following lines: set(CMAKE_Fortran_FLAGS_INIT "") set(CMAKE_Fortran_FLAGS_DEBUG_INIT flag_debug) set(CMAKE_Fortran_FLAGS_RELEASE_INIT flag_release) set(CMAKE_Fortran_MODDIR_FLAG "-fmod=") set(CMAKE_Fortran_VERBOSE_FLAG "-v") This file allowing to avoid the declaration of the flags in the CMakeLists.txt file. But, how to proceed for the few files for which I have to use different compiler flags ? In that case, I do not see any way to escape from writing specifically the flags in the CMakeLists.txt file with command such as: if(CMAKE_BUILD_TYPE STREQUAL RELEASE) set_source_files_properties(File1 PROPERTIES COMPILE_FLAGS flag1_release) set_source_files_properties(File2 PROPERTIES COMPILE_FLAGS flag1_release) ... elseif(CMAKE_BUILD_TYPE STREQUAL DEBUG) set_source_files_properties(File1 PROPERTIES COMPILE_FLAGS flag1_debug) set_source_files_properties(File2 PROPERTIES COMPILE_FLAGS flag1_debug) ... ... endif() would you have any idea about how to esacpe from this kind of implementation ? is that so ugly ? thanks Eric -- Eric Pellegrini Calcul Scientifique Insitut Laue-Langevin Grenoble, France ___ 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
Re: [CMake] Build library with specific compil flags for a few files
On 28. Sep, 2010, at 16:08 , pellegrini wrote: > Hello everybody, > > I have a library for which almost all the files should be compiled (e.g. g95) > with the same compilation flags (that I will call later flag_debug, > flag_release ...) excepted a few ones for which I have to use slightly > different compilation flags (called later flag1_debug, flag1_release ...). > > As in both cases the flags are different from the default ones, I was told on > the cmake list to create a personal Compiler/G95-Fortran.cmake file that was > placed in my Src directory and that contains the following lines: > > set(CMAKE_Fortran_FLAGS_INIT "") > set(CMAKE_Fortran_FLAGS_DEBUG_INIT flag_debug) > set(CMAKE_Fortran_FLAGS_RELEASE_INIT flag_release) > set(CMAKE_Fortran_MODDIR_FLAG "-fmod=") > set(CMAKE_Fortran_VERBOSE_FLAG "-v") > > This file allowing to avoid the declaration of the flags in the > CMakeLists.txt file. But, how to proceed for the few files for which I have > to use > different compiler flags ? In that case, I do not see any way to escape from > writing specifically the flags in the CMakeLists.txt file with command such > as: > > if(CMAKE_BUILD_TYPE STREQUAL RELEASE) > set_source_files_properties(File1 PROPERTIES COMPILE_FLAGS flag1_release) > set_source_files_properties(File2 PROPERTIES COMPILE_FLAGS flag1_release) > ... > elseif(CMAKE_BUILD_TYPE STREQUAL DEBUG) > set_source_files_properties(File1 PROPERTIES COMPILE_FLAGS flag1_debug) > set_source_files_properties(File2 PROPERTIES COMPILE_FLAGS flag1_debug) ... > ... > endif() > > would you have any idea about how to esacpe from this kind of implementation > ? is that so ugly ? > > thanks > > Eric Well, for one you don't need separate set_source_files_properties commands for every single file (that is, if the flags are the same): if(CMAKE_BUILD_TYPE STREQUAL Release) # notice the capitalization! set_source_files_properties(File1 File2 File3 PROPERTIES COMPILE_FLAGS ...) elseif(CMAKE_BUILD_TYPE STREQUAL Debug) # notice the capitalization! set_source_files_properties(File1 File2 File3 PROPERTIES COMPILE_FLAGS ...) endif() However: such a scheme will break with multi-configuration IDEs since CMAKE_BUILD_TYPE is not known when CMake runs because the user can choose the configuration in the IDE afterwards. Unfortunately there are no COMPILE_FLAGS_ properties... I think that currently the only reliable way of doing this is to split the special sources out into a separate directory and compile them there as a static library. Michael -- There is always a well-known solution to every human problem -- neat, plausible, and wrong. H. L. Mencken PGP.sig Description: This is a digitally signed message part ___ 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
Re: [CMake] Build library with specific compil flags for a few files
Hi Michael, so if I get you right I should organize my library as follow: src/ Compiler/G95_Fortran.cmake CMakeLists.txt my_general_f90_src_files special_flag_src/ Compiler/G95_Fortran.cmake CMakeLists.txt my_special_f90_src_files where the nested CMakeLists.txt will call add_library(my_special_f90_files.a my_special_f90_src_files ...) and where the main CMakeLists.txt file will call add_library(my_general_f90_files.a my_general_f90_src_files ...) not forgotting in the latter case to specify the dependancy on the "special_f90_files.a" library. In doing so, both static libraries will be compiled according to the compilation flags stored in their respective Compiler/G95_Fortran.cmake files. sorry for the naive questions but I just started with CMake two weeks ago and I am quite in hurry to provide a first example to convince my boss that using CMake is the right solution ... thanks again Eric > > On 28. Sep, 2010, at 16:08 , pellegrini wrote: > >> Hello everybody, >> >> I have a library for which almost all the files should be compiled (e.g. >> g95) with the same compilation flags (that I will call later >> flag_debug, flag_release ...) excepted a few ones for which I have to >> use slightly different compilation flags (called later flag1_debug, >> flag1_release ...). >> >> As in both cases the flags are different from the default ones, I was >> told on the cmake list to create a personal Compiler/G95-Fortran.cmake >> file that was placed in my Src directory and that contains the following >> lines: >> >> set(CMAKE_Fortran_FLAGS_INIT "") >> set(CMAKE_Fortran_FLAGS_DEBUG_INIT flag_debug) >> set(CMAKE_Fortran_FLAGS_RELEASE_INIT flag_release) >> set(CMAKE_Fortran_MODDIR_FLAG "-fmod=") >> set(CMAKE_Fortran_VERBOSE_FLAG "-v") >> >> This file allowing to avoid the declaration of the flags in the >> CMakeLists.txt file. But, how to proceed for the few files for which I >> have to use >> different compiler flags ? In that case, I do not see any way to escape >> from writing specifically the flags in the CMakeLists.txt file with >> command such as: >> >> if(CMAKE_BUILD_TYPE STREQUAL RELEASE) >> set_source_files_properties(File1 PROPERTIES COMPILE_FLAGS >> flag1_release) >> set_source_files_properties(File2 PROPERTIES COMPILE_FLAGS >> flag1_release) ... >> elseif(CMAKE_BUILD_TYPE STREQUAL DEBUG) >> set_source_files_properties(File1 PROPERTIES COMPILE_FLAGS >> flag1_debug) >> set_source_files_properties(File2 PROPERTIES COMPILE_FLAGS >> flag1_debug) ... >> ... >> endif() >> >> would you have any idea about how to esacpe from this kind of >> implementation ? is that so ugly ? >> >> thanks >> >> Eric > > Well, for one you don't need separate set_source_files_properties commands > for every single file (that is, if the flags are the same): > > if(CMAKE_BUILD_TYPE STREQUAL Release) # notice the capitalization! > set_source_files_properties(File1 File2 File3 PROPERTIES > COMPILE_FLAGS ...) > elseif(CMAKE_BUILD_TYPE STREQUAL Debug) # notice the capitalization! > set_source_files_properties(File1 File2 File3 PROPERTIES > COMPILE_FLAGS ...) > endif() > > However: such a scheme will break with multi-configuration IDEs since > CMAKE_BUILD_TYPE is not known when CMake runs because the user can choose > the configuration in the IDE afterwards. Unfortunately there are no > COMPILE_FLAGS_ properties... > > I think that currently the only reliable way of doing this is to split the > special sources out into a separate directory and compile them there as a > static library. > > Michael > > -- > There is always a well-known solution to every human problem -- neat, > plausible, and wrong. > H. L. Mencken > > ___ 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