From b3b23e8278228fdf5fdcb697cb597db212f5bfbf Mon Sep 17 00:00:00 2001 From: Pauli Date: Mon, 25 Jun 2018 15:25:13 +0300 Subject: [PATCH 01/12] Add dependency from git-describe.h to DFHackVersion.cpp Using add_custom_command allows cmake to track dependency from command to git-describe.h that is implicit dependency of DFHackVersion.cpp. The change also fixes issues if there is multiple build directories and git-describe.h missing but git-dsecribe.h.tmp is present. --- library/CMakeLists.txt | 17 ++++++++++++++--- library/git-describe.cmake | 5 ++--- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/library/CMakeLists.txt b/library/CMakeLists.txt index 22ed67711..dcade1fe5 100644 --- a/library/CMakeLists.txt +++ b/library/CMakeLists.txt @@ -297,7 +297,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 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}" @@ -312,15 +319,19 @@ 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 +target_include_directories(dfhack-version PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) + +ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/git-describe.h always_rebuild COMMAND ${CMAKE_COMMAND} -D dfhack_SOURCE_DIR:STRING=${dfhack_SOURCE_DIR} + -D git_describe_h:STRING=${CMAKE_CURRENT_BINARY_DIR}/git-describe.h -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" + DEPENDS ${GIT_EXECUTABLE} + VERBATIM ) -ADD_DEPENDENCIES(dfhack-version git-describe) ADD_LIBRARY(dfhack SHARED ${PROJECT_SOURCES}) ADD_DEPENDENCIES(dfhack generate_headers generate_proto_core) diff --git a/library/git-describe.cmake b/library/git-describe.cmake index 6650dbde4..7cf211674 100644 --- a/library/git-describe.cmake +++ b/library/git-describe.cmake @@ -2,10 +2,9 @@ if(NOT EXISTS ${dfhack_SOURCE_DIR}/.git/index OR NOT EXISTS ${dfhack_SOURCE_DIR} 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) +set(git_describe_tmp_h ${git_describe_h}.tmp) -if(EXISTS ${git_describe_tmp_h} AND +if(EXISTS ${git_describe_tmp_h} AND EXISTS ${git_describe_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})) From 5154370402b14897579f8b2ac9933998d0483c02 Mon Sep 17 00:00:00 2001 From: Pauli Date: Mon, 25 Jun 2018 15:31:51 +0300 Subject: [PATCH 02/12] Add full paths to codegen.pl error messages I noticed that relative paths were not correctly guessed by vim. I decided to fix the paths to allow me quickly to jump to error line in xml. --- library/CMakeLists.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/library/CMakeLists.txt b/library/CMakeLists.txt index dcade1fe5..e3ddf2dc9 100644 --- a/library/CMakeLists.txt +++ b/library/CMakeLists.txt @@ -260,8 +260,9 @@ FILE(GLOB GENERATE_INPUT_XMLS ${dfapi_SOURCE_DIR}/xml/df.*.xml) 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} + 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 DEPENDS ${GENERATE_INPUT_XMLS} ${GENERATE_INPUT_SCRIPTS} ) From 2956e654d4646867b6de49cb4d90d969a2dc352e Mon Sep 17 00:00:00 2001 From: Pauli Date: Mon, 25 Jun 2018 15:39:26 +0300 Subject: [PATCH 03/12] Add dependency from codegen.pl to df/*.h --- library/CMakeLists.txt | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/library/CMakeLists.txt b/library/CMakeLists.txt index e3ddf2dc9..f22016a56 100644 --- a/library/CMakeLists.txt +++ b/library/CMakeLists.txt @@ -258,8 +258,10 @@ 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) +STRING(REPLACE ":" " " GEN_HDRS_STR "${GENERATED_HDRS}") + ADD_CUSTOM_COMMAND( - OUTPUT ${dfapi_SOURCE_DIR}/include/df/codegen.out.xml + OUTPUT ${dfapi_SOURCE_DIR}/include/df/codegen.out.xml ${GEN_HDRS_STR} COMMAND ${PERL_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/xml/codegen.pl ${CMAKE_CURRENT_SOURCE_DIR}/xml ${CMAKE_CURRENT_SOURCE_DIR}/include/df @@ -267,7 +269,9 @@ ADD_CUSTOM_COMMAND( 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 ${GEN_HDRS_STR}) + IF(REMOVE_SYMBOLS_FROM_DF_STUBS) IF(UNIX) # Don't produce debug info for generated stubs @@ -335,7 +339,7 @@ ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/git-describe.h always_rebu ) ADD_LIBRARY(dfhack SHARED ${PROJECT_SOURCES}) -ADD_DEPENDENCIES(dfhack generate_headers generate_proto_core) +ADD_DEPENDENCIES(dfhack generate_proto_core) ADD_LIBRARY(dfhack-client SHARED RemoteClient.cpp ColorText.cpp MiscUtils.cpp Error.cpp ${PROJECT_PROTO_SRCS}) ADD_DEPENDENCIES(dfhack-client dfhack) From e34f10f3df5c3b0e649fa8a5dee2e00cf5d371ff Mon Sep 17 00:00:00 2001 From: Pauli Date: Mon, 25 Jun 2018 15:52:56 +0300 Subject: [PATCH 04/12] Changelog entry for the generated header dependencies --- docs/changelog.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/changelog.txt b/docs/changelog.txt index c99446bf0..b524c7d45 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -77,6 +77,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 From 3f34ea196b459788bab43454243f898b7af93998 Mon Sep 17 00:00:00 2001 From: Pauli Date: Mon, 25 Jun 2018 16:31:58 +0300 Subject: [PATCH 05/12] Fix build not to delete git-describe.h make doesn't keep primary output file if secundary is missing. always_rebuild must be primary output to make the phony command work correctly. --- library/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/CMakeLists.txt b/library/CMakeLists.txt index f22016a56..65dd10da0 100644 --- a/library/CMakeLists.txt +++ b/library/CMakeLists.txt @@ -326,7 +326,7 @@ ENDIF() EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_SOURCE_DIR}/git-describe.cmake) target_include_directories(dfhack-version PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) -ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/git-describe.h always_rebuild +ADD_CUSTOM_COMMAND(OUTPUT always_rebuild ${CMAKE_CURRENT_BINARY_DIR}/git-describe.h COMMAND ${CMAKE_COMMAND} -D dfhack_SOURCE_DIR:STRING=${dfhack_SOURCE_DIR} -D git_describe_h:STRING=${CMAKE_CURRENT_BINARY_DIR}/git-describe.h From 68d1dfa0daed8cf3ba0e3d6f26a76858c8a53129 Mon Sep 17 00:00:00 2001 From: Pauli Date: Thu, 28 Jun 2018 21:09:42 +0300 Subject: [PATCH 06/12] Keep make output short Without custom comment add_custom_command would list all target files. --- library/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/library/CMakeLists.txt b/library/CMakeLists.txt index 65dd10da0..db2d9ca45 100644 --- a/library/CMakeLists.txt +++ b/library/CMakeLists.txt @@ -266,6 +266,7 @@ ADD_CUSTOM_COMMAND( ${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} ) From fad9d58ac680e8705a1dd9845e63af1800959128 Mon Sep 17 00:00:00 2001 From: Pauli Date: Sun, 8 Jul 2018 00:05:32 +0300 Subject: [PATCH 07/12] Keep git-describe.h in source tree Temporary file goes to binary directory to avoid race between simultanous builts. --- library/CMakeLists.txt | 12 +++++++----- library/git-describe.cmake | 2 -- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/library/CMakeLists.txt b/library/CMakeLists.txt index db2d9ca45..a61411f65 100644 --- a/library/CMakeLists.txt +++ b/library/CMakeLists.txt @@ -304,7 +304,7 @@ ELSE(WIN32) ENDIF() set(VERSION_SRCS DFHackVersion.cpp) -set(VERSION_HDRS git-describe.h) +set(VERSION_HDRS include/git-describe.h) SET_SOURCE_FILES_PROPERTIES(${VERSION_HDRS} PROPERTIES HEADER_FILE_ONLY TRUE) @@ -325,17 +325,19 @@ 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) -target_include_directories(dfhack-version PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) +ADD_CUSTOM_COMMAND(OUTPUT always_rebuild + COMMAND ${CMAKE_COMMAND} -E echo) -ADD_CUSTOM_COMMAND(OUTPUT always_rebuild ${CMAKE_CURRENT_BINARY_DIR}/git-describe.h +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_describe_h:STRING=${CMAKE_CURRENT_BINARY_DIR}/git-describe.h + -D git_describe_h:STRING=${CMAKE_CURRENT_SOURCE_DIR}/include/git-describe.h + -D git_describe_tmp_h:STRING=${CMAKE_CURRENT_BINARY_DIR}/git-describe.h -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" - DEPENDS ${GIT_EXECUTABLE} + DEPENDS ${GIT_EXECUTABLE} always_rebuild VERBATIM ) diff --git a/library/git-describe.cmake b/library/git-describe.cmake index 7cf211674..73375ceed 100644 --- a/library/git-describe.cmake +++ b/library/git-describe.cmake @@ -2,8 +2,6 @@ if(NOT EXISTS ${dfhack_SOURCE_DIR}/.git/index OR NOT EXISTS ${dfhack_SOURCE_DIR} MESSAGE(FATAL_ERROR "Could not find git index file(s)") endif() -set(git_describe_tmp_h ${git_describe_h}.tmp) - if(EXISTS ${git_describe_tmp_h} AND EXISTS ${git_describe_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 From c92b52537c3ebce30bedbdb0508da83a3c3e3c51 Mon Sep 17 00:00:00 2001 From: Pauli Date: Sun, 8 Jul 2018 13:32:04 +0300 Subject: [PATCH 08/12] Only run once codegen.pl and git-describe.cmake with make ninja has a single build file which avoided issues if multiple targets depend on same files. But Unix Makefiles generator user recursive make which requires each ADD_CUSTOM_COMMAND to have only one target depending on them. Then makefile generator also has stupid rule that it touches all secundary output files if primary file has been updated. It was surprising hard to find a version that actually works correctly for both issues. Solution is using BYPRODUCTS and refactoring command and target dependencies. As a bonus this change now allows build to work from source tarball if the tarball includes git-describe.h. --- library/CMakeLists.txt | 42 +++++++++++++++++++++----------------- library/git-describe.cmake | 13 ------------ 2 files changed, 23 insertions(+), 32 deletions(-) diff --git a/library/CMakeLists.txt b/library/CMakeLists.txt index a61411f65..f8113e10e 100644 --- a/library/CMakeLists.txt +++ b/library/CMakeLists.txt @@ -258,20 +258,19 @@ 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) -STRING(REPLACE ":" " " GEN_HDRS_STR "${GENERATED_HDRS}") - ADD_CUSTOM_COMMAND( - OUTPUT ${dfapi_SOURCE_DIR}/include/df/codegen.out.xml ${GEN_HDRS_STR} + OUTPUT ${dfapi_SOURCE_DIR}/include/df/codegen.out.xml 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 + BYPRODUCTS ${GENERATED_HDRS} 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 ${GEN_HDRS_STR}) + DEPENDS ${dfapi_SOURCE_DIR}/include/df/codegen.out.xml) IF(REMOVE_SYMBOLS_FROM_DF_STUBS) IF(UNIX) @@ -325,24 +324,29 @@ 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_COMMAND(OUTPUT always_rebuild - COMMAND ${CMAKE_COMMAND} -E echo) - -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_describe_h:STRING=${CMAKE_CURRENT_SOURCE_DIR}/include/git-describe.h - -D git_describe_tmp_h:STRING=${CMAKE_CURRENT_BINARY_DIR}/git-describe.h - -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" - DEPENDS ${GIT_EXECUTABLE} always_rebuild - VERBATIM -) +if (EXISTS ${CMAKE_SOURCE_DIR}/.git/index AND EXISTS ${CMAKE_SOURCE_DIR}/.git/modules/library/xml/index) + ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/git-describe.h + COMMAND ${CMAKE_COMMAND} + -D dfhack_SOURCE_DIR:STRING=${dfhack_SOURCE_DIR} + -D git_describe_tmp_h:STRING=${CMAKE_CURRENT_BINARY_DIR}/git-describe.h + -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" + DEPENDS ${CMAKE_SOURCE_DIR}/.git/index + ${CMAKE_SOURCE_DIR}/.git/modules/library/xml/index + ${CMAKE_CURRENT_SOURCE_DIR}/git-describe.cmake + ) + ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/include/git-describe.h + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/git-describe.h + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_BINARY_DIR}/git-describe.h ${CMAKE_CURRENT_SOURCE_DIR}/include/git-describe.h + COMMENT "Copy include/git-describe.h" + ) +endif () ADD_LIBRARY(dfhack SHARED ${PROJECT_SOURCES}) 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 index 73375ceed..fe9cc1577 100644 --- a/library/git-describe.cmake +++ b/library/git-describe.cmake @@ -1,14 +1,3 @@ -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() - -if(EXISTS ${git_describe_tmp_h} AND EXISTS ${git_describe_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) @@ -46,5 +35,3 @@ 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}) From 1226919b165b81a0d9973c1da7b6142590eea127 Mon Sep 17 00:00:00 2001 From: Pauli Date: Sun, 8 Jul 2018 13:32:24 +0300 Subject: [PATCH 09/12] Fix the CMAKE_BUILD_TYPE help string and make it list of strings in gui While testing the build dependency issues I noticed that cmake C module overwrites our CMAKE_BUILD_TYPE help. I decided to fix the help and make the build type a gui string which makes it easier to select build configuration. --- CMakeLists.txt | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6d6118c65..562c10fca 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) From bc8b8ef256e2ead05565d4f92da36105fca1a4c0 Mon Sep 17 00:00:00 2001 From: Pauli Date: Fri, 13 Jul 2018 15:22:00 +0300 Subject: [PATCH 10/12] Use configure_file to optimize incremental builds for git-describe.h --- library/.gitignore | 1 + library/CMakeLists.txt | 13 +++-------- library/git-describe.cmake | 37 ------------------------------- library/git-describe.cmake.in | 33 +++++++++++++++++++++++++++ library/include/.gitignore | 2 +- library/include/git-describe.h.in | 7 ++++++ 6 files changed, 45 insertions(+), 48 deletions(-) create mode 100644 library/.gitignore delete mode 100644 library/git-describe.cmake create mode 100644 library/git-describe.cmake.in create mode 100644 library/include/git-describe.h.in 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 f8113e10e..2cce53949 100644 --- a/library/CMakeLists.txt +++ b/library/CMakeLists.txt @@ -322,25 +322,18 @@ 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) +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_BINARY_DIR}/git-describe.h + 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_describe_tmp_h:STRING=${CMAKE_CURRENT_BINARY_DIR}/git-describe.h -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" DEPENDS ${CMAKE_SOURCE_DIR}/.git/index ${CMAKE_SOURCE_DIR}/.git/modules/library/xml/index ${CMAKE_CURRENT_SOURCE_DIR}/git-describe.cmake - ) - ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/include/git-describe.h - DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/git-describe.h - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_BINARY_DIR}/git-describe.h ${CMAKE_CURRENT_SOURCE_DIR}/include/git-describe.h - COMMENT "Copy include/git-describe.h" + include/git-describe.h.in ) endif () diff --git a/library/git-describe.cmake b/library/git-describe.cmake deleted file mode 100644 index fe9cc1577..000000000 --- a/library/git-describe.cmake +++ /dev/null @@ -1,37 +0,0 @@ -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() 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 From f02466de8a783be0c5c06f42485a42f5266693aa Mon Sep 17 00:00:00 2001 From: Pauli Date: Fri, 13 Jul 2018 17:01:36 +0300 Subject: [PATCH 11/12] Correct codegen.pl output dependecies for VC The change allows correct and optimized incremental builds with VC and ninja but unix makefile backend will rebuild everything if anything changes in structures. --- library/CMakeLists.txt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/library/CMakeLists.txt b/library/CMakeLists.txt index 2cce53949..84cb1e421 100644 --- a/library/CMakeLists.txt +++ b/library/CMakeLists.txt @@ -258,13 +258,15 @@ 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 + 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 - BYPRODUCTS ${GENERATED_HDRS} COMMENT "Generating codegen.out.xml and df/headers" DEPENDS ${GENERATE_INPUT_XMLS} ${GENERATE_INPUT_SCRIPTS} ) From cb77c91049294693c9789fe8c1613c13b96aaee8 Mon Sep 17 00:00:00 2001 From: Pauli Date: Fri, 13 Jul 2018 17:33:01 +0300 Subject: [PATCH 12/12] Update Compile.rst to prefer ninja --- docs/Compile.rst | 40 ++++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 16 deletions(-) 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.