diff --git a/CMake/DownloadFile.cmake b/CMake/DownloadFile.cmake index 5a10cca2f..aabcaeb3a 100644 --- a/CMake/DownloadFile.cmake +++ b/CMake/DownloadFile.cmake @@ -1,71 +1,71 @@ # Helper to download files as needed function(file_md5_if_exists FILE VAR) - if(EXISTS "${FILE}") - file(MD5 "${FILE}" "${VAR}") - set(${VAR} "${${VAR}}" PARENT_SCOPE) - else() - set(${VAR} "" PARENT_SCOPE) - endif() + if(EXISTS "${FILE}") + file(MD5 "${FILE}" "${VAR}") + set(${VAR} "${${VAR}}" PARENT_SCOPE) + else() + set(${VAR} "" PARENT_SCOPE) + endif() endfunction() function(search_downloads FILE_MD5 VAR) - set(${VAR} "" PARENT_SCOPE) - file(GLOB FILES ${CMAKE_SOURCE_DIR}/CMake/downloads/*) - foreach(FILE ${FILES}) - file(MD5 "${FILE}" CUR_MD5) - if("${CUR_MD5}" STREQUAL "${FILE_MD5}") - set(${VAR} ${FILE} PARENT_SCOPE) - return() - endif() - endforeach() + set(${VAR} "" PARENT_SCOPE) + file(GLOB FILES ${CMAKE_SOURCE_DIR}/CMake/downloads/*) + foreach(FILE ${FILES}) + file(MD5 "${FILE}" CUR_MD5) + if("${CUR_MD5}" STREQUAL "${FILE_MD5}") + set(${VAR} ${FILE} PARENT_SCOPE) + return() + endif() + endforeach() endfunction() function(download_file URL DEST EXPECTED_MD5) - get_filename_component(FILENAME "${URL}" NAME) - file_md5_if_exists("${DEST}" CUR_MD5) + get_filename_component(FILENAME "${URL}" NAME) + file_md5_if_exists("${DEST}" CUR_MD5) - if(NOT "${EXPECTED_MD5}" STREQUAL "${CUR_MD5}") - search_downloads(${EXPECTED_MD5} DLPATH) - if(NOT("${DLPATH}" STREQUAL "")) - message("* Copying ${FILENAME} from ${DLPATH}") - execute_process(COMMAND "${CMAKE_COMMAND}" -E copy - "${DLPATH}" - "${DEST}") - return() - endif() + if(NOT "${EXPECTED_MD5}" STREQUAL "${CUR_MD5}") + search_downloads(${EXPECTED_MD5} DLPATH) + if(NOT("${DLPATH}" STREQUAL "")) + message("* Copying ${FILENAME} from ${DLPATH}") + execute_process(COMMAND "${CMAKE_COMMAND}" -E copy + "${DLPATH}" + "${DEST}") + return() + endif() - message("* Downloading ${FILENAME}") - file(DOWNLOAD "${URL}" "${DEST}" EXPECTED_MD5 "${EXPECTED_MD5}" SHOW_PROGRESS) - endif() + message("* Downloading ${FILENAME}") + file(DOWNLOAD "${URL}" "${DEST}" EXPECTED_MD5 "${EXPECTED_MD5}" SHOW_PROGRESS) + endif() endfunction() # Download a file and uncompress it function(download_file_unzip URL ZIP_TYPE ZIP_DEST ZIP_MD5 UNZIP_DEST UNZIP_MD5) - get_filename_component(FILENAME "${URL}" NAME) - file_md5_if_exists("${UNZIP_DEST}" CUR_UNZIP_MD5) + get_filename_component(FILENAME "${URL}" NAME) + file_md5_if_exists("${UNZIP_DEST}" CUR_UNZIP_MD5) - # Redownload if the MD5 of the uncompressed file doesn't match - if(NOT "${UNZIP_MD5}" STREQUAL "${CUR_UNZIP_MD5}") - download_file("${URL}" "${ZIP_DEST}" "${ZIP_MD5}") + # Redownload if the MD5 of the uncompressed file doesn't match + if(NOT "${UNZIP_MD5}" STREQUAL "${CUR_UNZIP_MD5}") + download_file("${URL}" "${ZIP_DEST}" "${ZIP_MD5}") - if(EXISTS "${ZIP_DEST}") - message("* Decompressing ${FILENAME}") - if("${ZIP_TYPE}" STREQUAL "gz") - execute_process(COMMAND - "${PERL_EXECUTABLE}" "${CMAKE_SOURCE_DIR}/depends/gunzip.pl" - "${ZIP_DEST}" --force) - else() - message(SEND_ERROR "Unknown ZIP_TYPE: ${ZIP_TYPE}") - endif() - if(NOT EXISTS "${UNZIP_DEST}") - message(SEND_ERROR "File failed to unzip to ${UNZIP_DEST}") - else() - file(MD5 "${UNZIP_DEST}" CUR_UNZIP_MD5) - if(NOT "${UNZIP_MD5}" STREQUAL "${CUR_UNZIP_MD5}") - message(SEND_ERROR "MD5 mismatch: ${UNZIP_DEST}: expected ${UNZIP_MD5}, got ${CUR_UNZIP_MD5}") + if(EXISTS "${ZIP_DEST}") + message("* Decompressing ${FILENAME}") + if("${ZIP_TYPE}" STREQUAL "gz") + execute_process(COMMAND + "${PERL_EXECUTABLE}" "${CMAKE_SOURCE_DIR}/depends/gunzip.pl" + "${ZIP_DEST}" --force) + else() + message(SEND_ERROR "Unknown ZIP_TYPE: ${ZIP_TYPE}") + endif() + if(NOT EXISTS "${UNZIP_DEST}") + message(SEND_ERROR "File failed to unzip to ${UNZIP_DEST}") + else() + file(MD5 "${UNZIP_DEST}" CUR_UNZIP_MD5) + if(NOT "${UNZIP_MD5}" STREQUAL "${CUR_UNZIP_MD5}") + message(SEND_ERROR "MD5 mismatch: ${UNZIP_DEST}: expected ${UNZIP_MD5}, got ${CUR_UNZIP_MD5}") + endif() + endif() endif() - endif() endif() - endif() endfunction() diff --git a/CMake/Modules/FindTinyXML.cmake b/CMake/Modules/FindTinyXML.cmake index b0466fbd5..4d6d69f7b 100644 --- a/CMake/Modules/FindTinyXML.cmake +++ b/CMake/Modules/FindTinyXML.cmake @@ -32,11 +32,11 @@ # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ################################################################################################## -# +# # CMake script for finding TinyXML. -# +# # Input variables: -# +# # - TinyXML_ROOT_DIR (optional): When specified, header files and libraries will be searched for in # ${TinyXML_ROOT_DIR}/include # ${TinyXML_ROOT_DIR}/libs @@ -46,23 +46,23 @@ # preference is given to the CMake variable. # Use this variable for finding packages installed in a nonstandard location, or for enforcing # that one of multiple package installations is picked up. -# -# +# +# # Cache variables (not intended to be used in CMakeLists.txt files) -# +# # - TinyXML_INCLUDE_DIR: Absolute path to package headers. # - TinyXML_LIBRARY: Absolute path to library. -# -# +# +# # Output variables: -# +# # - TinyXML_FOUND: Boolean that indicates if the package was found # - TinyXML_INCLUDE_DIRS: Paths to the necessary header files # - TinyXML_LIBRARIES: Package libraries -# -# +# +# # Example usage: -# +# # find_package(TinyXML) # if(NOT TinyXML_FOUND) # # Error handling @@ -71,19 +71,19 @@ # include_directories(${TinyXML_INCLUDE_DIRS} ...) # ... # target_link_libraries(my_target ${TinyXML_LIBRARIES}) -# +# ################################################################################################## # Get package location hint from environment variable (if any) if(NOT TinyXML_ROOT_DIR AND DEFINED ENV{TinyXML_ROOT_DIR}) - set(TinyXML_ROOT_DIR "$ENV{TinyXML_ROOT_DIR}" CACHE PATH - "TinyXML base directory location (optional, used for nonstandard installation paths)") + set(TinyXML_ROOT_DIR "$ENV{TinyXML_ROOT_DIR}" CACHE PATH + "TinyXML base directory location (optional, used for nonstandard installation paths)") endif() # Search path for nonstandard package locations if(TinyXML_ROOT_DIR) - set(TinyXML_INCLUDE_PATH PATHS "${TinyXML_ROOT_DIR}/include" NO_DEFAULT_PATH) - set(TinyXML_LIBRARY_PATH PATHS "${TinyXML_ROOT_DIR}/lib" NO_DEFAULT_PATH) + set(TinyXML_INCLUDE_PATH PATHS "${TinyXML_ROOT_DIR}/include" NO_DEFAULT_PATH) + set(TinyXML_LIBRARY_PATH PATHS "${TinyXML_ROOT_DIR}/lib" NO_DEFAULT_PATH) endif() # Find headers and libraries @@ -102,6 +102,6 @@ set(TinyXML_FOUND ${TINYXML_FOUND}) # Enforce case-correctness: Set appropriatel unset(TINYXML_FOUND) # ...and unset uppercase variable generated by find_package_handle_standard_args if(TinyXML_FOUND) - set(TinyXML_INCLUDE_DIRS ${TinyXML_INCLUDE_DIR}) - set(TinyXML_LIBRARIES ${TinyXML_LIBRARY}) + set(TinyXML_INCLUDE_DIRS ${TinyXML_INCLUDE_DIR}) + set(TinyXML_LIBRARIES ${TinyXML_LIBRARY}) endif() diff --git a/plugins/Plugins.cmake b/plugins/Plugins.cmake index 4468140f7..1adcbe62f 100644 --- a/plugins/Plugins.cmake +++ b/plugins/Plugins.cmake @@ -1,155 +1,155 @@ -IF(UNIX) - IF(NOT APPLE) - # Linux: Check for unresolved symbols at link time - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,-z,defs") - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wl,-z,defs") - ENDIF() -ENDIF() +if(UNIX) + if(NOT APPLE) + # Linux: Check for unresolved symbols at link time + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,-z,defs") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wl,-z,defs") + endif() +endif() include_directories("${dfhack_SOURCE_DIR}/library/include") include_directories("${dfhack_SOURCE_DIR}/library/proto") include_directories("${CMAKE_CURRENT_SOURCE_DIR}/proto") include_directories("${dfhack_SOURCE_DIR}/library/depends/xgetopt") -MACRO(CAR var) - SET(${var} ${ARGV1}) -ENDMACRO() - -MACRO(CDR var junk) - SET(${var} ${ARGN}) -ENDMACRO() - -MACRO(LIST_CONTAINS var value) - SET(${var}) - FOREACH (value2 ${ARGN}) - IF (${value} STREQUAL ${value2}) - SET(${var} TRUE) - ENDIF() - ENDFOREACH() -ENDMACRO() - -MACRO(PARSE_ARGUMENTS prefix arg_names option_names) - SET(DEFAULT_ARGS) - FOREACH(arg_name ${arg_names}) - SET(${prefix}_${arg_name}) - ENDFOREACH() - - FOREACH(option ${option_names}) - SET(${prefix}_${option} FALSE) - ENDFOREACH() - - SET(current_arg_name DEFAULT_ARGS) - SET(current_arg_list) - FOREACH(arg ${ARGN}) - LIST_CONTAINS(is_arg_name ${arg} ${arg_names}) - IF (is_arg_name) - SET(${prefix}_${current_arg_name} ${current_arg_list}) - SET(current_arg_name ${arg}) - SET(current_arg_list) - ELSE() - LIST_CONTAINS(is_option ${arg} ${option_names}) - IF(is_option) - SET(${prefix}_${arg} TRUE) - ELSE() - SET(current_arg_list ${current_arg_list} ${arg}) - ENDIF() - ENDIF() - ENDFOREACH() - SET(${prefix}_${current_arg_name} ${current_arg_list}) -ENDMACRO() - -MACRO(DFHACK_PLUGIN) - PARSE_ARGUMENTS(PLUGIN - "LINK_LIBRARIES;DEPENDS;PROTOBUFS;COMPILE_FLAGS;COMPILE_FLAGS_GCC;COMPILE_FLAGS_MSVC" - "SOME_OPT" - ${ARGN} +macro(car var) + set(${var} ${ARGV1}) +endmacro() + +macro(cdr var junk) + set(${var} ${ARGN}) +endmacro() + +macro(list_contains var value) + set(${var}) + foreach(value2 ${ARGN}) + if(${value} STREQUAL ${value2}) + set(${var} TRUE) + endif() + endforeach() +endmacro() + +macro(parse_arguments prefix arg_names option_names) + set(DEFAULT_ARGS) + foreach(arg_name ${arg_names}) + set(${prefix}_${arg_name}) + endforeach() + + foreach(option ${option_names}) + set(${prefix}_${option} FALSE) + endforeach() + + set(current_arg_name DEFAULT_ARGS) + set(current_arg_list) + foreach(arg ${ARGN}) + list_contains(is_arg_name ${arg} ${arg_names}) + if(is_arg_name) + set(${prefix}_${current_arg_name} ${current_arg_list}) + set(current_arg_name ${arg}) + set(current_arg_list) + else() + list_contains(is_option ${arg} ${option_names}) + if(is_option) + set(${prefix}_${arg} TRUE) + else() + set(current_arg_list ${current_arg_list} ${arg}) + endif() + endif() + endforeach() + set(${prefix}_${current_arg_name} ${current_arg_list}) +endmacro() + +macro(dfhack_plugin) + parse_arguments(PLUGIN + "LINK_LIBRARIES;DEPENDS;PROTOBUFS;COMPILE_FLAGS;COMPILE_FLAGS_GCC;COMPILE_FLAGS_MSVC" + "SOME_OPT" + ${ARGN} ) - CAR(PLUGIN_NAME ${PLUGIN_DEFAULT_ARGS}) - CDR(PLUGIN_SOURCES ${PLUGIN_DEFAULT_ARGS}) - - SET(PLUGIN_PROTOS) - FOREACH(pbuf ${PLUGIN_PROTOBUFS}) - LIST(APPEND PLUGIN_PROTOS ${CMAKE_CURRENT_SOURCE_DIR}/proto/${pbuf}.proto) - ENDFOREACH() - - LIST(LENGTH PLUGIN_PROTOS NUM_PROTO) - IF(NUM_PROTO) - STRING(REPLACE ".proto" ".pb.cc" PLUGIN_PROTO_SRCS "${PLUGIN_PROTOS}") - STRING(REPLACE ".proto" ".pb.h" PLUGIN_PROTO_HDRS "${PLUGIN_PROTOS}") - STRING(REPLACE "/proto/" "/proto/tmp/" PLUGIN_PROTO_TMP_FILES "${PLUGIN_PROTO_SRCS};${PLUGIN_PROTO_HDRS}") - SET_SOURCE_FILES_PROPERTIES(${PLUGIN_PROTO_SRCS} ${PLUGIN_PROTO_HDRS} PROPERTIES GENERATED TRUE) - - # Force a re-gen if any *.pb.* files are missing - # (only runs when cmake is run, but better than nothing) - FOREACH(file IN LISTS PLUGIN_PROTO_SRCS PLUGIN_PROTO_HDRS) - IF(NOT EXISTS ${file}) - # MESSAGE("Resetting generate_proto_${PLUGIN_NAME} because '${file}' is missing") - FILE(REMOVE ${PLUGIN_PROTO_TMP_FILES}) - BREAK() - ENDIF() - ENDFOREACH() - - ADD_CUSTOM_COMMAND( - OUTPUT ${PLUGIN_PROTO_TMP_FILES} - COMMAND protoc-bin -I=${CMAKE_CURRENT_SOURCE_DIR}/proto/ + car(PLUGIN_NAME ${PLUGIN_DEFAULT_ARGS}) + cdr(PLUGIN_SOURCES ${PLUGIN_DEFAULT_ARGS}) + + set(PLUGIN_PROTOS) + foreach(pbuf ${PLUGIN_PROTOBUFS}) + list(APPEND PLUGIN_PROTOS ${CMAKE_CURRENT_SOURCE_DIR}/proto/${pbuf}.proto) + endforeach() + + list(LENGTH PLUGIN_PROTOS NUM_PROTO) + if(NUM_PROTO) + string(REPLACE ".proto" ".pb.cc" PLUGIN_PROTO_SRCS "${PLUGIN_PROTOS}") + string(REPLACE ".proto" ".pb.h" PLUGIN_PROTO_HDRS "${PLUGIN_PROTOS}") + string(REPLACE "/proto/" "/proto/tmp/" PLUGIN_PROTO_TMP_FILES "${PLUGIN_PROTO_SRCS};${PLUGIN_PROTO_HDRS}") + set_source_files_properties(${PLUGIN_PROTO_SRCS} ${PLUGIN_PROTO_HDRS} PROPERTIES GENERATED TRUE) + + # Force a re-gen if any *.pb.* files are missing + # (only runs when cmake is run, but better than nothing) + foreach(file IN LISTS PLUGIN_PROTO_SRCS PLUGIN_PROTO_HDRS) + if(NOT EXISTS ${file}) + # MESSAGE("Resetting generate_proto_${PLUGIN_NAME} because '${file}' is missing") + file(REMOVE ${PLUGIN_PROTO_TMP_FILES}) + break() + endif() + endforeach() + + add_custom_command( + OUTPUT ${PLUGIN_PROTO_TMP_FILES} + COMMAND protoc-bin -I=${CMAKE_CURRENT_SOURCE_DIR}/proto/ --cpp_out=${CMAKE_CURRENT_SOURCE_DIR}/proto/tmp/ ${PLUGIN_PROTOS} - COMMAND ${PERL_EXECUTABLE} ${CMAKE_SOURCE_DIR}/depends/copy-if-different.pl + COMMAND ${PERL_EXECUTABLE} ${CMAKE_SOURCE_DIR}/depends/copy-if-different.pl ${PLUGIN_PROTO_TMP_FILES} ${CMAKE_CURRENT_SOURCE_DIR}/proto/ - COMMENT "Generating plugin ${PLUGIN_NAME} protobufs" - DEPENDS protoc-bin ${PLUGIN_PROTOS} - ) - - IF(UNIX) - SET_SOURCE_FILES_PROPERTIES(${PLUGIN_PROTO_SRCS} PROPERTIES COMPILE_FLAGS "-Wno-misleading-indentation") - ENDIF() - - ADD_CUSTOM_TARGET(generate_proto_${PLUGIN_NAME} DEPENDS ${PLUGIN_PROTO_TMP_FILES}) - - # Merge headers into sources - SET_SOURCE_FILES_PROPERTIES( ${PLUGIN_PROTO_HDRS} PROPERTIES HEADER_FILE_ONLY TRUE ) - LIST(APPEND PLUGIN_SOURCES ${PLUGIN_PROTO_HDRS}) - LIST(APPEND PLUGIN_SOURCES ${PLUGIN_PROTO_SRCS}) - - IF(UNIX) - SET(PLUGIN_COMPILE_FLAGS "${PLUGIN_COMPILE_FLAGS} -include Export.h") - ELSE() - SET(PLUGIN_COMPILE_FLAGS "${PLUGIN_COMPILE_FLAGS} /FI\"Export.h\"") - ENDIF() - ENDIF() - - ADD_LIBRARY(${PLUGIN_NAME} MODULE ${PLUGIN_SOURCES}) - IDE_FOLDER(${PLUGIN_NAME} "Plugins") - - IF(NUM_PROTO) - ADD_DEPENDENCIES(${PLUGIN_NAME} generate_proto_${PLUGIN_NAME}) - TARGET_LINK_LIBRARIES(${PLUGIN_NAME} dfhack protobuf-lite dfhack-version ${PLUGIN_LINK_LIBRARIES}) - ELSE() - TARGET_LINK_LIBRARIES(${PLUGIN_NAME} dfhack dfhack-version ${PLUGIN_LINK_LIBRARIES}) - ENDIF() - - ADD_DEPENDENCIES(${PLUGIN_NAME} dfhack-version) - - # Make sure the source is generated before the executable builds. - ADD_DEPENDENCIES(${PLUGIN_NAME} generate_proto) - - IF(UNIX) - SET(PLUGIN_COMPILE_FLAGS "${PLUGIN_COMPILE_FLAGS} ${PLUGIN_COMPILE_FLAGS_GCC}") - ELSE() - SET(PLUGIN_COMPILE_FLAGS "${PLUGIN_COMPILE_FLAGS} ${PLUGIN_COMPILE_FLAGS_MSVC}") - ENDIF() - SET_TARGET_PROPERTIES(${PLUGIN_NAME} PROPERTIES COMPILE_FLAGS "${PLUGIN_COMPILE_FLAGS}") - - IF(APPLE) - SET_TARGET_PROPERTIES(${PLUGIN_NAME} PROPERTIES SUFFIX .plug.dylib PREFIX "") - ELSEIF(UNIX) - SET_TARGET_PROPERTIES(${PLUGIN_NAME} PROPERTIES SUFFIX .plug.so PREFIX "") - ELSE() - SET_TARGET_PROPERTIES(${PLUGIN_NAME} PROPERTIES SUFFIX .plug.dll) - ENDIF() - - install(TARGETS ${PLUGIN_NAME} - LIBRARY DESTINATION ${DFHACK_PLUGIN_DESTINATION} - RUNTIME DESTINATION ${DFHACK_PLUGIN_DESTINATION}) -ENDMACRO(DFHACK_PLUGIN) + COMMENT "Generating plugin ${PLUGIN_NAME} protobufs" + DEPENDS protoc-bin ${PLUGIN_PROTOS} + ) + + if(UNIX) + set_source_files_properties(${PLUGIN_PROTO_SRCS} PROPERTIES COMPILE_FLAGS "-Wno-misleading-indentation") + endif() + + add_custom_target(generate_proto_${PLUGIN_NAME} DEPENDS ${PLUGIN_PROTO_TMP_FILES}) + + # Merge headers into sources + set_source_files_properties( ${PLUGIN_PROTO_HDRS} PROPERTIES HEADER_FILE_ONLY TRUE ) + list(APPEND PLUGIN_SOURCES ${PLUGIN_PROTO_HDRS}) + list(APPEND PLUGIN_SOURCES ${PLUGIN_PROTO_SRCS}) + + if(UNIX) + set(PLUGIN_COMPILE_FLAGS "${PLUGIN_COMPILE_FLAGS} -include Export.h") + else() + set(PLUGIN_COMPILE_FLAGS "${PLUGIN_COMPILE_FLAGS} /FI\"Export.h\"") + endif() + endif() + + add_library(${PLUGIN_NAME} MODULE ${PLUGIN_SOURCES}) + ide_folder(${PLUGIN_NAME} "Plugins") + + if(NUM_PROTO) + add_dependencies(${PLUGIN_NAME} generate_proto_${PLUGIN_NAME}) + target_link_libraries(${PLUGIN_NAME} dfhack protobuf-lite dfhack-version ${PLUGIN_LINK_LIBRARIES}) + else() + target_link_libraries(${PLUGIN_NAME} dfhack dfhack-version ${PLUGIN_LINK_LIBRARIES}) + endif() + + add_dependencies(${PLUGIN_NAME} dfhack-version) + + # Make sure the source is generated before the executable builds. + add_dependencies(${PLUGIN_NAME} generate_proto) + + if(UNIX) + set(PLUGIN_COMPILE_FLAGS "${PLUGIN_COMPILE_FLAGS} ${PLUGIN_COMPILE_FLAGS_GCC}") + else() + set(PLUGIN_COMPILE_FLAGS "${PLUGIN_COMPILE_FLAGS} ${PLUGIN_COMPILE_FLAGS_MSVC}") + endif() + set_target_properties(${PLUGIN_NAME} PROPERTIES COMPILE_FLAGS "${PLUGIN_COMPILE_FLAGS}") + + if(APPLE) + set_target_properties(${PLUGIN_NAME} PROPERTIES SUFFIX .plug.dylib PREFIX "") + elseif(UNIX) + set_target_properties(${PLUGIN_NAME} PROPERTIES SUFFIX .plug.so PREFIX "") + else() + set_target_properties(${PLUGIN_NAME} PROPERTIES SUFFIX .plug.dll) + endif() + + install(TARGETS ${PLUGIN_NAME} + LIBRARY DESTINATION ${DFHACK_PLUGIN_DESTINATION} + RUNTIME DESTINATION ${DFHACK_PLUGIN_DESTINATION}) +endmacro()