[waffle] [PATCH 14/18] cmake: set most compiler flags/defines in a single location

Emil Velikov emil.l.velikov at gmail.com
Tue Jul 22 20:31:40 PDT 2014


Do not define the same thing (_XOPEN_SOURCE) three times and use
compiler specific flags.

 - GCC: Move visibility=hidden to global scale.
 - WIN32: Don't do TLS.
 - Static link Windows builds
   - MINGW: link-in libgcc*.dll
   - MSVC: link-in msvcrt*.dll

Signed-off-by: Emil Velikov <emil.l.velikov at gmail.com>
---
 cmake/Modules/WaffleDefineCompilerFlags.cmake | 105 ++++++++++++++++++--------
 src/waffle/CMakeLists.txt                     |   1 -
 src/waffle/core/wcore_error.c                 |   2 -
 src/waffle/core/wcore_error_unittest.c        |   4 -
 src/waffle_test/wt_runner.c                   |   4 -
 third_party/threads/CMakeLists.txt            |   2 -
 6 files changed, 75 insertions(+), 43 deletions(-)

diff --git a/cmake/Modules/WaffleDefineCompilerFlags.cmake b/cmake/Modules/WaffleDefineCompilerFlags.cmake
index b802250..710b7e0 100644
--- a/cmake/Modules/WaffleDefineCompilerFlags.cmake
+++ b/cmake/Modules/WaffleDefineCompilerFlags.cmake
@@ -33,51 +33,96 @@ function(waffle_add_c_flag flag var)
     endif()
 endfunction()
 
-set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --std=c99")
-set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
-set(CMAKE_C_FLAGS_DEBUG "-g3 -O0 -DDEBUG")
+if (NOT MSVC)
+    #
+    # compiler flags
+    #
+    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --std=c99")
+    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
+    set(CMAKE_C_FLAGS_DEBUG "-g3 -O0 -DDEBUG")
 
-# Use '-g1' to produce enough debug info for generating backtraces, but not
-# enough for single-stepping.
-set(CMAKE_C_FLAGS_RELEASE "-g1 -O2 -DNDEBUG")
+    # Use '-g1' to produce enough debug info for generating backtraces, but not
+    # enough for single-stepping.
+    set(CMAKE_C_FLAGS_RELEASE "-g1 -O2 -DNDEBUG")
 
-waffle_add_c_flag("-Werror=implicit-function-declaration" WERROR_IMPLICIT_FUNCTION_DECLARATION)
-waffle_add_c_flag("-Werror=incompatible-pointer-types" WERROR_INCOMPATIBLE_POINTER_TYPES)
-waffle_add_c_flag("-Werror=int-conversion" WERROR_INT_CONVERSION)
+    waffle_add_c_flag("-Werror=implicit-function-declaration" WERROR_IMPLICIT_FUNCTION_DECLARATION)
+    waffle_add_c_flag("-Werror=incompatible-pointer-types" WERROR_INCOMPATIBLE_POINTER_TYPES)
+    waffle_add_c_flag("-Werror=int-conversion" WERROR_INT_CONVERSION)
+    waffle_add_c_flag("-fvisibility=hidden" WITH_VISIBILITY_HIDDEN)
 
-if(waffle_on_linux)
-    # On MacOS, the SSE2 headers trigger this error.
-    waffle_add_c_flag("-Werror=missing-prototypes" WERROR_MISSING_PROTOTYPES)
-endif()
+    if(waffle_on_linux)
+        # On MacOS, the SSE2 headers trigger this error.
+        waffle_add_c_flag("-Werror=missing-prototypes" WERROR_MISSING_PROTOTYPES)
+    endif()
+
+    if(MINGW)
+        # Avoid depending on MinGW runtime DLLs
+        check_c_compiler_flag(-static-libgcc HAVE_STATIC_LIBGCC_FLAG)
+        if (HAVE_STATIC_LIBGCC_FLAG)
+            set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libgcc")
+            set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -static-libgcc")
+            set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -static-libgcc")
+        endif ()
+    else()
+        # Avoid using TLS with MinGW builds.
+        waffle_check_thread_local_storage()
+    endif()
+else()
+   # XXX: and update the threads code
+   # http://msdn.microsoft.com/en-us/library/aa383745.aspx
+    if(CMAKE_GENERATOR_TOOLSET MATCHES "_xp$")
+        # Windows XP
+        add_definitions(-D_WIN32_WINNT=0x0501 -DWINVER=0x0501)
+    else()
+        # Windows 7
+        add_definitions(-D_WIN32_WINNT=0x0601 -DWINVER=0x0601)
+    endif()
 
-waffle_check_thread_local_storage()
+    # Adjust warnings
+    add_definitions(-D_CRT_NONSTDC_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS)
 
