windows: for data exports use explicit extern

LWS_EXTERN needs to be empty for windows when declaring functions in the
headers.  But for data, it needs the explicit extern otherwise on windows
or mingw based builds, it thinks we are redeclaring the data each time.
diff --git a/.sai.json b/.sai.json
index b490c81..445f22d 100644
--- a/.sai.json
+++ b/.sai.json
@@ -55,7 +55,7 @@
 		"freertos-espidf/xl6-esp32/gcc": {
 			# official way to get sdkconfig.h is idf.py menuconfig, but
 			# no obvious way to do that in CI
-			"build":	"rm -rf ebuild ; mkdir ebuild; cd ebuild; cp -rp ../minimal-examples/embedded/lws-minimal-esp32 . ;  cd lws-minimal-esp32 ; . /opt/esp/esp-idf/export.sh ; ln -sf ../.. libwebsockets ; idf.py set-target esp32 && cp libwebsockets/minimal-examples/embedded/lws-minimal-esp32/sdkconfig . && cp sdkconfig.h build && idf.py build && cd build && /usr/local/bin/sai-device freertos-esp32 ESPPORT=0 ctest --output-on-failure",
+			"build":	"rm -rf ebuild ; mkdir ebuild; cd ebuild; cp -rp ../minimal-examples/embedded/lws-minimal-esp32 . ;  cd lws-minimal-esp32 ; . /opt/esp/esp-idf/export.sh ; ln -sf ../.. libwebsockets ; idf.py set-target esp32 && cp libwebsockets/minimal-examples/embedded/lws-minimal-esp32/sdkconfig . && cp sdkconfig.h build && idf.py build && cd build && /usr/local/bin/sai-device freertos-espidf ESPPORT=0 ctest --output-on-failure",
 			"default":	false
 		},
 		"linux-fedora-32/riscv64-virt/gcc": {
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0dc5ad1..2ad8250 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -262,17 +262,25 @@
 
 macro(exports_to_parent_scope)
 	set(SOURCES ${SOURCES} PARENT_SCOPE)
-	set(LIB_LIST ${LIB_LIST} PARENT_SCOPE)
+	if (LIB_LIST)
+		set(LIB_LIST ${LIB_LIST} PARENT_SCOPE)
+	endif()
 	get_property(_CURR DIRECTORY PROPERTY INCLUDE_DIRECTORIES) 
 	set(_CMAKE_INC_LIST ${_CURR} PARENT_SCOPE)
-	set(LWS_LIB_BUILD_INC_PATHS ${LWS_LIB_BUILD_INC_PATHS} PARENT_SCOPE)
+	if (LWS_LIB_BUILD_INC_PATHS)
+		set(LWS_LIB_BUILD_INC_PATHS ${LWS_LIB_BUILD_INC_PATHS} PARENT_SCOPE)
+	endif()
 endmacro()
 
 macro(export_to_parent_intermediate)
 	set(SOURCES ${SOURCES} PARENT_SCOPE)
-	set(LIB_LIST ${LIB_LIST} PARENT_SCOPE)
+	if (LIB_LIST)
+		set(LIB_LIST ${LIB_LIST} PARENT_SCOPE)
+	endif()
 	set(_CMAKE_INC_LIST ${_CMAKE_INC_LIST} PARENT_SCOPE)
-	set(LWS_LIB_BUILD_INC_PATHS ${LWS_LIB_BUILD_INC_PATHS} PARENT_SCOPE)
+	if (LWS_LIB_BUILD_INC_PATHS)
+		set(LWS_LIB_BUILD_INC_PATHS ${LWS_LIB_BUILD_INC_PATHS} PARENT_SCOPE)
+	endif()
 endmacro()
 
 #
@@ -713,9 +721,15 @@
 	add_definitions(-DWINVER=0x0601 -D_WIN32_WINNT=0x0601)
 endif()
 
-source_group("Headers Private"  FILES ${HDR_PRIVATE})
-source_group("Headers Public"   FILES ${HDR_PUBLIC})
-source_group("Sources"          FILES ${SOURCES})
+if (HDR_PRIVATE)
+	source_group("Headers Private"  FILES ${HDR_PRIVATE})
+endif()
+if (HDR_PUBLIC)
+	source_group("Headers Public"   FILES ${HDR_PUBLIC})
+endif()
+if (SOURCES)
+	source_group("Sources"          FILES ${SOURCES})
+endif()
 if (RESOURCES)
 	source_group("Resources"        FILES ${RESOURCES})
 endif()
@@ -799,8 +813,9 @@
   set(DEF_INSTALL_CMAKE_DIR lib${LIB_SUFFIX}/cmake/libwebsockets)
 endif()
 
-set(LWS__INCLUDE_DIRS 
-    "\${LWS_CMAKE_DIR}/${REL_INCLUDE_DIR}") 
+if (DEFINED REL_INCLUDE_DIR)
+    set(LWS__INCLUDE_DIRS "\${LWS_CMAKE_DIR}/${REL_INCLUDE_DIR}")
+endif() 
 
 configure_file(${PROJECT_SOURCE_DIR}/cmake/libwebsockets-config.cmake.in
                 ${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/libwebsockets-config.cmake 
diff --git a/include/libwebsockets/lws-misc.h b/include/libwebsockets/lws-misc.h
index 47e7ba0..f71158a 100644
--- a/include/libwebsockets/lws-misc.h
+++ b/include/libwebsockets/lws-misc.h
@@ -710,9 +710,9 @@
 	uint64_t factor;
 } lws_humanize_unit_t;
 
-LWS_VISIBLE LWS_EXTERN const lws_humanize_unit_t humanize_schema_si[7];
-LWS_VISIBLE LWS_EXTERN const lws_humanize_unit_t humanize_schema_si_bytes[7];
-LWS_VISIBLE LWS_EXTERN const lws_humanize_unit_t humanize_schema_us[8];
+LWS_VISIBLE extern const lws_humanize_unit_t humanize_schema_si[7];
+LWS_VISIBLE extern const lws_humanize_unit_t humanize_schema_si_bytes[7];
+LWS_VISIBLE extern const lws_humanize_unit_t humanize_schema_us[8];
 
 /**
  * lws_humanize() - Convert possibly large number to human-readable uints
diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt
index 9b6001c..3fba3eb 100644
--- a/lib/CMakeLists.txt
+++ b/lib/CMakeLists.txt
@@ -85,7 +85,9 @@
 	endif()
 endif()
 
-set(CMAKE_REQUIRED_LIBRARIES ${LIB_LIST} ${CMAKE_REQUIRED_LIBRARIES})
+if (LIB_LIST)
+	set(CMAKE_REQUIRED_LIBRARIES ${LIB_LIST} ${CMAKE_REQUIRED_LIBRARIES})
+endif()
 
 if (LWS_WITH_ZLIB)
 	if (LWS_WITH_BUNDLED_ZLIB)
@@ -296,14 +298,24 @@
 #
 
 export_to_parent_intermediate()
-set(LWS_PLAT_UNIX ${LWS_PLAT_UNIX} PARENT_SCOPE)
+if (DEFINED LWS_PLAT_UNIX)
+	set(LWS_PLAT_UNIX ${LWS_PLAT_UNIX} PARENT_SCOPE)
+endif()
 set(LWS_HAVE_MBEDTLS_NET_SOCKETS ${LWS_HAVE_MBEDTLS_NET_SOCKETS} PARENT_SCOPE)
 set(TEST_SERVER_SSL_KEY "${TEST_SERVER_SSL_KEY}" PARENT_SCOPE)
 set(TEST_SERVER_SSL_CERT "${TEST_SERVER_SSL_CERT}" PARENT_SCOPE)
 set(TEST_SERVER_DATA ${TEST_SERVER_DATA} PARENT_SCOPE)
 set(LWS_HAVE_PIPE2 ${LWS_HAVE_PIPE2} PARENT_SCOPE)
 set(LWS_LIBRARIES ${LWS_LIBRARIES} PARENT_SCOPE)
-set(WIN32_HELPERS_PATH ${WIN32_HELPERS_PATH} PARENT_SCOPE)
+if (DEFINED WIN32_HELPERS_PATH)
+	set(WIN32_HELPERS_PATH ${WIN32_HELPERS_PATH} PARENT_SCOPE)
+endif()
+if (DEFINED HDR_PRIVATE)
 set(HDR_PRIVATE ${HDR_PRIVATE} PARENT_SCOPE)
-set(ZLIB_FOUND ${ZLIB_FOUND} PARENT_SCOPE)
+endif()
+if (DEFINED ZLIB_FOUND)
+	set(ZLIB_FOUND ${ZLIB_FOUND} PARENT_SCOPE)
+endif()
+if (DEFINED LIB_LIST_AT_END)
 set(LIB_LIST_AT_END ${LIB_LIST_AT_END} PARENT_SCOPE)
+endif()
diff --git a/lib/tls/CMakeLists.txt b/lib/tls/CMakeLists.txt
index 44aa003..3a502d0 100644
--- a/lib/tls/CMakeLists.txt
+++ b/lib/tls/CMakeLists.txt
@@ -210,7 +210,7 @@
 		set(chose_ssl 1)
 	endif()
 
-	if (LWS_WITH_MBEDTLS)
+	if (LWS_WITH_MBEDTLS AND DEFINED MBEDTLS_INCLUDE_DIRS AND DEFINED MBEDTLS_LIBRARIES)
 		message("MBEDTLS include dir: ${MBEDTLS_INCLUDE_DIRS}")
 		message("MBEDTLS libraries: ${MBEDTLS_LIBRARIES}")
 
@@ -219,6 +219,9 @@
 		endforeach()
 
 		list(APPEND LIB_LIST "${MBEDTLS_LIBRARIES}")
+	endif()
+	
+	if (LWS_WITH_MBEDTLS)
 		set(chose_ssl 1)
 	endif()
 
@@ -262,11 +265,15 @@
 
 endif(LWS_WITH_SSL)
 
-set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIRS})
-set(CMAKE_REQUIRED_LIBRARIES ${LIB_LIST})
- if (UNIX)
- set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} dl)
- endif()
+if (DEFINED OPENSSL_INCLUDE_DIRS)
+	set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIRS})
+endif()
+if (DEFINED LIB_LIST)
+	set(CMAKE_REQUIRED_LIBRARIES ${LIB_LIST})
+endif()
+if (UNIX)
+	set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} dl)
+endif()
 
 if (NOT VARIA)
 	set(VARIA "")
@@ -334,11 +341,14 @@
 if (LWS_WITH_SSL AND NOT LWS_WITH_WOLFSSL)
 	message("Searching for OpenSSL executable and dlls")
 	find_package(OpenSSLbins)
-	message("OpenSSL executable: ${OPENSSL_EXECUTABLE}")
-	if (OPENSSL_EXECUTABLE MATCHES "^$")
-		set(OPENSSL_EXECUTABLE openssl)
+	if (DEFINED OPENSSL_EXECUTABLE)
+		message("OpenSSL executable: ${OPENSSL_EXECUTABLE}")
+		
+		if (OPENSSL_EXECUTABLE MATCHES "^$")
+			set(OPENSSL_EXECUTABLE openssl)
+		endif()
 	endif()
-	if (NOT OPENSSL_EXECUTABLE)
+	if (NOT DEFINED OPENSSL_EXECUTABLE)
 		set(OPENSSL_EXECUTABLE openssl)
 	endif()
 
diff --git a/lib/tls/mbedtls/CMakeLists.txt b/lib/tls/mbedtls/CMakeLists.txt
index ad3ef32..adfbbbd 100644
--- a/lib/tls/mbedtls/CMakeLists.txt
+++ b/lib/tls/mbedtls/CMakeLists.txt
@@ -73,10 +73,17 @@
 			tls/mbedtls/wrapper/platform/ssl_port.c)
 	endif()
 
+	set(_WANT_MBT 0)
+	if (NOT LWS_PLAT_FREERTOS)
+		if (NOT DEFINED LWS_MBEDTLS_LIBRARIES)
+			set(_WANT_MBT 1)
+		endif()
+		if (NOT DEFINED LWS_MBEDTLS_INCLUDE_DIRS)
+			set(_WANT_MBT 1)
+		endif()
+	endif()
 
-	if ((NOT LWS_MBEDTLS_LIBRARIES OR "${LWS_MBEDTLS_LIBRARIES}" STREQUAL "" OR
-	     NOT LWS_MBEDTLS_INCLUDE_DIRS OR "${LWS_MBEDTLS_INCLUDE_DIRS}" STREQUAL "") AND
-	     NOT LWS_PLAT_FREERTOS)
+	if (_WANT_MBT)
 
 		find_path(LWS_MBEDTLS_INCLUDE_DIRS mbedtls/ssl.h)
 
@@ -96,12 +103,20 @@
 			message(FATAL_ERROR "You must set LWS_MBEDTLS_LIBRARIES and LWS_MBEDTLS_INCLUDE_DIRS when LWS_WITH_MBEDTLS is turned on.")
 		endif()
 	endif()
-	set(MBEDTLS_LIBRARIES ${LWS_MBEDTLS_LIBRARIES})
-	set(MBEDTLS_INCLUDE_DIRS ${LWS_MBEDTLS_INCLUDE_DIRS})
+	if (LWS_MBEDTLS_LIBRARIES)
+		set(MBEDTLS_LIBRARIES ${LWS_MBEDTLS_LIBRARIES})
+	endif()
+	if (LWS_MBEDTLS_INCLUDE_DIRS)
+		set(MBEDTLS_INCLUDE_DIRS ${LWS_MBEDTLS_INCLUDE_DIRS})
+	endif()
 	set(USE_MBEDTLS 1 PARENT_SCOPE)
-	include_directories(${MBEDTLS_INCLUDE_DIRS})
+	if (DEFINED MBEDTLS_INCLUDE_DIRS)
+		include_directories(${MBEDTLS_INCLUDE_DIRS})
+	endif()
 
-	list(APPEND LIB_LIST ${MBEDTLS_LIBRARIES})
+	if (DEFINED MBEDTLS_LIBRARIES)
+		list(APPEND LIB_LIST ${MBEDTLS_LIBRARIES})
+	endif()
 
 # old mbedtls has everything in mbedtls/net.h
 
diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt
index 571ab51..0e1560e 100644
--- a/plugins/CMakeLists.txt
+++ b/plugins/CMakeLists.txt
@@ -24,7 +24,9 @@
 
 include_directories(.)
 
+if (DEFINED LIB_LIST_AT_END)
 link_libraries(${LIB_LIST_AT_END})
+endif()
 
 if (LWS_WITH_PLUGINS AND LWS_WITH_SHARED)
 	macro(create_plugin PLUGIN_NAME PLUGIN_INCLUDE MAIN_SRC S2 S3)
diff --git a/test-apps/CMakeLists.txt b/test-apps/CMakeLists.txt
index e7b6023..aff7b68 100644
--- a/test-apps/CMakeLists.txt
+++ b/test-apps/CMakeLists.txt
@@ -89,7 +89,11 @@
 			endif()
 		endif()
 		
-		target_include_directories(${TEST_NAME} PRIVATE "${LWS_LIB_INCLUDES}" ${LWS_LIB_BUILD_INC_PATHS})
+		if (LWS_LIB_INCLUDES)
+			target_include_directories(${TEST_NAME} PRIVATE "${LWS_LIB_INCLUDES}" ${LWS_LIB_BUILD_INC_PATHS})
+		else()
+			target_include_directories(${TEST_NAME} PRIVATE ${LWS_LIB_BUILD_INC_PATHS})
+		endif()
 		target_compile_options(${TEST_NAME} PRIVATE ${LWS_PTHR_FLAGS})
 
 		if (LWS_WITH_HTTP_STREAM_COMPRESSION)