[Bf-blender-cvs] [475ec5269ae] master: CMake: use only absolute linker paths for msvc.

Ray Molenkamp noreply at git.blender.org
Sun Oct 29 20:16:36 CET 2017


Commit: 475ec5269ae8f7c30795c2e771100e087b5dd315
Author: Ray Molenkamp
Date:   Sun Oct 29 13:16:22 2017 -0600
Branches: master
https://developer.blender.org/rB475ec5269ae8f7c30795c2e771100e087b5dd315

CMake: use only absolute linker paths for msvc.

cmake's link_directories will supply forward slashes for the search paths, the msvc linker has some issues with that, while it will search for the needed libs just fine, the incremental linker gets fed forward slashes for some libs, while the previous binary has backward slashes in it's metadata, the linker assumes obj files got added and performs a full link instead of an incremental link. This change brings down the link time with newer msvc versions for a trivial edit down from a few m [...]

===================================================================

M	build_files/cmake/macros.cmake
M	build_files/cmake/platform/platform_win32.cmake
D	build_files/cmake/platform/platform_win32_msvc.cmake

===================================================================

diff --git a/build_files/cmake/macros.cmake b/build_files/cmake/macros.cmake
index 06f47b9402b..7eb3af86985 100644
--- a/build_files/cmake/macros.cmake
+++ b/build_files/cmake/macros.cmake
@@ -282,65 +282,67 @@ function(SETUP_LIBDIRS)
 	# NOTE: For all new libraries, use absolute library paths.
 	# This should eventually be phased out.
 
-	link_directories(${JPEG_LIBPATH} ${PNG_LIBPATH} ${ZLIB_LIBPATH} ${FREETYPE_LIBPATH})
+	if (NOT MSVC)
+		link_directories(${JPEG_LIBPATH} ${PNG_LIBPATH} ${ZLIB_LIBPATH} ${FREETYPE_LIBPATH})
 
-	if(WITH_PYTHON)  #  AND NOT WITH_PYTHON_MODULE  # WIN32 needs
-		link_directories(${PYTHON_LIBPATH})
-	endif()
-	if(WITH_SDL AND NOT WITH_SDL_DYNLOAD)
-		link_directories(${SDL_LIBPATH})
-	endif()
-	if(WITH_CODEC_FFMPEG)
-		link_directories(${FFMPEG_LIBPATH})
-	endif()
-	if(WITH_IMAGE_OPENEXR)
-		link_directories(${OPENEXR_LIBPATH})
-	endif()
-	if(WITH_IMAGE_TIFF)
-		link_directories(${TIFF_LIBPATH})
-	endif()
-	if(WITH_BOOST)
-		link_directories(${BOOST_LIBPATH})
-	endif()
-	if(WITH_OPENIMAGEIO)
-		link_directories(${OPENIMAGEIO_LIBPATH})
-	endif()
-	if(WITH_OPENCOLORIO)
-		link_directories(${OPENCOLORIO_LIBPATH})
-	endif()
-	if(WITH_OPENVDB)
-		link_directories(${OPENVDB_LIBPATH})
-	endif()
-	if(WITH_OPENAL)
-		link_directories(${OPENAL_LIBPATH})
-	endif()
-	if(WITH_JACK AND NOT WITH_JACK_DYNLOAD)
-		link_directories(${JACK_LIBPATH})
-	endif()
-	if(WITH_CODEC_SNDFILE)
-		link_directories(${SNDFILE_LIBPATH})
-	endif()
-	if(WITH_FFTW3)
-		link_directories(${FFTW3_LIBPATH})
-	endif()
-	if(WITH_OPENCOLLADA)
-		link_directories(${OPENCOLLADA_LIBPATH})
-		## Never set
-		# link_directories(${PCRE_LIBPATH})
-		# link_directories(${EXPAT_LIBPATH})
-	endif()
-	if(WITH_LLVM)
-		link_directories(${LLVM_LIBPATH})
-	endif()
+		if(WITH_PYTHON)  #  AND NOT WITH_PYTHON_MODULE  # WIN32 needs
+			link_directories(${PYTHON_LIBPATH})
+		endif()
+		if(WITH_SDL AND NOT WITH_SDL_DYNLOAD)
+			link_directories(${SDL_LIBPATH})
+		endif()
+		if(WITH_CODEC_FFMPEG)
+			link_directories(${FFMPEG_LIBPATH})
+		endif()
+		if(WITH_IMAGE_OPENEXR)
+			link_directories(${OPENEXR_LIBPATH})
+		endif()
+		if(WITH_IMAGE_TIFF)
+			link_directories(${TIFF_LIBPATH})
+		endif()
+		if(WITH_BOOST)
+			link_directories(${BOOST_LIBPATH})
+		endif()
+		if(WITH_OPENIMAGEIO)
+			link_directories(${OPENIMAGEIO_LIBPATH})
+		endif()
+		if(WITH_OPENCOLORIO)
+			link_directories(${OPENCOLORIO_LIBPATH})
+		endif()
+		if(WITH_OPENVDB)
+			link_directories(${OPENVDB_LIBPATH})
+		endif()
+		if(WITH_OPENAL)
+			link_directories(${OPENAL_LIBPATH})
+		endif()
+		if(WITH_JACK AND NOT WITH_JACK_DYNLOAD)
+			link_directories(${JACK_LIBPATH})
+		endif()
+		if(WITH_CODEC_SNDFILE)
+			link_directories(${SNDFILE_LIBPATH})
+		endif()
+		if(WITH_FFTW3)
+			link_directories(${FFTW3_LIBPATH})
+		endif()
+		if(WITH_OPENCOLLADA)
+			link_directories(${OPENCOLLADA_LIBPATH})
+			## Never set
+			# link_directories(${PCRE_LIBPATH})
+			# link_directories(${EXPAT_LIBPATH})
+		endif()
+		if(WITH_LLVM)
+			link_directories(${LLVM_LIBPATH})
+		endif()
 
