[Bf-committers] MinGW OSL compilation: Failure, steps taken so far

Antony Riakiotakis kalast at gmail.com
Sun Nov 4 20:46:24 CET 2012


Hi, after a lot of effort I will quit trying to build Open Shading
Language for MinGW-w64, at least until a new LLVM version comes out
that better supports MinGW-w64.
I got to the point where I could configure OSL and build a few files.
The critical issue currently is that llvm-3.1 crashes when attempting
to work on OSL and llvm-3.0 can't parse some standard c headers of
MinGW-w64 properly. So I am stuck. I tried building LLVM with
different toolsets (configure/make explicitly supports setting a 64bit
target, which might have been the cause of the crashes. However, this
build fails (sometimes with a crash)).

However, I will post here the patches I've used so far in case anyone
else wants to resume where I've failed.

llvm-3.1 can be compiled straight from source with cmake on MSYS. You
will need python 2.7 and flex. m4 and bison for MSYS. Use cmake with
MSYS Makefiles generator instead of command prompt with MinGW
makefiles generator because this produces llvm-config, which is needed
for OSL (can be bypassed by fiddling with OSL cmakefiles but for my
own attempt I didn't do this). For llvm-3.0 you will also need ruby.
For llvm-3.0 you need to substitute the ${LLVM_CONFIG} lines on OSL
CMakeFiles with "ruby ${LLVM_CONFIG}". As explained though, llvm 3.0
can't parse MinGW headers right (some atomic operation definitions are
missing)


For OSL I've used this configuration:
-------------------------------------------------


make BUILDARCH=x86_64-w64-mingw32 OPENIMAGEIOHOME=/c/src/oiio-install
ILMBASE_HOME=/c/src/lib/mingw64/openexr BOOST_HOME=/c/src/libopt/boost
OPENEXR_HOME=/c/src/lib/mingw64/openexr LLVM_DIRECTORY=/
USE_BOOST_WAVE=ON USE_TBB=OFF VERBOSE=ON BUILDSTATIC=ON LINKSTATIC=ON
BUILD_TESTING=OFF

And these modifications on the source:
---------------------------------------------------


 Makefile                         |  2 +-
 src/CMakeLists.txt               |  1 +
 src/cmake/externalpackages.cmake | 14 +++++++++-----
 src/liboslcomp/CMakeLists.txt    |  4 ++--
 src/liboslexec/CMakeLists.txt    | 13 ++++++++++---
 src/liboslexec/llvm_ops.cpp      |  2 +-
 src/liboslquery/CMakeLists.txt   |  2 +-
 src/testshade/CMakeLists.txt     |  2 +-
 8 files changed, 26 insertions(+), 14 deletions(-)

diff --git a/Makefile b/Makefile
index 2510e91..af215a7 100644
--- a/Makefile
+++ b/Makefile
@@ -27,7 +27,7 @@ ifdef PROFILE
 endif

 MY_MAKE_FLAGS ?=
-MY_CMAKE_FLAGS ?= -g3
+MY_CMAKE_FLAGS ?= -g3 -G "MSYS Makefiles"

 # Site-specific build instructions
 ifndef OSL_SITE
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 37e16d9..e4db823 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -9,6 +9,7 @@ set (OSL_LIBRARY_VERSION_PATCH 0)
 set (OSO_FILE_VERSION_MAJOR 1)
 set (OSO_FILE_VERSION_MINOR 0)

+set(LLVM_STATIC TRUE)

 cmake_minimum_required (VERSION 2.6)
 if (NOT CMAKE_VERSION VERSION_LESS 2.8.4)
diff --git a/src/cmake/externalpackages.cmake b/src/cmake/externalpackages.cmake
index 083f7e4..805223a 100644
--- a/src/cmake/externalpackages.cmake
+++ b/src/cmake/externalpackages.cmake
@@ -249,16 +249,16 @@ if (LLVM_DIRECTORY)
 else ()
     set (LLVM_CONFIG llvm-config)
 endif ()
