diff --git a/CMakeLists.txt b/CMakeLists.txt
index a010f9b569173cb35fd6f00372eba50905c36284..54c45126c835d64f7b3715cd1f2fe33b18ce1f02 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,42 +1,31 @@
-cmake_minimum_required(VERSION 3.10)
+cmake_minimum_required(VERSION 3.1)
 
 project(bgslibrary)
 
-# cmake -D BGS_PYTHON_SUPPORT=ON ..
-if(NOT DEFINED BGS_PYTHON_SUPPORT)
-  set(BGS_PYTHON_SUPPORT OFF)
-elseif()
-  # add_definitions(-DBGS_PYTHON_SUPPORT)
-endif()
-# cmake -D BGS_PYTHON_ONLY=ON ..
-if(NOT DEFINED BGS_PYTHON_ONLY)
-  set(BGS_PYTHON_ONLY OFF)
-elseif()
-  # add_definitions(-DBGS_PYTHON_ONLY)
-endif()
-# cmake -D BGS_CORE_STATIC=ON ..
-if(NOT DEFINED BGS_CORE_STATIC)
-  set(BGS_CORE_STATIC OFF)
-elseif()
-  # add_definitions(-DBGS_CORE_STATIC)
-endif()
-message(STATUS "")
-message(STATUS "BGS_PYTHON_SUPPORT: ${BGS_PYTHON_SUPPORT}")
-message(STATUS "BGS_PYTHON_ONLY:    ${BGS_PYTHON_ONLY}")
-message(STATUS "BGS_CORE_STATIC:    ${BGS_CORE_STATIC}")
-
-# cmake -D BGS_PYTHON_SUPPORT=ON -D BGS_PYTHON_VERSION=3 ..
-if(NOT DEFINED BGS_PYTHON_VERSION)
-  set(BGS_PYTHON_VERSION 3)
-endif()
-if(BGS_PYTHON_SUPPORT)
-  message(STATUS "PYTHON VERSION: ${BGS_PYTHON_VERSION}")
-endif()
+include(CheckCXXCompilerFlag)
 
 set(CMAKE_CXX_STANDARD 14)
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
+set(CMAKE_CXX_EXTENSIONS OFF)
+set(CMAKE_POSITION_INDEPENDENT_CODE ON)
+
+function(append_if condition value)
+  if (${condition})
+    foreach(variable ${ARGN})
+      set(${variable} "${${variable}} ${value}" PARENT_SCOPE)
+    endforeach(variable)
+  endif()
+endfunction()
+
+if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR
+    CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR
+    CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
+  check_cxx_compiler_flag("-fvisibility-inlines-hidden" SUPPORTS_FVISIBILITY_INLINES_HIDDEN_FLAG)
+  append_if(SUPPORTS_FVISIBILITY_INLINES_HIDDEN_FLAG "-fvisibility=hidden -fvisibility-inlines-hidden" CMAKE_CXX_FLAGS)
+endif()
 
 if(UNIX)
-  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++0x")
+  #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++0x")
   set(CMAKE_MACOSX_RPATH 1)
 endif(UNIX)
 
@@ -46,8 +35,6 @@ if (POLICY CMP0042)
   cmake_policy(SET CMP0042 NEW)
 endif()
 
-set(CMAKE_POSITION_INDEPENDENT_CODE ON)
-
 #set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99")
 #set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake-modules)
 
@@ -91,6 +78,37 @@ if(UNIX)
   #ADD_DEFINITIONS(-Wconversion -Wfloat-equal)
 endif(UNIX)
 
+# cmake -D BGS_PYTHON_SUPPORT=ON ..
+if(NOT DEFINED BGS_PYTHON_SUPPORT)
+  set(BGS_PYTHON_SUPPORT OFF)
+else()
+  # add_definitions(-DBGS_PYTHON_SUPPORT)
+endif()
+# cmake -D BGS_PYTHON_ONLY=ON ..
+if(NOT DEFINED BGS_PYTHON_ONLY)
+  set(BGS_PYTHON_ONLY OFF)
+else()
+  # add_definitions(-DBGS_PYTHON_ONLY)
+endif()
+# cmake -D BGS_CORE_STATIC=ON ..
+if(NOT DEFINED BGS_CORE_STATIC)
+  set(BGS_CORE_STATIC OFF)
+else()
+  # add_definitions(-DBGS_CORE_STATIC)
+endif()
+message(STATUS "")
+message(STATUS "BGS_PYTHON_SUPPORT: ${BGS_PYTHON_SUPPORT}")
+message(STATUS "BGS_PYTHON_ONLY:    ${BGS_PYTHON_ONLY}")
+message(STATUS "BGS_CORE_STATIC:    ${BGS_CORE_STATIC}")
+
+# cmake -D BGS_PYTHON_SUPPORT=ON -D BGS_PYTHON_VERSION=3 ..
+if(NOT DEFINED BGS_PYTHON_VERSION)
+  set(BGS_PYTHON_VERSION 3)
+endif()
+if(BGS_PYTHON_SUPPORT)
+  message(STATUS "PYTHON VERSION: ${BGS_PYTHON_VERSION}")
+endif()
+
 set(OpenCV_STATIC OFF)
 find_package(OpenCV REQUIRED)
 if(OpenCV_FOUND)
@@ -196,9 +214,13 @@ if(${OpenCV_VERSION} VERSION_LESS 2.4.3)
 endif()
 
 if(BGS_CORE_STATIC)
+  message(STATUS "Bulding bgslibrary_core STATIC")
   add_library(bgslibrary_core STATIC ${bgs_src} ${tools_src} ${utils_src} ${bgs_inc} ${tools_inc} ${utils_inc})
-elseif()
+  #set_property(TARGET bgslibrary_core PROPERTY POSITION_INDEPENDENT_CODE ON)
+else()
+  message(STATUS "Bulding bgslibrary_core SHARED")
   add_library(bgslibrary_core SHARED ${bgs_src} ${tools_src} ${utils_src} ${bgs_inc} ${tools_inc} ${utils_inc})
+  target_link_libraries(bgslibrary_core ${OpenCV_LIBS})
   # generates the export header bgslibrary_core_EXPORTS.h automatically
   include(GenerateExportHeader)
   GENERATE_EXPORT_HEADER(bgslibrary_core
@@ -206,8 +228,7 @@ elseif()
       EXPORT_MACRO_NAME bgslibrary_core_EXPORTS
       EXPORT_FILE_NAME bgslibrary_core_EXPORTS.h
       STATIC_DEFINE BGSLIBRARY_CORE_EXPORTS_BUILT_AS_STATIC)
-  target_link_libraries(bgslibrary_core ${OpenCV_LIBS})
-  set_property(TARGET bgslibrary_core PROPERTY PUBLIC_HEADER ${bgs_inc} ${tools_inc} ${utils_inc})
+  #set_property(TARGET bgslibrary_core PROPERTY PUBLIC_HEADER ${bgs_inc} ${tools_inc} ${utils_inc})
 endif()
 
 if(BGS_PYTHON_SUPPORT)
@@ -227,6 +248,7 @@ if(BGS_PYTHON_SUPPORT)
 
   # Set the output library name to bgslibrary because that's what setup.py and distutils expects.
   set_property(TARGET bgs_python PROPERTY OUTPUT_NAME "pybgs")
+  #set_property(TARGET bgs_python PROPERTY POSITION_INDEPENDENT_CODE ON)
 endif()
 
 #if(WIN32)