-	if(WITH_ALEMBIC)
-		link_directories(${ALEMBIC_LIBPATH})
-		link_directories(${HDF5_LIBPATH})
-	endif()
+		if(WITH_ALEMBIC)
+			link_directories(${ALEMBIC_LIBPATH})
+			link_directories(${HDF5_LIBPATH})
+		endif()
 
-	if(WIN32 AND NOT UNIX)
-		link_directories(${PTHREADS_LIBPATH})
-	endif()
+		if(WIN32 AND NOT UNIX)
+			link_directories(${PTHREADS_LIBPATH})
+		endif()
+	endif(NOT MSVC)
 endfunction()
 
 function(setup_liblinks
diff --git a/build_files/cmake/platform/platform_win32.cmake b/build_files/cmake/platform/platform_win32.cmake
index 2f5d41dac32..dbe3688d671 100644
--- a/build_files/cmake/platform/platform_win32.cmake
+++ b/build_files/cmake/platform/platform_win32.cmake
@@ -25,31 +25,517 @@
 
 add_definitions(-DWIN32)
 
-if(MSVC)
-	include(platform_win32_msvc)
-else()
+if(NOT MSVC)
 	message(FATAL_ERROR "Compiler is unsupported")
 endif()
 
+# Libraries configuration for Windows when compiling with MSVC.
+
+macro(warn_hardcoded_paths package_name
+	)
+	if(WITH_WINDOWS_FIND_MODULES)
+		message(WARNING "Using HARDCODED ${package_name} locations")
+	endif(WITH_WINDOWS_FIND_MODULES)
+endmacro()
+
+macro(windows_find_package package_name
+	)
+	if(WITH_WINDOWS_FIND_MODULES)
+		find_package(${package_name})
+	endif(WITH_WINDOWS_FIND_MODULES)
+endmacro()
+
+macro(find_package_wrapper)
+	if(WITH_WINDOWS_FIND_MODULES)
+		find_package(${ARGV})
+	endif()
+endmacro()
+
+add_definitions(-DWIN32)
+# Minimum MSVC Version
+if(CMAKE_CXX_COMPILER_ID MATCHES MSVC)
+	if(MSVC_VERSION EQUAL 1800)
+		set(_min_ver "18.0.31101")
+		if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${_min_ver})
+			message(FATAL_ERROR
+				"Visual Studio 2013 (Update 4, ${_min_ver}) required, "
+				"found (${CMAKE_CXX_COMPILER_VERSION})")
+		endif()
+	endif()
+	if(MSVC_VERSION EQUAL 1900)
+		set(_min_ver "19.0.24210")
+		if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${_min_ver})
+			message(FATAL_ERROR
+				"Visual Studio 2015 (Update 3, ${_min_ver}) required, "
+				"found (${CMAKE_CXX_COMPILER_VERSION})")
+		endif()
+	endif()
+endif()
+unset(_min_ver)
+
+# needed for some MSVC installations
+set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SAFESEH:NO")
+set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /SAFESEH:NO")
+set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} /SAFESEH:NO")
+
+list(APPEND PLATFORM_LINKLIBS
+	ws2_32 vfw32 winmm kernel32 user32 gdi32 comdlg32
+	advapi32 shfolder shell32 ole32 oleaut32 uuid psapi Dbghelp
+)
+
+if(WITH_INPUT_IME)
+	list(APPEND PLATFORM_LINKLIBS imm32)
+endif()
+
+add_definitions(
+	-D_CRT_NONSTDC_NO_DEPRECATE
+	-D_CRT_SECURE_NO_DEPRECATE
+	-D_SCL_SECURE_NO_DEPRECATE
+	-D_CONSOLE
+	-D_LIB
+)
+
+# MSVC11 needs _ALLOW_KEYWORD_MACROS to build
+add_definitions(-D_ALLOW_KEYWORD_MACROS)
+
+# We want to support Vista level ABI
+add_definitions(-D_WIN32_WINNT=0x600)
+
+# Make cmake find the msvc redistributables
+set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP TRUE)
+include(InstallRequiredSystemLibraries)
+
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /nologo /J /Gd /MP /EHsc")
+set(CMAKE_C_FLAGS     "${CMAKE_C_FLAGS} /nologo /J /Gd /MP")
+
+set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
+set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /MTd")
+set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
+set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /MT")
+set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} /MT")
+set(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} /MT")
+set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /MT")
+set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} /MT")
+
+set(PLATFORM_LINKFLAGS "/SUBSYSTEM:CONSOLE /STACK:2097152 /INCREMENTAL:NO ")
+set(PLATFORM_LINKFLAGS "${PLATFORM_LINKFLAGS} /NODEFAULTLIB:msvcrt.lib /NODEFAULTLIB:msvcmrt.lib /NODEFAULTLIB:msvcurt.lib /NODEFAULTLIB:msvcrtd.lib ")
+
+# Ignore meaningless for us linker warnings.
+set(PLATFORM_LINKFLAGS "${PLATFORM_LINKFLAGS} /ignore:4049 /ignore:4217 /ignore:4221")
+set(CMAKE_STATIC_LINKER_FLAGS "${CMAKE_STATIC_LINKER_FLAGS} /ignore:4221")
+
+if(CMAKE_CL_64)
+	set(PLATFORM_LINKFLAGS "/MACHINE:X64 ${PLATFORM_LINKFLAGS}")
+else()
+	set(PLATFORM_LINKFLAGS "/MACHINE:IX86 /LARGEADDRESSAWARE ${PLATFORM_LINKFLAGS}")
+endif()
+
+set(PLATFORM_LINKFLAGS_DEBUG "/IGNORE:4099 /NODEFAULTLIB:libcmt.lib /NODEFAULTLIB:libc.lib")
+
+if(NOT DEFINED LIBDIR)
+
+	# Setup 64bit and 64bit windows systems
+	if(CMAKE_CL_64)
+		message(STATUS "64 bit compiler detected.")
+		set(LIBDIR_BASE "win64")
+	else()
+		message(STATUS "32 bit compiler detected.")
+		set(LIBDIR_BASE "windows")
+	endif()
+	if(MSVC_VERSION EQUAL 1911)
+		message(STATUS "Visual Studio 2017 detected.")
+		set(LIBDIR ${CMAKE_SOURCE_DIR}/../lib/${LIBDIR_BASE}_vc14)
+	elseif(MSVC_VERSION EQUAL 1910)
+		message(STATUS "Visual Studio 2017 detected.")
+		set(LIBDIR ${CMAKE_SOURCE_DIR}/../lib/${LIBDIR_BASE}_vc14)
+	elseif(MSVC_VERSION EQUAL 1900)
+		message(STATUS "Visual Studio 2015 detected.")
+		set(LIBDIR ${CMAKE_SOURCE_DIR}/../lib/${LIBDIR_BASE}_vc14)
+	else()
+		message(STATUS "Visual Studio 2013 detected.")
+		set(LIBDIR ${CMAKE_SOURCE_DIR}/../lib/${LIBDIR_BASE}_vc12)
+	endif()
+else()
+	message(STATUS "Using pre-compiled LIBDIR: ${LIBDIR}")
+endif()
+if(NOT EXISTS "${LIBDIR}/")
+	message(FATAL_ERROR "Windows requires pre-compiled libs at: '${LIBDIR}'")
+endif()
+
+# Add each of our libraries to our cmake_prefix_path so find_package() could work
+file(GLOB children RELATIVE ${LIBDIR} ${LIBDIR}/*)
+foreach(child ${children})
+	if(IS_DIRECTORY ${LIBDIR}/${child})
+		list(APPEND CMAKE_PREFIX_PATH  ${LIBDIR}/${child})
+	endif()
+endforeach()
+
+set(ZLIB_INCLUDE_DIRS ${LIBDIR}/zlib/include)
+set(ZLIB_LIBRARIES ${LIBDIR}/zlib/lib/libz_st.lib)
+set(ZLIB_INCLUDE_DIR ${LIBDIR}/zlib/include)
+set(ZLIB_LIBRARY ${LIBDIR}/zlib/lib/libz_st.lib)
+set(ZLIB_DIR ${LIBDIR}/zlib)
+
+windows_find_package(zlib) # we want to find before finding things that depend on it like png
+windows_find_package(png)
+
+if(NOT PNG_FOUND)
+	warn_hardcoded_paths(libpng)
+	set(PNG_PNG_INCLUDE_DIR ${LIBDIR}/png/include)
+	set(PNG_LIBRARIES ${LIBDIR}/png/lib/libpng.lib)
+	set(PNG "${LIBDIR}/png")
+	set(PNG_INCLUDE_DIRS "${PNG}/include")
+	set(PNG_LIBPATH ${PNG}/lib) # not cmake defined
+endif()
+
+set(JPEG_NAMES ${JPEG_NAMES} libjpeg)
+windows_find_package(jpeg REQUIRED)
+if(NOT JPEG_FOUND)
+	warn_hardcoded_paths(jpeg)
+	set(JPEG_INCLUDE_DIR ${LIBDIR}/jpeg/include)
+	set(JPEG_LIBRARIES ${LIBDIR}/jpeg/lib/libjpeg.lib)
+endif()
+
+set(PTHREADS_INCLUDE_DIRS ${LIBDIR}/pthreads/include)
+set(PTHREADS_LIBRARIES ${LIBDIR}/pthreads/lib/pthreadVC2.lib)
+
+set(FREETYPE ${LIBDIR}/freetype)
+set(FREETYPE_INCLUDE_DIRS
+	${LIBDIR}/freetype/include
+	${LIBDIR}/freetype/include/freetype2
+)
+set(FREETYPE_LIBRARY ${LIBDIR}/freetype/lib/freetype2ST.lib)
+windows_find_package(freetype REQUIRED)
+
+if(WITH_FFTW3)
+	set(FFTW3 ${LIBDIR}/fftw3)
+	set(FFTW3_LIBRARIES ${FFTW3}/lib/libfftw.lib)
+	set(FFTW3_INCLUDE_DIRS ${FFTW3}/include)
+	set(FFTW3_LIBPATH ${FFTW3}/lib)
+endif()
+
+if(WITH_OPENCOLLADA)
+	set(OPENCOLLADA ${LIBDIR}/opencollada)
+
+	set(OPENCOLLADA_INCLUDE_DIRS
+		${OPENCOLLADA}/include/opencollada/COLLADAS

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list