-execute_process (COMMAND ${LLVM_CONFIG} --version
+execute_process (COMMAND perl ${LLVM_CONFIG} --version
                  OUTPUT_VARIABLE LLVM_VERSION
 	         OUTPUT_STRIP_TRAILING_WHITESPACE)
-execute_process (COMMAND ${LLVM_CONFIG} --prefix
+execute_process (COMMAND perl ${LLVM_CONFIG} --prefix
                  OUTPUT_VARIABLE LLVM_DIRECTORY
 	         OUTPUT_STRIP_TRAILING_WHITESPACE)
-execute_process (COMMAND ${LLVM_CONFIG} --libdir
+execute_process (COMMAND perl ${LLVM_CONFIG} --libdir
                  OUTPUT_VARIABLE LLVM_LIB_DIR
   	         OUTPUT_STRIP_TRAILING_WHITESPACE)
-execute_process (COMMAND ${LLVM_CONFIG} --includedir
+execute_process (COMMAND perl ${LLVM_CONFIG} --includedir
                  OUTPUT_VARIABLE LLVM_INCLUDES
   	         OUTPUT_STRIP_TRAILING_WHITESPACE)
 find_library ( LLVM_LIBRARY
@@ -270,6 +270,10 @@ message (STATUS "LLVM includes = ${LLVM_INCLUDES}")
 message (STATUS "LLVM library  = ${LLVM_LIBRARY}")
 message (STATUS "LLVM lib dir  = ${LLVM_LIB_DIR}")

+if (LLVM_STATIC)
+  set (LLVM_LIBRARY TRUE)
+endif()
+
 if (LLVM_LIBRARY AND LLVM_INCLUDES AND LLVM_DIRECTORY AND LLVM_LIB_DIR)
   # ensure include directory is added (in case of non-standard locations
   include_directories (BEFORE "${LLVM_INCLUDES}")
@@ -281,7 +285,7 @@ if (LLVM_LIBRARY AND LLVM_INCLUDES AND
LLVM_DIRECTORY AND LLVM_LIB_DIR)
     # the list of what libraries we need, and substitute that in the right
     # way for LLVM_LIBRARY.
     set (LLVM_LIBRARY "")
-    execute_process (COMMAND ${LLVM_CONFIG} --libs
+    execute_process (COMMAND perl ${LLVM_CONFIG} --libs
                  OUTPUT_VARIABLE llvm_library_list
 	         OUTPUT_STRIP_TRAILING_WHITESPACE)
     string (REPLACE "-l" "" llvm_library_list ${llvm_library_list})
diff --git a/src/liboslcomp/CMakeLists.txt b/src/liboslcomp/CMakeLists.txt
index 31cb829..c9f6751 100644
--- a/src/liboslcomp/CMakeLists.txt
+++ b/src/liboslcomp/CMakeLists.txt
@@ -6,12 +6,12 @@ FILE ( GLOB compiler_headers "*.h" )
 FLEX_BISON ( osllex.l oslgram.y osl liboslcomp_srcs compiler_headers )

 ADD_LIBRARY ( oslcomp SHARED ${liboslcomp_srcs} )
-TARGET_LINK_LIBRARIES ( oslcomp ${OPENIMAGEIO_LIBRARY} ${Boost_LIBRARIES} )
+TARGET_LINK_LIBRARIES ( oslcomp ${OPENIMAGEIO_LIBRARY}
${Boost_LIBRARIES} psapi)
 LINK_ILMBASE ( oslcomp )

 IF ( USE_BOOST_WAVE )
     ADD_DEFINITIONS ( -DUSE_BOOST_WAVE )
 ENDIF ()

-INSTALL ( TARGETS oslcomp LIBRARY DESTINATION lib )
+INSTALL ( TARGETS oslcomp ARCHIVE DESTINATION lib )

diff --git a/src/liboslexec/CMakeLists.txt b/src/liboslexec/CMakeLists.txt
index 1f7ea18..008a2a6 100644
--- a/src/liboslexec/CMakeLists.txt
+++ b/src/liboslexec/CMakeLists.txt
@@ -41,7 +41,7 @@ MACRO ( LLVM_COMPILE llvm_src srclist )
     MESSAGE (STATUS "LLVM_COMPILE bc=${llvm_bc}")
     MESSAGE (STATUS "LLVM_COMPILE cpp=${llvm_bc_cpp}")
     SET ( ${srclist} ${${srclist}} ${llvm_bc_cpp} )
-    EXEC_PROGRAM ( ${LLVM_DIRECTORY}/bin/llvm-config ARGS --cxxflags
OUTPUT_VARIABLE LLVM_COMPILE_FLAGS )
+    EXEC_PROGRAM ( "perl ${LLVM_DIRECTORY}/bin/llvm-config ARGS
--cxxflags" OUTPUT_VARIABLE LLVM_COMPILE_FLAGS )
     set (LLVM_COMPILE_FLAGS "${LLVM_COMPILE_FLAGS}
-D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -O3 --combine")
     if (OSL_NAMESPACE)
         LIST (APPEND LLVM_COMPILE_FLAGS "-DOSL_NAMESPACE=${OSL_NAMESPACE}")
@@ -77,7 +77,14 @@ MACRO ( LLVM_COMPILE llvm_src srclist )
       -I${CMAKE_SOURCE_DIR}/include
       -I${CMAKE_BINARY_DIR}/include
       -I${OPENIMAGEIO_INCLUDES} -I${ILMBASE_INCLUDE_AREA}
-      -I${Boost_INCLUDE_DIRS} -I${TBB_INCLUDES} -O3 -S -emit-llvm -o
${llvm_asm} ${llvm_src}
+      -I${Boost_INCLUDE_DIRS}
+	  -Ic:/MinGW/x86_64-w64-mingw32/include
+	  -Ic:/MinGW/include/c++/4.7.2/x86_64-w64-mingw32
+	  -Ic:/MinGW/include/c++/4.7.2/backward
+	  -Ic:/MinGW/include/c++/4.7.2
+	  -I${TBB_INCLUDES}
+	
+	  -O3 -S -emit-llvm -o ${llvm_asm} ${llvm_src}

       COMMAND ${LLVM_DIRECTORY}/bin/llvm-as -f -o ${llvm_bc} ${llvm_asm}
       COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/serialize-bc.bash
${llvm_bc} ${llvm_bc_cpp}
@@ -105,7 +112,7 @@ TARGET_LINK_LIBRARIES ( oslexec
 ADD_DEPENDENCIES (oslexec ${CMAKE_CURRENT_SOURCE_DIR}/liboslcexec.map)
 LINK_ILMBASE ( oslexec )

-INSTALL ( TARGETS oslexec LIBRARY DESTINATION lib )
+INSTALL ( TARGETS oslexec ARCHIVE DESTINATION lib )



diff --git a/src/liboslexec/llvm_ops.cpp b/src/liboslexec/llvm_ops.cpp
index c844b0c..ec6dc38 100644
--- a/src/liboslexec/llvm_ops.cpp
+++ b/src/liboslexec/llvm_ops.cpp
@@ -109,7 +109,7 @@ using OIIO::safe_asinf;
 using OIIO::safe_acosf;
 using OIIO::isinf;

-#ifdef _WIN32
+#if defined(_WIN32) && !defined(__MINGW32__)
 using OIIO::roundf;
 using OIIO::truncf;
 using OIIO::expm1f;
diff --git a/src/liboslquery/CMakeLists.txt b/src/liboslquery/CMakeLists.txt
index d326a74..f140339 100644
--- a/src/liboslquery/CMakeLists.txt
+++ b/src/liboslquery/CMakeLists.txt
@@ -9,5 +9,5 @@ ADD_LIBRARY ( oslquery SHARED ${liboslquery_srcs} )
 TARGET_LINK_LIBRARIES ( oslquery ${OPENIMAGEIO_LIBRARY} ${Boost_LIBRARIES} )
 LINK_ILMBASE ( oslquery )

-INSTALL ( TARGETS oslquery LIBRARY DESTINATION lib )
+INSTALL ( TARGETS oslquery ARCHIVE DESTINATION lib )

diff --git a/src/testshade/CMakeLists.txt b/src/testshade/CMakeLists.txt
index ea56597..3a018d4 100644
--- a/src/testshade/CMakeLists.txt
+++ b/src/testshade/CMakeLists.txt
@@ -11,7 +11,7 @@ target_link_libraries (libtestshade oslexec oslcomp
oslquery ${OPENIMAGEIO_LIBRA
 set_target_properties (libtestshade PROPERTIES PREFIX "")
 install (TARGETS libtestshade
 #         RUNTIME DESTINATION "${BINDIR}" COMPONENT user
-         LIBRARY DESTINATION lib
+         ARCHIVE DESTINATION lib
 #COMPONENT user
 #         ARCHIVE DESTINATION "${LIBDIR}" COMPONENT developer
 )


More information about the Bf-committers mailing list