CMake build system for Windows


git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@4171 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..f390767
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,127 @@
+#
+# Setup
+#
+
+cmake_minimum_required(VERSION 2.6)
+
+project(TigerVNC)
+set(VERSION 1.0.90)
+
+# The RC version must always be four comma-separated numbers
+set(RCVERSION 1,0,90,0)
+
+if(MINGW OR CYGWIN)
+  execute_process(COMMAND "date" "+%Y%m%d" OUTPUT_VARIABLE BUILD)
+  string(REGEX REPLACE "\n" "" BUILD ${BUILD})
+elseif(WIN32)
+  execute_process(COMMAND "${CMAKE_SOURCE_DIR}/cmakescripts/getdate.bat"
+    OUTPUT_VARIABLE BUILD)
+  string(REGEX REPLACE "\n" "" BUILD ${BUILD})
+else()
+  message(FATAL_ERROR "Platform not supported by this build system.  Use autotools instead.")
+endif()
+
+if(NOT CMAKE_BUILD_TYPE)
+  set(CMAKE_BUILD_TYPE Release)
+endif()
+
+message(STATUS "CMAKE_BUILD_TYPE = ${CMAKE_BUILD_TYPE}")
+
+# This only works if building from the command line.  There is currently no way
+# to set a variable's value based on the build type when using the MSVC IDE.
+if(CMAKE_BUILD_TYPE STREQUAL "Debug")
+  set(BUILD "${BUILD}d")
+endif()
+
+message(STATUS "VERSION = ${VERSION}, BUILD = ${BUILD}")
+
+if(NOT DEFINED BUILD_WINVNC)
+  if(MSVC)
+    set(BUILD_WINVNC 1)
+  else()
+    set(BUILD_WINVNC 0)
+  endif()
+endif()
+
+if(MSVC)
+  # Use the static C library for all build types
+  foreach(var CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
+    CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO
+    CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
+    CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
+    if(${var} MATCHES "/MD")
+      string(REGEX REPLACE "/MD" "/MT" ${var} "${${var}}")
+    endif()
+  endforeach()
+
+  # NOTE: 4244 and 4267 are 64-bit to 32-bit conversion warnings, so normally
+  # it is not a good idea to disable them, but we do this to duplicate the
+  # behavior of GCC, which is less strict.
+  add_definitions(-wd4244 -wd4267 -wd4800 -wd4996)
+endif()
+
+# Detect whether compiler is 64-bit
+if((MSVC AND CMAKE_CL_64) OR (CMAKE_SIZEOF_VOID_P MATCHES 8))
+  set(64BIT 1)
+  set(WIN64 1)
+endif()
+
+if(64BIT)
+  message(STATUS "64-bit build")
+else()
+  message(STATUS "32-bit build")
+endif()
+
+# CMake doesn't properly support resource compilation with MinGW.  Boo!
+if(MINGW)
+  if(NOT DEFINED RC)
+    set(CMAKE_RC_COMPILER_INIT windres)
+  else()
+    set(CMAKE_RC_COMPILER_INIT ${RC})
+  endif()
+  enable_language(RC)
+  message(STATUS "Resource compiler: ${CMAKE_RC_COMPILER}")
+  set(CMAKE_RC_COMPILE_OBJECT
+    "<CMAKE_RC_COMPILER> <FLAGS> <DEFINES> -o <OBJECT> --output-format=coff <SOURCE>")
+endif()
+
+
+add_subdirectory(common)
+add_subdirectory(win)
+
+
+#
+# Installer
+#
+
+set(INST_NAME ${CMAKE_PROJECT_NAME})
+
+if(64BIT)
+  set(INST_NAME ${INST_NAME}64)
+  set(INST_DEFS -DWIN64)
+endif()
+
+if(MSVC_IDE)
+  set(INSTALLERDIR "$(OutDir)")
+  set(BUILDDIRDEF "-DBUILD_DIR=${INSTALLERDIR}\\")
+else()
+  set(INSTALLERDIR .)
+  set(BUILDDIRDEF "-DBUILD_DIR=")
+endif()
+
+set(INST_DEPS vncviewer)
+
+if(BUILD_WINVNC)
+  set(INST_DEFS ${INST_DEFS} -DBUILD_WINVNC)
+  set(INST_DEPS ${INST_DEPS} winvnc4 wm_hooks vncconfig)
+endif()
+
+configure_file(win/tigervnc.iss.in tigervnc.iss)
+
+add_custom_target(installer
+  iscc -o${INSTALLERDIR} ${INST_DEFS} ${BUILDDIRDEF} -F${INST_NAME} tigervnc.iss
+  DEPENDS ${INST_DEPS}
+  SOURCES tigervnc.iss)
+
+install(FILES ${CMAKE_SOURCE_DIR}/win/README_BINARY.txt
+  ${CMAKE_SOURCE_DIR}/LICENCE.txt DESTINATION .)