From ef1d205a2e9919c3ffe83d84742b3dad1a48d029 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Mon, 12 Jan 2009 11:34:03 +0000 Subject: [PATCH] From Mattias Helsing, "'ve finally finished the rework of the packaging support. It is streamlined for tgz and has most of the features that Robert, J-S and Sukender requested in december. I have an idea of how to discover the vc80 sp1 or not but haven't had time to implement. The script is completely reworked and now doesn't include cmakes' bundled CPack.cmake script at all. In summary: * filenames are ---[-compiler]-.tar.gz, ex. libopenscenegraph-2.7.9-Linux-i386-Release.tar.gz, libopenthreads-dev-2.7.9-win32-x86-vc80sp1-Debug.tar.gz * targets (projects in msvs) are generated for each specified component, a target that packages everything that is installed (openscenegraph-all) and there's a target for running all other packaging targets (Package ALL on msvs, package_ALL in unix makefiles). * It is possible to set the compiler in ccmake (cmake-gui, whatever you use) * the top folder in packages is the same for all packages (OpenSceneGraph-x.y) * the packaging support is limited with cmake-2.6.0 and not as dynamic. With cmake-2.6.1 and later building the gdal plugin (for example) will create a package_libopenscenegraph-gdal target. With cmake-2.6.0 only the ones that are always built (libopenscenegraph, libopenscenegraph-dev, openscenegraph, libopenthreads, libopenthreads-dev * i found a better way to decide whether cpack is available to guard the BUiLD_OSG_PACKAGES option" --- CMakeLists.txt | 4 +- CMakeModules/OsgCPack.cmake | 179 +++++++++++++++------------ CMakeModules/OsgCPackConfig.cmake.in | 5 +- 3 files changed, 106 insertions(+), 82 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 941eda3eb..96b012bcf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -743,13 +743,13 @@ IF(NOT OSG_CONFIG_HAS_BEEN_RUN_BEFORE) ENDIF(NOT OSG_CONFIG_HAS_BEEN_RUN_BEFORE) # CPack is only available for cmake version >= 2.6.0 -IF(CMAKE_MAJOR_VERSION EQUAL 2 AND CMAKE_MINOR_VERSION GREATER 4) +IF(CMAKE_CPACK_COMMAND) # If CMake >= 2.6.0 OPTION(BUILD_OSG_PACKAGES "Set to ON to generate CPack configuration files and default packaging targets" OFF) IF(BUILD_OSG_PACKAGES) INCLUDE(OsgCPack) ENDIF(BUILD_OSG_PACKAGES) -ENDIF(CMAKE_MAJOR_VERSION EQUAL 2 AND CMAKE_MINOR_VERSION GREATER 4) +ENDIF(CMAKE_CPACK_COMMAND) #----------------------------------------------------------------------------- ### uninstall target diff --git a/CMakeModules/OsgCPack.cmake b/CMakeModules/OsgCPack.cmake index 859d9bbba..d387545ce 100644 --- a/CMakeModules/OsgCPack.cmake +++ b/CMakeModules/OsgCPack.cmake @@ -15,44 +15,51 @@ SET(SYSTEM_NAME ${CMAKE_SYSTEM_NAME}) #message(STATUS "CMAKE_SYSTEM_NAME ${CMAKE_SYSTEM_NAME}") #message(STATUS "CMAKE_SYSTEM_PROCESSOR ${CMAKE_SYSTEM_PROCESSOR}") -SET(OSG_CPACK_COMPILER "" CACHE STRING "This ia short string (vc90, vc80sp1, g++-4.3, ...) describing your compiler. The string is used for creating package filenames") +# Platform specific settings. +# Includes setting the compiler and specifying debug/release build +# for windows the SYSTEM_NAME is set win32/64 instead of windows +IF(MSVC) + #Visual C++, 32-bit, version 6.0 1200 + #Visual C++, 32-bit, version .net 2002 1300 + #Visual C++, 32-bit, version .net 2003 1310 + #Visual C++, 32-bit, version 2005 1400 (vc80) + #Visual C++, 32-bit, version 2005 SP1 1400 (vc80_sp1) + #Visual C++, 32-bit, version 2008 1500 (vc90) -# Windows specific settings. -# For windows the compiler needs to be specified in the package filename -IF(WIN32) - IF(MSVC) - #message(STATUS "MSVC_VERSION ${MSVC_VERSION}") - #Visual C++, 32-bit, version 6.0 1200 - #Visual C++, 32-bit, version .net 2002 1300 - #Visual C++, 32-bit, version .net 2003 1310 - #Visual C++, 32-bit, version 2005 1400 (vc80) - #Visual C++, 32-bit, version 2005 SP1 14?? (vc80_sp1) - #Visual C++, 32-bit, version 2008 1500 (vc90) - - IF(MSVC_VERSION EQUAL 1500) - SET(OSG_CPACK_COMPILER "vc90") - ENDIF(MSVC_VERSION EQUAL 1500) - - IF(MSVC_VERSION EQUAL 1400) # This doesn't work with my 2005 vc80sp1 compiler + IF(MSVC_VERSION EQUAL 1500) + SET(OSG_CPACK_COMPILER "vc90") + ELSE(MSVC_VERSION EQUAL 1500) + # This if doesn't detect my 2005 vc80sp1 compiler. Have to rely on COMPILER_2005 + IF(MSVC_VERSION EQUAL 1400) SET(OSG_CPACK_COMPILER "vc80") ELSE(MSVC_VERSION EQUAL 1400) IF(CMAKE_COMPILER_2005) SET(OSG_CPACK_COMPILER "vc80") ENDIF(CMAKE_COMPILER_2005) ENDIF(MSVC_VERSION EQUAL 1400) + ENDIF(MSVC_VERSION EQUAL 1500) - IF(MSVC_VERSION EQUAL 1310) - SET(OSG_CPACK_COMPILER "vc70") - ENDIF(MSVC_VERSION EQUAL 1310) + IF(MSVC_VERSION EQUAL 1310) + SET(OSG_CPACK_COMPILER "vc70") + ENDIF(MSVC_VERSION EQUAL 1310) - # check arch bitcount and include this in the system name - IF(CMAKE_CL_64) - SET(SYSTEM_NAME "win64") - ELSE(CMAKE_CL_64) - SET(SYSTEM_NAME "win32") - ENDIF(CMAKE_CL_64) - ENDIF(MSVC) -ENDIF(WIN32) + # check arch bitcount + IF(CMAKE_CL_64) + SET(SYSTEM_NAME "win64") + ELSE(CMAKE_CL_64) + SET(SYSTEM_NAME "win32") + ENDIF(CMAKE_CL_64) +ELSE(MSVC) + # on un*x an empty CMAKE_BUILD_TYPE means release + IF(CMAKE_BUILD_TYPE) + SET(SYSTEM_BUILD_TYPE ${CMAKE_BUILD_TYPE}) + ELSE(CMAKE_BUILD_TYPE) + SET(SYSTEM_BUILD_TYPE "Release") + ENDIF(CMAKE_BUILD_TYPE) +ENDIF(MSVC) + +# expose the compiler setting to the user +SET(OSG_CPACK_COMPILER "${OSG_CPACK_COMPILER}" CACHE STRING "This ia short string (vc90, vc80sp1, gcc-4.3, ...) describing your compiler. The string is used for creating package filenames") IF(OSG_CPACK_COMPILER) SET(OSG_CPACK_SYSTEM_SPEC_STRING ${SYSTEM_NAME}-${SYSTEM_ARCH}-${OSG_CPACK_COMPILER}) @@ -60,78 +67,96 @@ ELSE(OSG_CPACK_COMPILER) SET(OSG_CPACK_SYSTEM_SPEC_STRING ${SYSTEM_NAME}-${SYSTEM_ARCH}) ENDIF(OSG_CPACK_COMPILER) -#message(STATUS "OSG_CPACK_SYSTEM_SPEC_STRING ${OSG_CPACK_SYSTEM_SPEC_STRING}") -# expose this to the user/packager -SET(CPACK_PACKAGE_CONTACT "" CACHE STRING "Supply contact information (email) here") ## variables that apply to all packages SET(CPACK_PACKAGE_NAME ${CMAKE_PROJECT_NAME}) -SET(CPACK_PACKAGE_FILE_NAME "openscenegraph-all-${OPENSCENEGRAPH_VERSION}-${OSG_CPACK_SYSTEM_SPEC_STRING}") +#SET(CPACK_PACKAGE_FILE_NAME "openscenegraph-all-${OPENSCENEGRAPH_VERSION}-${OSG_CPACK_SYSTEM_SPEC_STRING}") +SET(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${OPENSCENEGRAPH_MAJOR_VERSION}.${OPENSCENEGRAPH_MINOR_VERSION}") SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "The OpenSceneGraph is an open source high performance 3d graphics toolkit") -SET(CPACK_PACKAGE_VENDOR "The OpenSceneGraph authors") -SET(CPACK_PACKAGE_DESCRIPTION_FILE "${OpenSceneGraph_SOURCE_DIR}/README.txt") -SET(CPACK_RESOURCE_FILE_LICENSE "${OpenSceneGraph_SOURCE_DIR}/LICENSE.txt") +SET(CPACK_PACKAGE_VENDOR "The OpenSceneGraph developers and contributors lead by Robert Osfield") SET(CPACK_PACKAGE_VERSION_MAJOR ${OPENSCENEGRAPH_MAJOR_VERSION}) SET(CPACK_PACKAGE_VERSION_MINOR ${OPENSCENEGRAPH_MINOR_VERSION}) SET(CPACK_PACKAGE_VERSION_PATCH ${OPENSCENEGRAPH_PATCH_VERSION}) SET(CPACK_PACKAGE_INSTALL_DIRECTORY "OpenSceneGraph-${OPENSCENEGRAPH_MAJOR_VERSION}.${OPENSCENEGRAPH_MINOR_VERSION}") SET(CPACK_TOPLEVEL_TAG ${CPACK_PACKAGE_NAME}-${OPENSCENEGRAPH_VERSION}) -SET(CPACK_SOURCE_TOPLEVEL_TAG ${CPACK_PACKAGE_NAME}-${OPENSCENEGRAPH_VERSION}-src) -SET(CPACK_SOURCE_PACKAGE_FILE_NAME "openscenegraph-${OPENSCENEGRAPH_VERSION}-src") -# Add the build directory to the ignore patterns and expose var to the users -# N.B. This is especially important if your are building out-of-source but under the source tree (i.e /build). -# If you don't name your builddir here it will get pulled into the src package. Size of my build tree is gigabytes so you dont want this -SET(CPACK_SOURCE_IGNORE_FILES "/\\\\\\\\.svn/;\\\\\\\\.swp$;\\\\\\\\.#;/#;build" CACHE STRING "Add ignore patterns that will left out of the src package") # these goes for all platforms. Setting these stops the CPack.cmake script from generating options about other package compression formats (.z .tz, etc.) SET(CPACK_GENERATOR "TGZ") SET(CPACK_SOURCE_GENERATOR "TGZ") -IF(WIN32 AND NOT UNIX) - - OPTION(BUILD_NSIS_PACKAGE "Turn this ON if you want to generate a visual installer using NSIS (nsis.sourceforge.net)" OFF) - IF(BUILD_NSIS_PACKAGE) - # There is a bug in NSIS that does not handle full unix paths properly. Make - # sure there is at least one set of four (4) backlasshes. - SET(CPACK_PACKAGE_ICON "${OpenSceneGraph_SOURCE_DIR}/PlatformSpecifics/Windows/icons\\\\osg.ico") - SET(CPACK_NSIS_INSTALLED_ICON_NAME "") - SET(CPACK_NSIS_DISPLAY_NAME "OpenSceneGraph ${OPENSCENEGRAPH_VERSION}") - SET(CPACK_NSIS_HELP_LINK "http:\\\\\\\\www.openscenegraph.org/projects/osg/wiki/Support") - SET(CPACK_NSIS_URL_INFO_ABOUT "http:\\\\\\\\www.openscenegraph.org/projects/osg/wiki/About") - SET(CPACK_NSIS_CONTACT "") - SET(CPACK_NSIS_MODIFY_PATH ON) - SET(CPACK_GENERATOR "NSIS") - ENDIF(BUILD_NSIS_PACKAGE) -ELSE(WIN32 AND NOT UNIX) - SET(CPACK_STRIP_FILES ON) - SET(CPACK_SOURCE_STRIP_FILES ON) -ENDIF(WIN32 AND NOT UNIX) +# for msvc we use it's internally defined variable to get the configuration (debug,release, ...) +IF(MSVC) + SET(OSG_CPACK_CONFIGURATION "$(OutDir)") + SET(PACKAGE_TARGET_PREFIX "Package ") +ELSE(MSVC) + SET(OSG_CPACK_CONFIGURATION "${SYSTEM_BUILD_TYPE}") + SET(PACKAGE_TARGET_PREFIX "package_") +ENDIF(MSVC) -#STRING(TOLOWER "${CMAKE_SYSTEM_NAME}" CPACK_SYSTEM_NAME) +# Get all defined components +IF(CMAKE_MAJOR_VERSION EQUAL 2 AND CMAKE_MINOR_VERSION GREATER 4 AND CMAKE_PATCH_VERSION GREATER 0) + GET_CMAKE_PROPERTY(CPACK_COMPONENTS_ALL COMPONENTS) +ELSE(CMAKE_MAJOR_VERSION EQUAL 2 AND CMAKE_MINOR_VERSION GREATER 4 AND CMAKE_PATCH_VERSION GREATER 0) + # cmake 2.6.0 didn't supply the COMPONENTS property. + # I set it manually to be the packages that can always be packaged + MESSAGE("When building packages please consider using cmake version 2.6.1 or above") + SET(CPACK_COMPONENTS_ALL libopenscenegraph openscenegraph libopenthreads libopenscenegraph-dev libopenthreads-dev) +ENDIF(CMAKE_MAJOR_VERSION EQUAL 2 AND CMAKE_MINOR_VERSION GREATER 4 AND CMAKE_PATCH_VERSION GREATER 0) -# Including CPack will generate CPackConfig.cmake and CPackSourceConfig.cmake and make targets regardless of how i call it -# The first idea was to not use it at all and that might be where we're going. For now it also defines some useful macros, especially -# for the visual installers, so I decided to include it to have the possibility to create visual installers for ms and mac and then try to -# make the best use I could of the targets that including CPack implies -INCLUDE(CPack) +# Create a target that will be used to generate all packages defined below +SET(PACKAGE_ALL_TARGETNAME "${PACKAGE_TARGET_PREFIX}ALL") +ADD_CUSTOM_TARGET(${PACKAGE_ALL_TARGETNAME}) + +MACRO(GENERATE_PACKAGING_TARGET package_name) + SET(CPACK_PACKAGE_NAME ${package_name}) -# including CPack also has the benefit of creating this nice variable which is a collection of all defined COMPONENTS -# Create configs and targets for each component -FOREACH(package ${CPACK_COMPONENTS_ALL}) # the doc packages don't need a system-arch specification IF(${package} MATCHES -doc) - SET(CPACK_PACKAGE_FILE_NAME ${package}-${OPENSCENEGRAPH_VERSION}) + SET(OSG_PACKAGE_FILE_NAME ${package_name}-${OPENSCENEGRAPH_VERSION}) ELSE(${package} MATCHES -doc) - SET(CPACK_PACKAGE_FILE_NAME ${package}-${OPENSCENEGRAPH_VERSION}-${OSG_CPACK_SYSTEM_SPEC_STRING}) + SET(OSG_PACKAGE_FILE_NAME ${package_name}-${OPENSCENEGRAPH_VERSION}-${OSG_CPACK_SYSTEM_SPEC_STRING}-${OSG_CPACK_CONFIGURATION}) ENDIF(${package} MATCHES -doc) - SET(OSG_CPACK_COMPONENT ${package}) - CONFIGURE_FILE("${OpenSceneGraph_SOURCE_DIR}/CMakeModules/OsgCPackConfig.cmake.in" "${OpenSceneGraph_BINARY_DIR}/CPackConfig-${OSG_CPACK_COMPONENT}.cmake" IMMEDIATE) + CONFIGURE_FILE("${OpenSceneGraph_SOURCE_DIR}/CMakeModules/OsgCPackConfig.cmake.in" "${OpenSceneGraph_BINARY_DIR}/CPackConfig-${package_name}.cmake" IMMEDIATE) - ADD_CUSTOM_TARGET("package_${package}" - COMMAND ${CMAKE_CPACK_COMMAND} --config ${OpenSceneGraph_BINARY_DIR}/CPackConfig-${OSG_CPACK_COMPONENT}.cmake - COMMENT Run CPack packaging for ${package}... + SET(PACKAGE_TARGETNAME "${PACKAGE_TARGET_PREFIX}${package_name}") + # Create a target that creates the current package + ADD_CUSTOM_TARGET(${PACKAGE_TARGETNAME}) + ADD_CUSTOM_COMMAND(TARGET ${PACKAGE_TARGETNAME} + COMMAND ${CMAKE_CPACK_COMMAND} -C ${OSG_CPACK_CONFIGURATION} --config ${OpenSceneGraph_BINARY_DIR}/CPackConfig-${package_name}.cmake + COMMENT "Run CPack packaging for ${package_name}..." ) + ADD_CUSTOM_COMMAND(TARGET ${PACKAGE_ALL_TARGETNAME} + COMMAND ${CMAKE_CPACK_COMMAND} -C ${OSG_CPACK_CONFIGURATION} --config ${OpenSceneGraph_BINARY_DIR}/CPackConfig-${package_name}.cmake + ) + + # This is naive and will probably need fixing eventually + IF(MSVC) + SET(MOVE_COMMAND "move") + ELSE(MSVC) + SET(MOVE_COMMAND "mv") + ENDIF(MSVC) + + # Rename the package to get the proper filename --[compiler]-.tar.gz + ADD_CUSTOM_COMMAND(TARGET ${PACKAGE_TARGETNAME} +# COMMAND "${MOVE_COMMAND}" "${CPACK_PACKAGE_FILE_NAME}.tar.gz" "${OSG_PACKAGE_FILE_NAME}-$(OutDir).tar.gz" + COMMAND "${MOVE_COMMAND}" "${CPACK_PACKAGE_FILE_NAME}.tar.gz" "${OSG_PACKAGE_FILE_NAME}.tar.gz" + ) + # Add the exact same custom command to the all package generating target. + # I can't use add_dependencies to do this because it would allow parallell building of packages so am going brute here + ADD_CUSTOM_COMMAND(TARGET ${PACKAGE_ALL_TARGETNAME} + COMMAND "${MOVE_COMMAND}" "${CPACK_PACKAGE_FILE_NAME}.tar.gz" "${OSG_PACKAGE_FILE_NAME}.tar.gz" + ) +ENDMACRO(GENERATE_PACKAGING_TARGET) + +# Create configs and targets for a package including all components +SET(OSG_CPACK_COMPONENT ALL) +GENERATE_PACKAGING_TARGET(openscenegraph-all) + +# Create configs and targets for each component +FOREACH(package ${CPACK_COMPONENTS_ALL}) + SET(OSG_CPACK_COMPONENT ${package}) + GENERATE_PACKAGING_TARGET(${package}) ENDFOREACH(package ${CPACK_COMPONENTS_ALL}) diff --git a/CMakeModules/OsgCPackConfig.cmake.in b/CMakeModules/OsgCPackConfig.cmake.in index 87bd90c44..5afaa7d4b 100644 --- a/CMakeModules/OsgCPackConfig.cmake.in +++ b/CMakeModules/OsgCPackConfig.cmake.in @@ -54,11 +54,10 @@ SET(CPACK_OUTPUT_CONFIG_FILE "${PROJECT_BINARY_DIR}/CPackConfig-${OSG_CPACK_COMP SET(CPACK_PACKAGE_DEFAULT_LOCATION "/") SET(CPACK_PACKAGE_DESCRIPTION_FILE "${OpenSceneGraph_SOURCE_DIR}/README.txt") SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "The OpenSceneGraph is an open source high performance 3d graphics toolkit") -#SET(CPACK_PACKAGE_EXECUTABLES "osgviewer;The generic viewer") SET(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_FILE_NAME}") SET(CPACK_PACKAGE_INSTALL_DIRECTORY "${CPACK_PACKAGE_INSTALL_DIRECTORY}") SET(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "${CMAKE_PROJECT_NAME}-${OPENSCENEGRAPH_VERSION}") -SET(CPACK_PACKAGE_NAME "${CMAKE_PROJECT_NAME}") +SET(CPACK_PACKAGE_NAME "${CPACK_PACKAGE_NAME}") SET(CPACK_PACKAGE_RELOCATABLE "true") SET(CPACK_PACKAGE_VENDOR "") SET(CPACK_PACKAGE_VERSION "${OPENSCENEGRAPH_VERSION}") @@ -67,6 +66,6 @@ SET(CPACK_PACKAGE_VERSION_MINOR "${OPENSCENEGRAPH_MINOR_VERSION}") SET(CPACK_PACKAGE_VERSION_PATCH "${OPENSCENEGRAPH_PATCH_VERSION}") SET(CPACK_RESOURCE_FILE_LICENSE "${OpenSceneGraph_SOURCE_DIR}/LICENSE.txt") SET(CPACK_RESOURCE_FILE_README "${OpenSceneGraph_SOURCE_DIR}/README.txt") -SET(CPACK_RESOURCE_FILE_WELCOME "${CMAKE_ROOT}/share/cmake-2.6/Templates/CPack.GenericWelcome.txt") +SET(CPACK_RESOURCE_FILE_WELCOME "${OpenSceneGraph_SOURCE_DIR}/NEWS.txt") SET(CPACK_SET_DESTDIR "OFF") SET(CPACK_STRIP_FILES "ON")