I'm using CMake (3.12 currently) in Windows 10 to build a DLL to be
compatible with what an existing program expects. To this end, I need
near-total control over the compiler and linker flags used to generate that
DLL.

I created a very simple project, with a single compilation unit, main.c,
containing

int main(void) { return 0; }

My CMakeLists.txt started off containing only:

cmake_minimum_required(VERSION 3.8)
add_executable(main "main.c")

I then generated the build files for Visual Studio 2017 and ran "cmake
--build .". The cl.exe contained a number of flags, presumably sensible
defaults for VS 2017. I have no issue with that. But now I want to change
those flags, starting with removing all of them completely. Obviously not
super useful, but at this point I just want to know how to start from a
clean slate.

Adding target_compile_options() won't work because it just appends to the
defaults. Also totally understandable, but not what I need here.

I tried adding this to CMakeLists.txt:

set_target_properties(main PROPERTIES COMPILER_OPTIONS "")

I still end up with a bunch of compiler flags. So I try:

set(CMAKE_C_FLAGS "")
set(CMAKE_C_FLAGS_DEBUG "")

I'm not 100% that the latter is relevant, because I think the "_DEBUG"
affects the build *type* (a Makefile generator thing) and not the build
*configuration* (a VS thing). But I try it anyway. I still get lots of
compiler flags. Specifically, at this point I have:

/c /nologo /W1 /WX- /diagnostics:classic /O2 /Oy- /D
"CMAKE_INTDIR=\"Debug\"" /D _MBCS /Gm- /MD /GS /fp:precise /Zc:wchar_t
/Zc:forScope /Zc:inline /Fo"main.dir\Debug\\" /Fd"main.dir\Debug\vc141.pdb"
/Gd /TC /analyze- /FC /errorReport:queue

Some flags I recognise as perfectly harmless, others could in theory be
overridden by appending contrasting flags. However some like /fp:precise
have (AFAIK) a real effect on code generation. Others might not have an
override, or might produce warnings if overridden.

Finally, I try something I saw on Stackoverflow[1]. I create a file
"ClearVS.cmake":

if (MSVC)
    set(CMAKE_C_FLAGS_INIT "")
    set(CMAKE_CXX_FLAGS_INIT "")
    set(CMAKE_C_FLAGS_DEBUG_INIT "")
    set(CMAKE_CXX_FLAGS_DEBUG_INIT "")
endif()

In my CMakeLists.txt I add:

set(CMAKE_USER_MAKE_RULES_OVERRIDE "ClearVS.cmake")

...right after cmake_minimum_required(). The compiler flags remain.

So I have two questions:

1. How do I clear default compiler flags for the Visual Studio generator? I
would strongly prefer a solution that can apply to specific targets, but if
not, so be it.

2. How do I... I guess, research this behaviour? Where is it documented,
what these default flags are, where they come from eg. which ones apply to
all build types, which ones are there because I selected Debug instead of
Release, which ones are there because it's VS 2017 not VS 2015, etc?

Again, let me emphasise that I absolutely get the need for a set of
sensible default (and build type-specific) flags. It's a good thing that
CMake has this. But in my situation, I need a bit more control.

- Jason

[1] https://stackoverflow.com/a/46000520/188535
-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
https://cmake.org/mailman/listinfo/cmake

Reply via email to