-if(waffle_has_tls)
-    add_definitions(-DWAFFLE_HAS_TLS)
-endif()
+    # Use static runtime
+    # http://www.cmake.org/Wiki/CMake_FAQ#How_can_I_build_my_MSVC_application_with_a_static_runtime.3F
+    foreach(flag_var
+        CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO
+    )
+        if(${flag_var} MATCHES "/MD")
+            string (REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
+        endif()
+    endforeach(flag_var)
 
-if(waffle_has_tls_model_initial_exec)
-    add_definitions(-DWAFFLE_HAS_TLS_MODEL_INITIAL_EXEC)
 endif()
 
 if(waffle_on_mac)
     add_definitions(-DWAFFLE_HAS_CGL)
 endif()
 
-if(waffle_has_glx)
-    add_definitions(-DWAFFLE_HAS_GLX)
-endif()
+if(waffle_on_linux)
+    if(waffle_has_glx)
+        add_definitions(-DWAFFLE_HAS_GLX)
+    endif()
 
-if(waffle_has_wayland)
-    add_definitions(-DWAFFLE_HAS_WAYLAND)
-endif()
+    if(waffle_has_wayland)
+        add_definitions(-DWAFFLE_HAS_WAYLAND)
+    endif()
 
-if(waffle_has_x11_egl)
-    add_definitions(-DWAFFLE_HAS_X11_EGL)
-endif()
+    if(waffle_has_x11_egl)
+        add_definitions(-DWAFFLE_HAS_X11_EGL)
+    endif()
+
+    if(waffle_has_gbm)
+        add_definitions(-DWAFFLE_HAS_GBM)
+    endif()
+
+    if(waffle_has_tls)
+        add_definitions(-DWAFFLE_HAS_TLS)
+    endif()
+
+    if(waffle_has_tls_model_initial_exec)
+        add_definitions(-DWAFFLE_HAS_TLS_MODEL_INITIAL_EXEC)
+    endif()
 
-if(waffle_has_gbm)
-    add_definitions(-DWAFFLE_HAS_GBM)
+    add_definitions(-D_XOPEN_SOURCE=600)
 endif()
 
 if(waffle_on_windows)
diff --git a/src/waffle/CMakeLists.txt b/src/waffle/CMakeLists.txt
index 7e4c007..9507398 100644
--- a/src/waffle/CMakeLists.txt
+++ b/src/waffle/CMakeLists.txt
@@ -169,7 +169,6 @@ set_source_files_properties(
     ${waffle_sources}
     PROPERTIES
     LANGUAGE C
-    COMPILE_FLAGS "-fvisibility=hidden"
     )
 
 include_directories(
diff --git a/src/waffle/core/wcore_error.c b/src/waffle/core/wcore_error.c
index 157b47e..fdf70f8 100644
--- a/src/waffle/core/wcore_error.c
+++ b/src/waffle/core/wcore_error.c
@@ -23,8 +23,6 @@
 // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-#define _XOPEN_SOURCE 600 // for strerror_r
-
 #include <errno.h>
 #include <stdarg.h>
 #include <stdbool.h>
diff --git a/src/waffle/core/wcore_error_unittest.c b/src/waffle/core/wcore_error_unittest.c
index 722930a..7435e51 100644
--- a/src/waffle/core/wcore_error_unittest.c
+++ b/src/waffle/core/wcore_error_unittest.c
@@ -23,10 +23,6 @@
 // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-#ifdef __linux__
-#   define _XOPEN_SOURCE 600
-#endif
-
 #include <setjmp.h>
 #include <stdarg.h>
 #include <stdio.h>
diff --git a/src/waffle_test/wt_runner.c b/src/waffle_test/wt_runner.c
index 729c033..bd1e561 100644
--- a/src/waffle_test/wt_runner.c
+++ b/src/waffle_test/wt_runner.c
@@ -23,10 +23,6 @@
 // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-#ifdef __linux__
-#   define _XOPEN_SOURCE 500 // for strdup()
-#endif
-
 #include "wt_runner.h"
 
 #include <stdbool.h>
diff --git a/third_party/threads/CMakeLists.txt b/third_party/threads/CMakeLists.txt
index 3e12ae7..1cc6092 100644
--- a/third_party/threads/CMakeLists.txt
+++ b/third_party/threads/CMakeLists.txt
@@ -1,7 +1,5 @@
 include_directories (${CMAKE_CURRENT_SOURCE_DIR})
 
-add_definitions(-D_XOPEN_SOURCE=600)
-
 if(WIN32)
     set(threads_sources threads_win32.c)
 else()
-- 
2.0.2



More information about the waffle mailing list