From 2911b203ce0f2de2089430a1ba5967ca5f26aa31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Fri, 18 Mar 2011 00:07:40 +0100 Subject: [PATCH] DFHack. Now with more packaging fun. --- CMakeLists.txt | 64 ++++++++++++++++++++++++++++++---- library/CMakeLists.txt | 53 ++++++++-------------------- tools/supported/CMakeLists.txt | 4 +-- 3 files changed, 73 insertions(+), 48 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ab3466498..416c51d17 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,27 +11,62 @@ SET(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/CMake/Modules) SET(CMAKE_SOURCE_DIR ${PROJECT_SOURCE_DIR}) if("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}") - message(SEND_ERROR "In-source builds are not allowed.") + message(FATAL_ERROR "In-source builds are not allowed.") endif() -## version - only set this for actual releases -SET (DFHACK_VERSION "dev" CACHE STRING "Version number of dfhack. Set to 'dev' by default. Only set for releases." ) +set(DEVEL_RELEASE "-dev") +set(CPACK_PACKAGE_VERSION_MAJOR "0") +set(CPACK_PACKAGE_VERSION_MINOR "5") +set(CPACK_PACKAGE_VERSION_PATCH "8") +set(DFHACK_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}${DEVEL_RELEASE}") +set(CPACK_PACKAGE_NAME "dfhack") ## setting the build type IF(NOT DEFINED CMAKE_BUILD_TYPE) SET(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel.") ENDIF() -## put everything in one big ugly directory to make MSVC and KDevelop happy +## put everything in one big ugly directory to make MSVC and KDevelop debuggers happy SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") +SET(DFHACK_INSTALL "portable" CACHE STRING "Choose the install type: 'portable' for a portable zip or tar.gz package, 'linux' for packaging and system installs on linux, 'none' for no install target (default).") +SET( MEMXML_DATA_PATH . CACHE PATH "Path to a valid Memory.xml file. This is baked into the library, so when you package DFHack for linux, set it to the right path.") + +IF(${DFHACK_INSTALL} STREQUAL "portable") + # the dfhack libraries will be installed here: + SET(DFHACK_LIBRARY_DESTINATION .) + # the dfhack tools will be installed here: + SET(DFHACK_BINARY_DESTINATION .) + # Memory.xml goes here: + SET(DFHACK_DATA_DESTINATION .) + # Includes go here: + SET(DFHACK_INCLUDES_DESTINATION dev/include) + # the Windows .lib files go here: + IF(WIN32) + SET(DFHACK_DEVLIB_DESTINATION dev) + SET(CMAKE_INSTALL_SYSTEM_RUNTIME_DESTINATION .) + ENDIF() +ENDIF() + +IF(${DFHACK_INSTALL} STREQUAL "linux") + # the dfhack libraries will be installed here: + SET(DFHACK_LIBRARY_DESTINATION lib) + # the dfhack tools will be installed here: + SET(DFHACK_BINARY_DESTINATION bin) + # Memory.xml goes here: + SET(DFHACK_DATA_DESTINATION share/dfhack) + # Includes go here: + SET(DFHACK_INCLUDES_DESTINATION include) +ENDIF() + +## some options for the user/developer to play with +OPTION(BUILD_DFHACK_SUPPORTED "Build the supported tools." ON) +OPTION(BUILD_DFHACK_C_BINDINGS "Build the C portion of the library" ON) OPTION(BUILD_DFHACK_DOXYGEN "Create doxygen documentation for developers" ON) OPTION(BUILD_DFHACK_EXAMPLES "Build example tools" OFF) OPTION(BUILD_DFHACK_PLAYGROUND "Build tools from the playground folder" OFF) -OPTION(BUILD_DFHACK_C_BINDINGS "Build the C portion of the library" ON) -OPTION(BUILD_DFHACK_SUPPORTED "Build the supported toold." ON) include_directories (${CMAKE_SOURCE_DIR}/library/include/) include_directories (${CMAKE_SOURCE_DIR}/library/shm/) @@ -40,6 +75,8 @@ include_directories (${CMAKE_SOURCE_DIR}/library/depends/argstream/) add_subdirectory (library) # macro to save on typing in the tool subdirs +# builds a tool, links it to the dfhack lib and makes sure the dependency +# LOCAL_DEPNAME is built first, in case there is one MACRO(DFHACK_TOOL TOOL_NAME TOOL_SOURCES) ADD_EXECUTABLE(${TOOL_NAME} ${TOOL_SOURCES}) TARGET_LINK_LIBRARIES(${TOOL_NAME} dfhack) @@ -48,7 +85,7 @@ MACRO(DFHACK_TOOL TOOL_NAME TOOL_SOURCES) endif() install(TARGETS ${TOOL_NAME} - RUNTIME DESTINATION bin) + RUNTIME DESTINATION ${DFHACK_BINARY_DESTINATION}) ENDMACRO() IF(BUILD_DFHACK_SUPPORTED) @@ -66,3 +103,16 @@ ENDIF() IF(BUILD_DFHACK_DOXYGEN) add_subdirectory (doc) ENDIF() + +IF(${DFHACK_INSTALL} STREQUAL "portable") + IF(UNIX) + SET(CPACK_GENERATOR "TGZ") + ENDIF() + IF(WIN32) + SET(CPACK_GENERATOR "ZIP") + # this includes the MSVC C++ DLLs in the package. Doesn't work with Express versions in general. + INCLUDE(InstallRequiredSystemLibraries) + ENDIF() + set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${DFHACK_VERSION}-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}") + INCLUDE(CPack) +ENDIF() \ No newline at end of file diff --git a/library/CMakeLists.txt b/library/CMakeLists.txt index 479c05eb0..411cbb15e 100644 --- a/library/CMakeLists.txt +++ b/library/CMakeLists.txt @@ -4,7 +4,7 @@ cmake_minimum_required(VERSION 2.8) SET(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/CMake/Modules) if("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}") - message(SEND_ERROR "In-source builds are not allowed.") + message(FATAL_ERROR "In-source builds are not allowed.") endif() IF(NOT DEFINED CMAKE_BUILD_TYPE) @@ -165,8 +165,6 @@ SET_SOURCE_FILES_PROPERTIES( ${PROJECT_HDRS} PROPERTIES HEADER_FILE_ONLY TRUE ) LIST(APPEND PROJECT_SRCS ${PROJECT_HDRS}) -SET( MEMXML_DATA_PATH . CACHE PATH "search path for Memory.xml") - # Are we 64bit? (Damn you, ptrace()!) IF( CMAKE_SIZEOF_VOID_P MATCHES 4 ) SET( HAVE_64_BIT 0 ) @@ -185,7 +183,7 @@ IF(UNIX) SET(CMAKE_CXX_FLAGS_DEBUG "-g -Wall") SET(CMAKE_CXX_FLAGS "-fvisibility=hidden") - SET(PROJECT_LIBS ${X11_LIBRARY} rt ) #dfhack-md5 dfhack-tixml + SET(PROJECT_LIBS ${X11_LIBRARY} rt ) ELSE() IF(MSVC) SET(PROJECT_LIBS psapi ${CMAKE_SOURCE_DIR}/library/depends/ntdll/ntdll.lib) @@ -203,38 +201,15 @@ TARGET_LINK_LIBRARIES(dfhack ${PROJECT_LIBS}) ADD_CUSTOM_COMMAND( TARGET dfhack POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/Memory.xml ${CMAKE_BINARY_DIR}/bin/${CMAKE_CFG_INTDIR}/) -#if(MSVC) - # This is a MSVC hack used for copying files into the target directory - # of build target set in MSVC. - # It exploits the fact that MSVC has some variables in .vcproj files, much like cmake does here. - # - # So, $(TargetDir) is ignored by cmake, and replaced with the actual output directory by MSVC - #ADD_CUSTOM_COMMAND(TARGET dfhack - #COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/data/Memory-ng.xml "$(TargetDir)/Memory.xml" - #MAIN_DEPENDENCY ${CMAKE_SOURCE_DIR}/data/Memory-ng.xml - #) - #ADD_CUSTOM_COMMAND(TARGET dfhack - #COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/Compile.html "$(TargetDir)/Compile.html" - #MAIN_DEPENDENCY ${CMAKE_SOURCE_DIR}/Compile.html - #) - #ADD_CUSTOM_COMMAND(TARGET dfhack - #COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/Readme.html "$(TargetDir)/Readme.html" - #MAIN_DEPENDENCY ${CMAKE_SOURCE_DIR}/Readme.html - #) - #ADD_CUSTOM_COMMAND(TARGET dfhack - #COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/LICENSE "$(TargetDir)/LICENSE.txt" - #MAIN_DEPENDENCY ${CMAKE_SOURCE_DIR}/LICENSE - #) -#else(MSVC) - # Just put the file in the output directory on Linux and Mac - #configure_file(${CMAKE_SOURCE_DIR}/data/Memory-ng.xml ${DATA_OUTPUT_PATH}/Memory.xml COPYONLY) - #configure_file(${CMAKE_SOURCE_DIR}/Compile.html ${DATA_OUTPUT_PATH}/Compile.html COPYONLY) - #configure_file(${CMAKE_SOURCE_DIR}/Readme.html ${DATA_OUTPUT_PATH}/Readme.html COPYONLY) - #configure_file(${CMAKE_SOURCE_DIR}/LICENSE ${DATA_OUTPUT_PATH}/LICENSE.txt COPYONLY) -#endif(MSVC) - -#IF(UNIX) -# install(TARGETS dfhack LIBRARY DESTINATION lib) -# install(FILES ${CMAKE_SOURCE_DIR}/output/Memory.xml DESTINATION share/dfhack) -# install(DIRECTORY ${CMAKE_SOURCE_DIR}/library/include/ DESTINATION include FILES_MATCHING PATTERN "*.h") -#ENDIF(UNIX) +install(TARGETS dfhack + LIBRARY DESTINATION ${DFHACK_LIBRARY_DESTINATION} + RUNTIME DESTINATION ${DFHACK_LIBRARY_DESTINATION}) #linux: lib +install(FILES ${CMAKE_SOURCE_DIR}/Memory.xml + DESTINATION ${DFHACK_DATA_DESTINATION}) #linux: share/dfhack +if(WIN32) + install(TARGETS dfhack + ARCHIVE DESTINATION ${DFHACK_DEVLIB_DESTINATION}) +endif() +install(DIRECTORY ${CMAKE_SOURCE_DIR}/library/include/ + DESTINATION ${DFHACK_INCLUDES_DESTINATION} + FILES_MATCHING PATTERN "*.h" ) #linux: include diff --git a/tools/supported/CMakeLists.txt b/tools/supported/CMakeLists.txt index 601fc3b32..d652a3d29 100644 --- a/tools/supported/CMakeLists.txt +++ b/tools/supported/CMakeLists.txt @@ -98,10 +98,10 @@ IF(UNIX) TARGET_LINK_LIBRARIES(dfveinlook dfhack ${CURSES_LIBRARIES}) install(TARGETS dfveinlook - RUNTIME DESTINATION bin + RUNTIME DESTINATION ${DFHACK_BINARY_DESTINATION} ) ENDIF(NCURSES_H) ELSE(CURSES_FOUND) MESSAGE(STATUS "Wide-character ncurses library not found - veinlook can't be built") ENDIF(CURSES_FOUND) -ENDIF(UNIX) +ENDIF(UNIX) \ No newline at end of file