[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_CONFIG 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_CONFIG 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