From b9c027a69987f29019f947029050defa2898575b Mon Sep 17 00:00:00 2001 From: Don Bright Date: Mon, 2 Jan 2012 20:44:50 -0600 Subject: use pkg-config to find QT libraries in mingw-cross-env, not FindQt4.cmake diff --git a/doc/testing.txt b/doc/testing.txt index 331b485..f690939 100644 --- a/doc/testing.txt +++ b/doc/testing.txt @@ -22,23 +22,9 @@ Then, from the QT command prompt: > cmake . > nmake -f Makefile -Cross compiling Linux->Windows: +Cross compiling Linux->Win32: -Additional prerequisities: wine, mingw-cross-env - -Note: CTest harness will only run under Wine under *nix, not under Win32. - -Follow the instructions for installing the mingw-env cross build system at -http://en.wikibooks.org/wiki/OpenSCAD_User_Manual , especially the part -about including the cross-compiler in your PATH. If you do cross-builds, -it's recommended to use out-of-source builds (mkdir buildx; cd buildx; cmake ..) -in order to keep your native *nix build separate from your cross-build. - -$ cd tests -$ mkdir build-mingw32 -$ cd build-mingw32 -$ cmake .. -DMINGW_CROSS_ENV_DIR= -DCMAKE_TOOLCHAIN_FILE=CMingw-env-cross.cmake -$ make +Please see openscad/tests/CMingw-cross-env.cmake for instructions. B) Running tests diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index e803146..65becc4 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -72,10 +72,10 @@ endif() # function(inclusion user_set_path found_paths) - # This function exists as a wrapper for INCLUDE_DIRECTORIES - # to deal with systems in which some libraries are found - # in the system paths, (/usr) but others are found in customized - # paths set in environment variables (CGAL_DIR). + # If user_set_path indicates an env. variable was specifically + # set by the user, then found_paths become an include priority (prepend); + # otherwise found_paths are stuck on the end of the include flags (append). + # message(STATUS "inclusion ${user_set_path} ${found_paths}") # message(STATUS "inclusion ${${user_set_path}} ${${found_paths}}") set( inclusion_match 0 ) @@ -95,6 +95,10 @@ function(inclusion user_set_path found_paths) endfunction() # Boost +# +# FindBoost.cmake has been included from Cmake's GIT circa the end of 2011 +# because most existing installs of cmake had a buggy older version. +# # Update this if FindBoost.cmake gets out of sync with the current boost release # set(Boost_ADDITIONAL_VERSIONS "1.47.0" "1.46.0") @@ -139,8 +143,17 @@ endif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") set(CMAKE_INCLUDE_DIRECTORIES_BEFORE ON) find_package(OpenGL REQUIRED) -find_package(Qt4 COMPONENTS QtCore QtGui QtOpenGL REQUIRED) -include(${QT_USE_FILE}) + +if (MINGW_CROSS_ENV_DIR) + mingw_cross_env_find_qt() + mingw_cross_env_info() + include_directories( ${QT_INCLUDE_DIRS} ) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${QT_CFLAGS_OTHER}") +else() + find_package(Qt4 COMPONENTS QtCore QtGui QtOpenGL REQUIRED) + include(${QT_USE_FILE}) +endif() + set(CMAKE_INCLUDE_DIRECTORIES_BEFORE OFF) # Eigen2 @@ -429,10 +442,6 @@ add_executable(throwntogethertest throwntogethertest.cc csgtestcore.cc ../src/Op set_target_properties(throwntogethertest PROPERTIES COMPILE_FLAGS "-DENABLE_OPENCSG -DENABLE_CGAL ${CGAL_CXX_FLAGS_INIT}") target_link_libraries(throwntogethertest tests-offscreen tests-cgal ${CGAL_LIBRARY} ${CGAL_3RD_PARTY_LIBRARIES} ${QT_LIBRARIES} ${OPENCSG_LIBRARY} ${GLEW_LIBRARY} ${COCOA_LIBRARY} ${OPENGL_LIBRARY} ${Boost_LIBRARIES}) -if (MINGW_CROSS_ENV_DIR) - mingw_cross_env_add_missing_libs() -endif() - # # Tags tests as disabled. This is more convenient than removing them manually # from the lists of filenames diff --git a/tests/CMingw-cross-env.cmake b/tests/CMingw-cross-env.cmake new file mode 100644 index 0000000..469223d --- /dev/null +++ b/tests/CMingw-cross-env.cmake @@ -0,0 +1,146 @@ +# +# CMake Toolchain file for cross compiling OpenSCAD tests linux->mingw-win32 +# -------------------------------------------------------------------------- +# +# Prerequisites: mingw-cross-env, ImageMagick 6.5.9.3 or newer, wine +# +# Usage: +# +# - follow Brad Pitcher's mingw-cross-env for OpenSCAD setup: +# http://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Cross-compiling_for_Windows_on_Linux_or_Mac_OS_X +# - cross-compile openscad.exe, to verify your installation works properly. +# - cd openscad/tests && mkdir build-mingw32 && cd build-mingw32 +# - cmake .. -DCMAKE_TOOLCHAIN_FILE=CMingw-cross-env.cmake \ +# -DMINGW_CROSS_ENV_DIR= +# - make should proceed as normal. +# - now run 'ctest' on your *nix machine. +# The test .exe programs should run under Wine. +# +# See also: +# +# http://lists.gnu.org/archive/html/mingw-cross-env-list/2010-11/threads.html#00078 +# (thread "Qt with Cmake") +# http://lists.gnu.org/archive/html/mingw-cross-env-list/2011-01/threads.html#00012 +# (thread "Qt: pkg-config files?") +# http://mingw-cross-env.nongnu.org/#requirements +# http://www.vtk.org/Wiki/CMake_Cross_Compiling +# https://bitbucket.org/muellni/mingw-cross-env-cmake/src/2067fcf2d52e/src/cmake-1-toolchain-file.patch +# http://code.google.com/p/qtlobby/source/browse/trunk/toolchain-mingw.cmake +# http://gcc.gnu.org/onlinedocs/gcc-3.4.6/gcc/Link-Options.html +# Makefile.Release generated by qmake +# cmake's FindQt4.cmake & Qt4ConfigDependentSettings.cmake files +# mingw-cross-env's qmake.conf and *.prl files +# mingw-cross-env's pkg-config files in usr/i686-pc-mingw32/lib/pkgconfig +# http://www.vtk.org/Wiki/CMake:How_To_Find_Libraries +# + +# +# Notes: +# +# To debug the build process run "make VERBOSE=1". 'strace -f' is also useful. +# +# This file is actually called multiple times by cmake, so various 'if NOT set' +# guards are used to keep programs from running twice. +# +# The test will not currently run under win32 because the ctest harness +# is created by cmake on the machine that it is called on, not on the +# machine it is targeting. +# + +# +# Part 1. Find *nix-ImageMagick +# +# The tests run under Wine under *nix. Therefore we need to find the +# ImageMagick comparison program on the *nix machine. It must be +# searched before the 'cross-compile' environment is setup. +# + +if (NOT imagemagick_cross_set) + find_package(ImageMagick COMPONENTS convert REQUIRED) + message(STATUS "ImageMagick convert executable found: " ${ImageMagick_convert_EXECUTABLE}) + set( SKIP_IMAGEMAGICK TRUE ) + set( imagemagick_cross_set ) +endif() + +# +# Part 2. cross-compiler setup +# + +set(MINGW_CROSS_ENV_DIR $ENV{MINGW_CROSS_ENV_DIR}) + +set(BUILD_SHARED_LIBS OFF) +set(CMAKE_SYSTEM_NAME Windows) +set(MSYS 1) +set(CMAKE_FIND_ROOT_PATH ${MINGW_CROSS_ENV_DIR}/usr/i686-pc-mingw32) +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + +set(CMAKE_C_COMPILER ${MINGW_CROSS_ENV_DIR}/usr/bin/i686-pc-mingw32-gcc) +set(CMAKE_CXX_COMPILER ${MINGW_CROSS_ENV_DIR}/usr/bin/i686-pc-mingw32-g++) +set(CMAKE_RC_COMPILER ${MINGW_CROSS_ENV_DIR}/usr/bin/i686-pc-mingw32-windres) +set(PKG_CONFIG_EXECUTABLE ${MINGW_CROSS_ENV_DIR}/usr/bin/i686-pc-mingw32-pkg-config) +set(QT_QMAKE_EXECUTABLE ${MINGW_CROSS_ENV_DIR}/usr/bin/i686-pc-mingw32-qmake) +set(CMAKE_INSTALL_PREFIX ${MINGW_CROSS_ENV_DIR}/usr/i686-pc-mingw32 CACHE PATH "Installation Prefix") +# set(CMAKE_BUILD_TYPE Release CACHE STRING "Debug|Release|RelWithDebInfo|MinSizeRel") + +# +# Part 3. library settings for mingw-cross-env +# + +set( Boost_USE_STATIC_LIBS ON ) +set( Boost_USE_MULTITHREADED ON ) +set( Boost_COMPILER "_win32" ) +# set( Boost_DEBUG TRUE ) # for debugging cmake's FindBoost, not boost itself + +set( OPENSCAD_LIBRARIES ${CMAKE_FIND_ROOT_PATH} ) +set( EIGEN2_DIR ${CMAKE_FIND_ROOT_PATH} ) +set( CGAL_DIR ${CMAKE_FIND_ROOT_PATH}/lib/CGAL ) +set( GLEW_DIR ${CMAKE_FIND_ROOT_PATH} ) + +# +# Qt4 +# +# To workaround problems with CMake's FindQt4.cmake when combined with +# mingw-cross-env (circa early 2012), we here instead use pkg-config. To +# workaround Cmake's insertion of -bdynamic, we stick 'static' on the +# end of QT_LIBRARIES +# + +set(QT_QMAKE_EXECUTABLE ${MINGW_CROSS_ENV_DIR}/usr/bin/i686-pc-mingw32-qmake) +set(QT_MOC_EXECUTABLE ${MINGW_CROSS_ENV_DIR}/usr/bin/i686-pc-mingw32-moc) +set(QT_UIC_EXECUTABLE ${MINGW_CROSS_ENV_DIR}/usr/bin/i686-pc-mingw32-uic) + +function(mingw_cross_env_find_qt) + # called from CMakeLists.txt + find_package( PkgConfig ) + pkg_check_modules( QTCORE QtCore ) + pkg_check_modules( QTGUI QtGui ) + pkg_check_modules( QTOPENGL QtOpenGL ) + + set(QT_INCLUDE_DIRS ${QTCORE_INCLUDE_DIRS} ${QTGUI_INCLUDE_DIRS} ${QTOPENGL_INCLUDE_DIRS}) + set(QT_CFLAGS_OTHER "${QTCORE_CFLAGS_OTHER} ${QTGUI_CFLAGS_OTHER} ${QTOPENGL_CFLAGS_OTHER}") + set(QT_LIBRARIES "${QTCORE_STATIC_LDFLAGS} ${QTGUI_STATIC_LDFLAGS} ${QTOPENGL_STATIC_LDFLAGS};-static") + + set(QT_INCLUDE_DIRS ${QT_INCLUDE_DIRS} PARENT_SCOPE) + set(QT_CFLAGS_OTHER ${QT_CFLAGS_OTHER} PARENT_SCOPE) + set(QT_LIBRARIES ${QT_LIBRARIES} PARENT_SCOPE) +endfunction() + +function(mingw_cross_env_info) + message(STATUS "QT INCLUDE_DIRS: ${QT_INCLUDE_DIRS}") + message(STATUS "QT LIBRARIES: ${QT_LIBRARIES}") + message(STATUS "QT_CFLAGS_OTHER: ${QT_CFLAGS_OTHER}") +endfunction() + +# +# Part 4. -D definitions +# + +if( NOT cross_defs_set ) + add_definitions( -DGLEW_STATIC ) # FindGLEW.cmake needs this + add_definitions( -DBOOST_STATIC ) + add_definitions( -DBOOST_THREAD_USE_LIB ) + add_definitions( -DUNICODE ) # because qmake does it + set(cross_defs_set 1) +endif() diff --git a/tests/CMingw-env-cross.cmake b/tests/CMingw-env-cross.cmake deleted file mode 100644 index 8b802fc..0000000 --- a/tests/CMingw-env-cross.cmake +++ /dev/null @@ -1,119 +0,0 @@ -# Toolchain file for cross compiling OpenSCAD linux->mingw-win32. -# -# usage: -# 1. get Brad Pitcher's toolchain for OpenSCAD qmake setup: -# http://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Cross-compiling_for_Windows_on_Linux_or_Mac_OS_X -# 2. export MINGW_CROSS_ENV_DIR=where-you-installed-mingw -# 2. cmake . -DCMAKE_TOOLCHAIN_FILE=CMingw-env-cross.cmake -# 3. make should proceed as normal. -# -# see also -# -# http://mingw-cross-env.nongnu.org/#requirements -# http://www.vtk.org/Wiki/CMake_Cross_Compiling -# https://bitbucket.org/muellni/mingw-cross-env-cmake/src/2067fcf2d52e/src/cmake-1-toolchain-file.patch -# http://code.google.com/p/qtlobby/source/browse/trunk/toolchain-mingw.cmake -# http://gcc.gnu.org/onlinedocs/gcc-3.4.6/gcc/Link-Options.html -# output of qmake -# - - -# -# cross-compiler -# - -set(MINGW_CROSS_ENV_DIR $ENV{MINGW_CROSS_ENV_DIR}) - -set(BUILD_SHARED_LIBS OFF) -set(CMAKE_SYSTEM_NAME Windows) -set(MSYS 1) -set(CMAKE_FIND_ROOT_PATH ${MINGW_CROSS_ENV_DIR}/usr/i686-pc-mingw32) -set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) -set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) -set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) - -set(CMAKE_C_COMPILER ${MINGW_CROSS_ENV_DIR}/usr/bin/i686-pc-mingw32-gcc) -set(CMAKE_CXX_COMPILER ${MINGW_CROSS_ENV_DIR}/usr/bin/i686-pc-mingw32-g++) -set(CMAKE_RC_COMPILER ${MINGW_CROSS_ENV_DIR}/usr/bin/i686-pc-mingw32-windres) -set(PKG_CONFIG_EXECUTABLE ${MINGW_CROSS_ENV_DIR}/usr/bin/i686-pc-mingw32-pkg-config) -set(QT_QMAKE_EXECUTABLE ${MINGW_CROSS_ENV_DIR}/usr/bin/i686-pc-mingw32-qmake) -set(CMAKE_INSTALL_PREFIX ${MINGW_CROSS_ENV_DIR}/usr/i686-pc-mingw32 CACHE PATH "Installation Prefix") -set(CMAKE_BUILD_TYPE Release CACHE STRING "Debug|Release|RelWithDebInfo|MinSizeRel") - -# -# libraries -# - -set( Boost_USE_STATIC_LIBS ON ) -set( Boost_USE_MULTITHREADED ON ) -set( Boost_COMPILER "_win32" ) -# set( Boost_DEBUG TRUE ) # for debugging cmake's FindBoost, not boost itself - -set( OPENSCAD_LIBRARIES ${CMAKE_FIND_ROOT_PATH} ) -set( EIGEN2_DIR ${CMAKE_FIND_ROOT_PATH} ) -set( CGAL_DIR ${CMAKE_FIND_ROOT_PATH}/lib/CGAL ) -set( GLEW_DIR ${CMAKE_FIND_ROOT_PATH} ) -set( SKIP_IMAGEMAGICK TRUE ) -set( ImageMagick_convert_EXECUTABLE /usr/bin/convert ) - -# -# QT -# - -set(QT_QMAKE_EXECUTABLE ${MINGW_CROSS_ENV_DIR}/usr/bin/i686-pc-mingw32-qmake) -set(QT_MOC_EXECUTABLE ${MINGW_CROSS_ENV_DIR}/usr/bin/i686-pc-mingw32-moc) -set(QT_UIC_EXECUTABLE ${MINGW_CROSS_ENV_DIR}/usr/bin/i686-pc-mingw32-uic) - -# -# There are various problems introduced to cmake's linking by the large -# number of libraries needed by OpenSCAD and the complicated build system. -# -# Here we copy the flags and libraries from from looking at -# "qmake && make VERBOSE=1" as well as examining -# the .prl files in mingw-cross-env/usr/i686-pc-mingw32/lib & using google -# Another good resource are the files under usr/i686-pc-mingw32/mkspecs -# - -if (NOT MINGW_CROSS_FLAGS_SET) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -UQT_DLL -frtti -fexceptions -mthreads -Wall -DQT_LARGEFILE_SUPPORT") - set(MINGW_CROSS_FLAGS_SET 1) -endif() - -function(mingw_cross_env_info) - message(STATUS "QT USE FILE: ${QT_USE_FILE}") - message(STATUS "QT INCLUDES: ${QT_INCLUDES}") - message(STATUS "QT LIBRARY_DIR: ${QT_LIBRARY_DIR}") - message(STATUS "QT LIBRARIES: ${QT_LIBRARIES}") -endfunction() - -function(mingw_cross_env_add_missing_libs) - # mingw_cross_env_info() - set(mingw_cross_libs imm32 winmm ws2_32 glu32 opengl32 mng lcms tiff jpeg png z lzma) - target_link_libraries(opencsgtest ${mingw_cross_libs}) - target_link_libraries(csgtermtest ${mingw_cross_libs}) - target_link_libraries(csgtexttest ${mingw_cross_libs}) - target_link_libraries(dumptest ${mingw_cross_libs}) - target_link_libraries(echotest ${mingw_cross_libs}) - target_link_libraries(cgalpngtest ${mingw_cross_libs}) - target_link_libraries(throwntogethertest ${mingw_cross_libs}) - target_link_libraries(cgaltest ${mingw_cross_libs}) - target_link_libraries(cgalstlsanitytest ${mingw_cross_libs}) -endfunction() - -# -# -D definitions -# - -if( NOT CROSS_DEFS_SET ) - add_definitions( -DQT_THREAD_SUPPORT ) - add_definitions( -DGLEW_STATIC ) - add_definitions( -DBOOST_STATIC ) - add_definitions( -DBOOST_THREAD_USE_LIB ) - add_definitions( -DUNICODE ) - - set(CROSS_DEFS_SET 1) - -endif() - - - -- cgit v0.10.1