<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=us-ascii"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:EN-US;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:EN-US;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-AU link="#0563C1" vlink="#954F72"><div class=WordSection1><p class=MsoNormal>Hi, I am trying to let the user pick their own compiler/linker flags through the cache, whilst providing sane defaults. <o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>The problem is, I rely on the CMAKE_CXX_COMPILER_ID variable to set these defaults which is only available after the project() command is used. This also causes the CMAKE_CXX_FLAGS_{target} and CMAKE_EXE_LINKER_FLAGS_{target} to be populated in the cache by CMake, with defaults that do not work. Trying to set these flags after the project() command doesn’t work unless the FORCE flag is used… but then the user wouldn’t be able to override them.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>The workaround I used involved introducing a set of “USER_*” variables that are available in the cache (populated initially with the sane defaults), which then overrides the CMAKE_* variables above with the FORCE flag. It works, but I kind of think there should be a better way, especially since people who have used CMake before might try to set –DCMAKE_* using the command line or other wise and find it doesn’t work.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Example from my CMakeLists.txt (working). I use INTERNAL instead of FORCE here so the user does not see this in the cmake-gui:<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>project(myproject CXX)<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>if(${CMAKE_CXX_COMPILER_ID} STREQUAL GNU) <o:p></o:p></p><p class=MsoNormal>               set(USER_CXX_FLAGS_DEBUG           "-g -std=c++14"     CACHE STRING "CMake CXX compiler flags (Debug)."          )<o:p></o:p></p><p class=MsoNormal>               set(USER_EXE_LINKER_FLAGS_DEBUG           "" CACHE STRING "CMake CXX linker flags (Debug)."            )<o:p></o:p></p><p class=MsoNormal>elseif(${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC)<o:p></o:p></p><p class=MsoNormal>               set(USER_CXX_FLAGS_DEBUG           "/MTd /Zi /Ob0 /Od /RTC1 /MP /std=c++14" CACHE STRING "CMake CXX compiler flags (Debug)."          )<o:p></o:p></p><p class=MsoNormal>               set(USER_EXE_LINKER_FLAGS_DEBUG           "/machine:x64 /DEBUG" CACHE STRING "CMake CXX linker flags (Debug)."          )<o:p></o:p></p><p class=MsoNormal>endif()<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>… some lines below … <o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>set(CMAKE_CXX_FLAGS_DEBUG                  "${USER_CXX_FLAGS_DEBUG}"                  CACHE INTERNAL "")<o:p></o:p></p><p class=MsoNormal>set(CMAKE_EXE_LINKER_FLAGS_DEBUG           "${USER_EXE_LINKER_FLAGS_DEBUG}"           CACHE INTERNAL "")<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Ideally, I would like to be able to do something like this (doesn’t work):<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>project(myproject CXX)<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>if(${CMAKE_CXX_COMPILER_ID} STREQUAL GNU) <o:p></o:p></p><p class=MsoNormal>               set(CMAKE_CXX_FLAGS_DEBUG           "-g -std=c++14"     CACHE STRING "CMake CXX compiler flags (Debug)."          )<o:p></o:p></p><p class=MsoNormal>               set(CMAKE_EXE_LINKER_FLAGS_DEBUG           "" CACHE STRING "CMake CXX linker flags (Debug)."            )<o:p></o:p></p><p class=MsoNormal>elseif(${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC)<o:p></o:p></p><p class=MsoNormal>               set(CMAKE_CXX_FLAGS_DEBUG           "/MTd /Zi /Ob0 /Od /RTC1 /MP /std=c++14" CACHE STRING "CMake CXX compiler flags (Debug)."          )<o:p></o:p></p><p class=MsoNormal>               set(CMAKE_EXE_LINKER_FLAGS_DEBUG           "/machine:x64 /DEBUG" CACHE STRING "CMake CXX linker flags (Debug)."          )<o:p></o:p></p><p class=MsoNormal>endif()<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Thanks for your time!<o:p></o:p></p><p class=MsoNormal>Marco.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p></div></body></html>