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")