Browse Source

HDFS-7574. Make cmake work in Windows Visual Studio 2010 (Thanh Do via Colin P. McCabe)

Colin Patrick Mccabe 10 years ago
parent
commit
2e42564ad3

+ 3 - 0
hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/CMake/CMakeTestCompileStrerror.cpp

@@ -17,6 +17,9 @@
  */
 
 #include <string.h>
+#ifdef _WIN32
+#define strerror_r(errnum, buf, buflen) strerror_s((buf), (buflen), (errnum))
+#endif
 
 int main()
 {

+ 31 - 5
hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/CMake/Options.cmake

@@ -28,6 +28,7 @@ CHECK_FUNCTION_EXISTS(dladdr HAVE_DLADDR)
 CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
 
 IF(ENABLE_DEBUG STREQUAL ON)
+    # TODO: set platform debug flag (/Z7) for Windows.
     SET(CMAKE_BUILD_TYPE Debug CACHE 
         STRING "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel." FORCE)
     SET(CMAKE_CXX_FLAGS_DEBUG "-g -O0" CACHE STRING "compiler flags for debug" FORCE)
@@ -39,19 +40,32 @@ ELSE(ENABLE_DEBUG STREQUAL ON)
     SET(CMAKE_C_FLAGS_DEBUG "-g -O2" CACHE STRING "compiler flags for debug" FORCE)
 ENDIF(ENABLE_DEBUG STREQUAL ON)
 
-SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-strict-aliasing")
-SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-strict-aliasing")
+IF(NOT MSVC)
+    # Ignore no-strict-aliasing in windows.
+    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-strict-aliasing")
+    SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-strict-aliasing")
+ENDIF(NOT MSVC)
 
 IF(ENABLE_COVERAGE STREQUAL ON)
     INCLUDE(CodeCoverage)
 ENDIF(ENABLE_COVERAGE STREQUAL ON)
 
 IF(ENABLE_FRAME_POINTER STREQUAL ON)
-    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-omit-frame-pointer")
+    IF(MSVC)
+        SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Oy-")
+    ELSE(MSVC)
+        SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-omit-frame-pointer")
+    ENDIF(MSVC)
 ENDIF(ENABLE_FRAME_POINTER STREQUAL ON) 
 
 IF(ENABLE_SSE STREQUAL ON)
-    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.2")
+    IF(MSVC)
+        # In Visual Studio 2013, this option will use SS4.2 instructions
+        # if available. Not sure about the behaviour in Visual Studio 2010.
+        SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:SSE2")
+    ELSE(MSVC)
+        SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.2")
+    ENDIF(MSVC)
 ENDIF(ENABLE_SSE STREQUAL ON) 
 
 IF(NOT TEST_HDFS_PREFIX)
@@ -74,7 +88,17 @@ ENDIF(OS_LINUX)
 SET(BOOST_ROOT ${CMAKE_PREFIX_PATH})
 IF(ENABLE_BOOST STREQUAL ON)
     MESSAGE(STATUS "using boost instead of native compiler c++0x support.")
-    FIND_PACKAGE(Boost 1.53 REQUIRED)
+    IF(MSVC)
+        # Find boost libraries with flavor: mt-sgd (multi-thread, static, and debug)
+        SET(Boost_USE_STATIC_LIBS ON)
+        SET(Boost_USE_MULTITHREADED ON)
+        SET(Boost_USE_STATIC_RUNTIME ON)
+        FIND_PACKAGE(Boost 1.53 COMPONENTS thread chrono system atomic iostreams REQUIRED)			
+        INCLUDE_DIRECTORIES("${Boost_INCLUDE_DIRS}")
+        LINK_DIRECTORIES("${Boost_LIBRARY_DIRS}")
+    ELSE(MSVC)
+        FIND_PACKAGE(Boost 1.53 REQUIRED)
+    ENDIF(MSVC)
     SET(NEED_BOOST true CACHE INTERNAL "boost is required")
 ELSE(ENABLE_BOOST STREQUAL ON)
     SET(NEED_BOOST false CACHE INTERNAL "boost is required")
@@ -131,6 +155,8 @@ ELSEIF(CMAKE_COMPILER_IS_CLANG)
         SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
         SET(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY "libc++")
     ENDIF(ENABLE_LIBCPP STREQUAL ON)
+ELSEIF(MSVC)
+    SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
 ENDIF(CMAKE_COMPILER_IS_GNUCXX)
 
 TRY_COMPILE(STRERROR_R_RETURN_INT

+ 7 - 0
hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/CMake/Platform.cmake

@@ -20,6 +20,8 @@ IF(CMAKE_SYSTEM_NAME STREQUAL "Linux")
     SET(OS_LINUX true CACHE INTERNAL "Linux operating system")
 ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
     SET(OS_MACOSX true CACHE INTERNAL "Mac Darwin operating system")
+ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "Windows")
+    SET(OS_WINDOWS true CACHE INTERNAL "Windows operation system")
 ELSE(CMAKE_SYSTEM_NAME STREQUAL "Linux")
     MESSAGE(FATAL_ERROR "Unsupported OS: \"${CMAKE_SYSTEM_NAME}\"")
 ENDIF(CMAKE_SYSTEM_NAME STREQUAL "Linux")
@@ -44,6 +46,11 @@ IF(CMAKE_COMPILER_IS_GNUCXX)
     SET(GCC_COMPILER_VERSION_PATCH ${GCC_COMPILER_VERSION_PATCH} CACHE INTERNAL "gcc patch version")
     
     MESSAGE(STATUS "checking compiler: GCC (${GCC_COMPILER_VERSION_MAJOR}.${GCC_COMPILER_VERSION_MINOR}.${GCC_COMPILER_VERSION_PATCH})")
+ELSEIF(MSVC)
+    IF (NOT(${MSVC_VERSION} EQUAL 1600))
+        MESSAGE(FATAL_ERROR "Only supports Visual Studio 2010. Unsupported MSVC_VERSION: ${MSVC_VERSION}")
+    ENDIF(NOT(${MSVC_VERSION} EQUAL 1600))
+    MESSAGE(STATUS "checking compiler: MSVC version ${MSVC_VERSION}")
 ELSE(CMAKE_COMPILER_IS_GNUCXX)
     EXECUTE_PROCESS(COMMAND ${CMAKE_C_COMPILER} --version  OUTPUT_VARIABLE COMPILER_OUTPUT)
     IF(COMPILER_OUTPUT MATCHES "clang")

+ 23 - 13
hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/CMakeLists.txt

@@ -71,21 +71,31 @@ ADD_CUSTOM_COMMAND(
 	WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
 )
 
-TARGET_LINK_LIBRARIES(libhdfs3-static pthread)
-TARGET_LINK_LIBRARIES(libhdfs3-shared pthread)
+IF(NOT MSVC)
+    # pthread is not available in Windows.
+    TARGET_LINK_LIBRARIES(libhdfs3-static pthread)
+    TARGET_LINK_LIBRARIES(libhdfs3-shared pthread)
+ENDIF(NOT MSVC)
        
 IF(NEED_BOOST)
-    INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIR})
-    TARGET_LINK_LIBRARIES(libhdfs3-static boost_thread)
-    TARGET_LINK_LIBRARIES(libhdfs3-static boost_chrono)
-    TARGET_LINK_LIBRARIES(libhdfs3-static boost_system)
-    TARGET_LINK_LIBRARIES(libhdfs3-static boost_atomic)
-    TARGET_LINK_LIBRARIES(libhdfs3-static boost_iostreams)
-    TARGET_LINK_LIBRARIES(libhdfs3-shared boost_thread)
-    TARGET_LINK_LIBRARIES(libhdfs3-shared boost_chrono)
-    TARGET_LINK_LIBRARIES(libhdfs3-shared boost_system)
-    TARGET_LINK_LIBRARIES(libhdfs3-shared boost_atomic)
-    TARGET_LINK_LIBRARIES(libhdfs3-shared boost_iostreams)
+    IF(MSVC)
+        # We already find boost libraries in options.cmake
+        # therefore just need to link here.
+        TARGET_LINK_LIBRARIES(libhdfs3-static ${Boost_LIBRARIES})
+        TARGET_LINK_LIBRARIES(libhdfs3-shared ${Boost_LIBRARIES})
+    ELSE(MSVC)
+        INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIR})
+        TARGET_LINK_LIBRARIES(libhdfs3-static boost_thread)
+        TARGET_LINK_LIBRARIES(libhdfs3-static boost_chrono)
+        TARGET_LINK_LIBRARIES(libhdfs3-static boost_system)
+        TARGET_LINK_LIBRARIES(libhdfs3-static boost_atomic)
+        TARGET_LINK_LIBRARIES(libhdfs3-static boost_iostreams)
+        TARGET_LINK_LIBRARIES(libhdfs3-shared boost_thread)
+        TARGET_LINK_LIBRARIES(libhdfs3-shared boost_chrono)
+        TARGET_LINK_LIBRARIES(libhdfs3-shared boost_system)
+        TARGET_LINK_LIBRARIES(libhdfs3-shared boost_atomic)
+        TARGET_LINK_LIBRARIES(libhdfs3-shared boost_iostreams)
+    ENDIF(MSVC)
 ENDIF(NEED_BOOST)
 
 IF(NEED_GCCEH)

+ 9 - 1
hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/test/CMakeLists.txt

@@ -19,7 +19,15 @@
 CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
 
 SET(TEST_WORKING_DIR ${CMAKE_CURRENT_SOURCE_DIR}/data/)
-ADD_DEFINITIONS(-DGTEST_LANG_CXX11=0 -Dprivate=public -Dprotected=public -DDATA_DIR="${TEST_WORKING_DIR}/")
+
+IF(MSVC)
+    # in Windows, redefine private = public, protected = public cause
+    # a serious linking curse. Hence this preprocessor symbol.
+    # In the future, we may want to get rid of this definition even for MacOS and Linux.
+    ADD_DEFINITIONS(-DGTEST_LANG_CXX11=0 -D_WIN_TEST_ -DDATA_DIR="${TEST_WORKING_DIR}/")
+ELSE(MSVC)
+    ADD_DEFINITIONS(-DGTEST_LANG_CXX11=0 -Dprivate=public -Dprotected=public -DDATA_DIR="${TEST_WORKING_DIR}/")
+ENDIF(MSVC)
 
 ADD_SUBDIRECTORY(function)
 ADD_SUBDIRECTORY(unit)