diff --git a/CMakeLists.txt b/CMakeLists.txt index 80469faf3..b27a23cd9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,12 +2,16 @@ # Set up build types if(CMAKE_CONFIGURATION_TYPES) - SET(CMAKE_CONFIGURATION_TYPES Release RelWithDebInfo) - SET(CMAKE_CONFIGURATION_TYPES "${CMAKE_CONFIGURATION_TYPES}" CACHE STRING "List of supported configuration types" FORCE) + SET(CMAKE_CONFIGURATION_TYPES "Release;RelWithDebInfo" CACHE STRING "List of supported configuration types" FORCE) else(CMAKE_CONFIGURATION_TYPES) + set(DFHACK_TYPE_HELP "Choose the type of build, options are: Release and RelWithDebInfo") + # Prevent cmake C module attempts to overwrite our help string if (NOT CMAKE_BUILD_TYPE) - SET(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are: Release RelWithDebInfo.") + SET(CMAKE_BUILD_TYPE "Release" CACHE STRING "${DFHACK_TYPE_HELP}") + else (NOT CMAKE_BUILD_TYPE) + SET(CMAKE_BUILD_TYPE "${CMAKE_BUILD_TYPE}" CACHE STRING "${DFHACK_TYPE_HELP}") endif (NOT CMAKE_BUILD_TYPE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Release;RelWithDebInfo") endif(CMAKE_CONFIGURATION_TYPES) OPTION(BUILD_DOCS "Choose whether to build the documentation (requires python and Sphinx)." OFF) diff --git a/docs/Compile.rst b/docs/Compile.rst index 36d5550d4..9abcf7fb8 100644 --- a/docs/Compile.rst +++ b/docs/Compile.rst @@ -75,12 +75,8 @@ Build type cmake .. -DCMAKE_BUILD_TYPE:string=BUILD_TYPE -Without specifying a build type or 'None', cmake uses the -``CMAKE_CXX_FLAGS`` variable for building. - -Valid and useful build types include 'Release', 'Debug' and -'RelWithDebInfo'. -'Debug' is not available on Windows; use 'RelWithDebInfo' instead. +Valid and useful build types include 'Release' and 'RelWithDebInfo'. Default +build type is 'Release'. Target architecture (32-bit vs. 64-bit) --------------------------------------- @@ -101,6 +97,17 @@ change, so specifying it explicitly is a good idea. Note that the scripts in the "build" folder on Windows will set the architecture automatically. +Generator +--------- + +``Ninja`` cmake build generator is prefered build method instead of default +``Unix Makefiles``. You can select Ninja build using ``-G`` option. Incremental +builds using Unix Makefiles can be much slower than Ninja builds. + +:: + + cmake .. -G Ninja + Other settings -------------- There are a variety of other settings which you can find in CMakeCache.txt in @@ -141,7 +148,7 @@ Here are some package install commands for various platforms: * On Ubuntu:: - apt-get install gcc cmake git zlib1g-dev libsdl1.2-dev libxml-libxml-perl libxml-libxslt-perl + apt-get install gcc cmake ninja-build git zlib1g-dev libsdl1.2-dev libxml-libxml-perl libxml-libxslt-perl * Debian and derived distros should have similar requirements to Ubuntu. @@ -174,8 +181,8 @@ Building is fairly straightforward. Enter the ``build`` folder (or create an empty folder in the DFHack directory to use instead) and start the build like this:: cd build - cmake .. -DCMAKE_BUILD_TYPE:string=Release -DCMAKE_INSTALL_PREFIX= - make install # or make -jX install on multi-core systems to compile with X parallel processes + cmake .. -G Ninja -DCMAKE_BUILD_TYPE:string=Release -DCMAKE_INSTALL_PREFIX= + ninja install should be a path to a copy of Dwarf Fortress, of the appropriate version for the DFHack you are building. This will build the library along @@ -184,8 +191,8 @@ with the normal set of plugins and install them into your DF folder. Alternatively, you can use ccmake instead of cmake:: cd build - ccmake .. - make install + ccmake .. -G Ninja + ninja install This will show a curses-based interface that lets you set all of the extra options. You can also use a cmake-friendly IDE like KDevelop 4 @@ -218,7 +225,7 @@ compilation-for-distribution with a GCC newer than 4.8. Mac OS X ======== DFHack functions similarly on OS X and Linux, and the majority of the -information above regarding the build process (cmake and make) applies here +information above regarding the build process (cmake and ninja) applies here as well. DFHack can officially be built on OS X with GCC 4.8 or 7. Anything newer than 7 @@ -281,11 +288,12 @@ Dependencies and system set-up brew tap homebrew/versions brew install git brew install cmake + brew install ninja brew install gcc@7 Using `MacPorts `_:: - sudo port install gcc7 +universal cmake +universal git-core +universal + sudo port install gcc7 +universal cmake +universal git-core +universal ninja +universal Macports will take some time - maybe hours. At some point it may ask you to install a Java environment; let it do so. @@ -348,8 +356,8 @@ Building mkdir build-osx cd build-osx - cmake .. -DCMAKE_BUILD_TYPE:string=Release -DCMAKE_INSTALL_PREFIX= - make install # or make -j X install on multi-core systems to compile with X parallel processes + cmake .. -G Ninja -DCMAKE_BUILD_TYPE:string=Release -DCMAKE_INSTALL_PREFIX= + ninja install should be a path to a copy of Dwarf Fortress, of the appropriate version for the DFHack you are building. @@ -731,7 +739,7 @@ files alphabetically, so all the files you need should be next to each other. It is recommended that you create a build folder and run CMake to verify that you have downloaded everything at this point, assuming your download machine has CMake installed. This involves running a "generate" batch script on Windows, or -a command starting with ``cmake ..`` on Linux and OS X, following the +a command starting with ``cmake .. -G Ninja`` on Linux and OS X, following the instructions in the sections above. CMake should automatically locate files that you placed in ``CMake/downloads``, and use them instead of attempting to download them. diff --git a/docs/changelog.txt b/docs/changelog.txt index 047a7b277..bb3f571c1 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -111,6 +111,9 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: -@ macOS: fixed ``renderer`` vtable address on x64 (fixes `rendermax`) - `stonesense`: fixed ``PLANT:DESERT_LIME:LEAF`` typo +## Internals +- Fixed cmake build dependencies for generated headers files + ## API - Added C++-style linked list interface for DF linked lists diff --git a/library/.gitignore b/library/.gitignore new file mode 100644 index 000000000..e22769b30 --- /dev/null +++ b/library/.gitignore @@ -0,0 +1 @@ +git-describe.cmake diff --git a/library/CMakeLists.txt b/library/CMakeLists.txt index 34aaa3470..33a430337 100644 --- a/library/CMakeLists.txt +++ b/library/CMakeLists.txt @@ -258,15 +258,22 @@ LIST(APPEND PROJECT_SOURCES ${GENERATED_HDRS}) FILE(GLOB GENERATE_INPUT_SCRIPTS ${dfapi_SOURCE_DIR}/xml/*.pm ${dfapi_SOURCE_DIR}/xml/*.xslt) FILE(GLOB GENERATE_INPUT_XMLS ${dfapi_SOURCE_DIR}/xml/df.*.xml) +set(CODEGEN_OUT ${dfapi_SOURCE_DIR}/include/df/codegen.out.xml) +LIST(APPEND CODEGEN_OUT ${GENERATED_HDRS}) + ADD_CUSTOM_COMMAND( - OUTPUT ${dfapi_SOURCE_DIR}/include/df/codegen.out.xml - COMMAND ${PERL_EXECUTABLE} xml/codegen.pl xml include/df - WORKING_DIRECTORY ${dfapi_SOURCE_DIR} + OUTPUT ${CODEGEN_OUT} + COMMAND ${PERL_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/xml/codegen.pl + ${CMAKE_CURRENT_SOURCE_DIR}/xml + ${CMAKE_CURRENT_SOURCE_DIR}/include/df MAIN_DEPENDENCY ${dfapi_SOURCE_DIR}/xml/codegen.pl + COMMENT "Generating codegen.out.xml and df/headers" DEPENDS ${GENERATE_INPUT_XMLS} ${GENERATE_INPUT_SCRIPTS} ) -ADD_CUSTOM_TARGET(generate_headers DEPENDS ${dfapi_SOURCE_DIR}/include/df/codegen.out.xml) +ADD_CUSTOM_TARGET(generate_headers + DEPENDS ${dfapi_SOURCE_DIR}/include/df/codegen.out.xml) + IF(REMOVE_SYMBOLS_FROM_DF_STUBS) IF(UNIX) # Don't produce debug info for generated stubs @@ -302,7 +309,14 @@ ELSE(WIN32) SET(PROJECT_LIBS psapi dfhack-md5 ${DFHACK_TINYXML} dfhack-tinythread) ENDIF() -ADD_LIBRARY(dfhack-version STATIC DFHackVersion.cpp) +set(VERSION_SRCS DFHackVersion.cpp) +set(VERSION_HDRS include/git-describe.h) + +SET_SOURCE_FILES_PROPERTIES(${VERSION_HDRS} PROPERTIES HEADER_FILE_ONLY TRUE) + +LIST(APPEND VERSION_SRCS ${VERSION_HDRS}) + +ADD_LIBRARY(dfhack-version STATIC ${VERSION_SRCS}) SET_PROPERTY(TARGET dfhack-version APPEND PROPERTY COMPILE_DEFINITIONS DFHACK_VERSION="${DFHACK_VERSION}" DF_VERSION="${DF_VERSION}" @@ -315,20 +329,24 @@ IF(DFHACK_PRERELEASE) ) ENDIF() -# always re-run git-describe if cmake is re-run (e.g. if build ID or version changes) -EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_SOURCE_DIR}/git-describe.cmake) -ADD_CUSTOM_TARGET(git-describe - COMMAND ${CMAKE_COMMAND} - -D dfhack_SOURCE_DIR:STRING=${dfhack_SOURCE_DIR} - -D GIT_EXECUTABLE:STRING=${GIT_EXECUTABLE} - -D DFHACK_BUILD_ID:STRING=${DFHACK_BUILD_ID} - -P ${CMAKE_CURRENT_SOURCE_DIR}/git-describe.cmake - COMMENT "Obtaining git commit information" -) -ADD_DEPENDENCIES(dfhack-version git-describe) +configure_file(git-describe.cmake.in ${CMAKE_CURRENT_SOURCE_DIR}/git-describe.cmake @ONLY) +if (EXISTS ${CMAKE_SOURCE_DIR}/.git/index AND EXISTS ${CMAKE_SOURCE_DIR}/.git/modules/library/xml/index) + ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/include/git-describe.h + COMMAND ${CMAKE_COMMAND} + -D dfhack_SOURCE_DIR:STRING=${dfhack_SOURCE_DIR} + -D GIT_EXECUTABLE:STRING=${GIT_EXECUTABLE} + -P ${CMAKE_CURRENT_SOURCE_DIR}/git-describe.cmake + COMMENT "Obtaining git commit information" + DEPENDS ${CMAKE_SOURCE_DIR}/.git/index + ${CMAKE_SOURCE_DIR}/.git/modules/library/xml/index + ${CMAKE_CURRENT_SOURCE_DIR}/git-describe.cmake + include/git-describe.h.in + ) +endif () ADD_LIBRARY(dfhack SHARED ${PROJECT_SOURCES}) -ADD_DEPENDENCIES(dfhack generate_headers generate_proto_core) +ADD_DEPENDENCIES(dfhack generate_proto_core) +ADD_DEPENDENCIES(dfhack generate_headers) ADD_LIBRARY(dfhack-client SHARED RemoteClient.cpp ColorText.cpp MiscUtils.cpp Error.cpp ${PROJECT_PROTO_SRCS}) ADD_DEPENDENCIES(dfhack-client dfhack) diff --git a/library/git-describe.cmake b/library/git-describe.cmake deleted file mode 100644 index 6650dbde4..000000000 --- a/library/git-describe.cmake +++ /dev/null @@ -1,53 +0,0 @@ -if(NOT EXISTS ${dfhack_SOURCE_DIR}/.git/index OR NOT EXISTS ${dfhack_SOURCE_DIR}/.git/modules/library/xml/index) - MESSAGE(FATAL_ERROR "Could not find git index file(s)") -endif() - -set(git_describe_tmp_h ${dfhack_SOURCE_DIR}/library/include/git-describe.tmp.h) -set(git_describe_h ${dfhack_SOURCE_DIR}/library/include/git-describe.h) - -if(EXISTS ${git_describe_tmp_h} AND - NOT(${dfhack_SOURCE_DIR}/.git/index IS_NEWER_THAN ${git_describe_tmp_h}) AND - NOT(${dfhack_SOURCE_DIR}/.git/modules/library/xml/index IS_NEWER_THAN ${git_describe_tmp_h}) AND - NOT(${dfhack_SOURCE_DIR}/library/git-describe.cmake IS_NEWER_THAN ${git_describe_tmp_h})) - return() -endif() - -execute_process(COMMAND ${GIT_EXECUTABLE} describe --tags --abbrev=8 --long - WORKING_DIRECTORY "${dfhack_SOURCE_DIR}" - OUTPUT_VARIABLE DFHACK_GIT_DESCRIPTION) -execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse HEAD - WORKING_DIRECTORY "${dfhack_SOURCE_DIR}" - OUTPUT_VARIABLE DFHACK_GIT_COMMIT) -execute_process(COMMAND ${GIT_EXECUTABLE} describe --tags --abbrev=8 --exact-match - WORKING_DIRECTORY "${dfhack_SOURCE_DIR}" - RESULT_VARIABLE DFHACK_GIT_TAGGED_RESULT - OUTPUT_QUIET ERROR_QUIET) - -# Check library/xml for matching commits -execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse HEAD:library/xml - WORKING_DIRECTORY "${dfhack_SOURCE_DIR}" - OUTPUT_VARIABLE DFHACK_GIT_XML_EXPECTED_COMMIT) -execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse HEAD - WORKING_DIRECTORY "${dfhack_SOURCE_DIR}/library/xml" - OUTPUT_VARIABLE DFHACK_GIT_XML_COMMIT) - -file(WRITE ${git_describe_tmp_h} "") - -macro(git_describe_definition var) - string(STRIP "${${var}}" GIT_DEF_VALUE) - file(APPEND ${git_describe_tmp_h} "#define ${var} \"${GIT_DEF_VALUE}\"\n") -endmacro() - -git_describe_definition(DFHACK_GIT_DESCRIPTION) -git_describe_definition(DFHACK_GIT_COMMIT) -git_describe_definition(DFHACK_GIT_XML_EXPECTED_COMMIT) -git_describe_definition(DFHACK_GIT_XML_COMMIT) -git_describe_definition(DFHACK_BUILD_ID) -if(${DFHACK_GIT_TAGGED_RESULT} EQUAL 0) - file(APPEND ${git_describe_tmp_h} "#define DFHACK_GIT_TAGGED\n") -endif() -if(${DFHACK_GIT_XML_COMMIT} STREQUAL ${DFHACK_GIT_XML_EXPECTED_COMMIT}) - file(APPEND ${git_describe_tmp_h} "#define DFHACK_GIT_XML_MATCH\n") -endif() -execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different - ${git_describe_tmp_h} ${git_describe_h}) diff --git a/library/git-describe.cmake.in b/library/git-describe.cmake.in new file mode 100644 index 000000000..e48212b8f --- /dev/null +++ b/library/git-describe.cmake.in @@ -0,0 +1,33 @@ +# Generated from git-describe.cmake.in +set(DFHACK_BUILD_ID "@DFHACK_BUILD_ID@") + +execute_process(COMMAND ${GIT_EXECUTABLE} describe --tags --abbrev=8 --long + WORKING_DIRECTORY "${dfhack_SOURCE_DIR}" + OUTPUT_VARIABLE DFHACK_GIT_DESCRIPTION + OUTPUT_STRIP_TRAILING_WHITESPACE) +execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse HEAD + WORKING_DIRECTORY "${dfhack_SOURCE_DIR}" + OUTPUT_VARIABLE DFHACK_GIT_COMMIT + OUTPUT_STRIP_TRAILING_WHITESPACE) +execute_process(COMMAND ${GIT_EXECUTABLE} describe --tags --abbrev=8 --exact-match + WORKING_DIRECTORY "${dfhack_SOURCE_DIR}" + RESULT_VARIABLE DFHACK_GIT_TAGGED + OUTPUT_QUIET ERROR_QUIET) + +# Check library/xml for matching commits +execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse HEAD:library/xml + WORKING_DIRECTORY "${dfhack_SOURCE_DIR}" + OUTPUT_VARIABLE DFHACK_GIT_XML_EXPECTED_COMMIT + OUTPUT_STRIP_TRAILING_WHITESPACE) +execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse HEAD + WORKING_DIRECTORY "${dfhack_SOURCE_DIR}/library/xml" + OUTPUT_VARIABLE DFHACK_GIT_XML_COMMIT + OUTPUT_STRIP_TRAILING_WHITESPACE) + +if(${DFHACK_GIT_XML_COMMIT} STREQUAL ${DFHACK_GIT_XML_EXPECTED_COMMIT}) + set(DFHACK_GIT_XML_MATCH TRUE) +else() + set(DFHACK_GIT_XML_MATCH FALSE) +endif() + +configure_file(${dfhack_SOURCE_DIR}/library/include/git-describe.h.in ${dfhack_SOURCE_DIR}/library/include/git-describe.h) diff --git a/library/include/.gitignore b/library/include/.gitignore index 24dcd1482..48d2d3236 100644 --- a/library/include/.gitignore +++ b/library/include/.gitignore @@ -1 +1 @@ -git-describe.* +git-describe.h diff --git a/library/include/git-describe.h.in b/library/include/git-describe.h.in new file mode 100644 index 000000000..761fe4ca5 --- /dev/null +++ b/library/include/git-describe.h.in @@ -0,0 +1,7 @@ +#cmakedefine DFHACK_GIT_DESCRIPTION "@DFHACK_GIT_DESCRIPTION@" +#cmakedefine DFHACK_GIT_COMMIT "@DFHACK_GIT_COMMIT@" +#cmakedefine DFHACK_GIT_XML_EXPECTED_COMMIT "@DFHACK_GIT_XML_EXPECTED_COMMIT@" +#cmakedefine DFHACK_GIT_XML_COMMIT "@DFHACK_GIT_XML_COMMIT@" +#define DFHACK_BUILD_ID "@DFHACK_BUILD_ID@" +#cmakedefine DFHACK_GIT_TAGGED +#cmakedefine DFHACK_GIT_XML_MATCH