Revision: 75098 http://sourceforge.net/p/brlcad/code/75098 Author: starseeker Date: 2020-03-25 13:16:30 +0000 (Wed, 25 Mar 2020) Log Message: ----------- THIRD_PARTY_EXECUTABLE is used only in misc/tools - put it there. Not worried about the tools builds yet - initial focus is on the more difficult src/other builds.
Modified Paths: -------------- brlcad/branches/thirdparty_rework/misc/CMake/ThirdParty.cmake brlcad/branches/thirdparty_rework/misc/tools/CMakeLists.txt Added Paths: ----------- brlcad/branches/thirdparty_rework/misc/tools/Third_Party_Exec.cmake Modified: brlcad/branches/thirdparty_rework/misc/CMake/ThirdParty.cmake =================================================================== --- brlcad/branches/thirdparty_rework/misc/CMake/ThirdParty.cmake 2020-03-25 12:53:32 UTC (rev 75097) +++ brlcad/branches/thirdparty_rework/misc/CMake/ThirdParty.cmake 2020-03-25 13:16:30 UTC (rev 75098) @@ -269,271 +269,6 @@ endfunction(THIRD_PARTY) -#----------------------------------------------------------------------------- -function(THIRD_PARTY_EXECUTABLE dir varname_root build_target) - - # Parse extra arguments - CMAKE_PARSE_ARGUMENTS(TP "NOSYS" "" "REQUIRED_VARS;ALIASES;DESCRIPTION" ${ARGN}) - - # If the exec variable has been explicitly set, get - # an normalized version of it for easier matching - set(local_opt) - if(NOT ${${CMAKE_PROJECT_NAME}_${varname_root}} STREQUAL "") - set(local_opt "${${CMAKE_PROJECT_NAME}_${varname_root}}") - endif(NOT ${${CMAKE_PROJECT_NAME}_${varname_root}} STREQUAL "") - VAL_NORMALIZE(local_opt ABS) - - # Initialize some variables - set(TP_DISABLED 0) - set(TP_DISABLE_TEST 0) - set(TP_MET_CONDITION 0) - - # 0. Whether or not we're building the sources, we are tracking the files - # that are supposed to be in the directory - get_filename_component(DIR_NAME "${dir}" NAME) - if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${DIR_NAME}.dist") - message(FATAL_ERROR "Third party component ${DIR_NAME} does not have a dist file at \"${CMAKE_CURRENT_SOURCE_DIR}/${DIR_NAME}.dist\"") - endif(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${DIR_NAME}.dist") - include("${CMAKE_CURRENT_SOURCE_DIR}/${DIR_NAME}.dist") - CMAKEFILES_IN_DIR(${DIR_NAME}_ignore_files ${dir}) - - # 1. For executables, it is a reasonable use case that the developer manually specifies - # the location for an executable. It is tricky to distinguish this situation from - # a previously cached executable path resulting from a Find*.cmake script. The way - # we will proceed is to cache the value of ${varname_root}_EXECUTABLE if it is defined, and - # at the end check it against the results of running the THIRD_PARTY logic. If - # it matches neither pattern (Bundled or System) it is assumed that the value passed - # in is an intentional setting on the part of the developer. This has one potential - # drawback in that the *removal* of a system executable between searches could result - # in a previously cached system search result being identified as a user-specified - # result - to prevent that, the cached path is only used to override other results - # if the file it specifies actually exists. One additional wrinkle here - if the - # developer has hard-specified BUNDLED for this particular executable, even a user specified - # or cached value will be replaced with the local path. A feature based disablement - # of the tool also applies to the cached version. - if(${varname_root}_EXECUTABLE) - IS_SUBPATH("${CMAKE_BINARY_DIR}" "${${varname_root}_EXECUTABLE}" SUBBUILD_TEST) - if("${SUBBUILD_TEST}" STREQUAL "0") - get_filename_component(FULL_PATH_EXEC ${${varname_root}_EXECUTABLE} ABSOLUTE) - if("${FULL_PATH_EXEC}" STREQUAL "${${varname_root}_EXECUTABLE}") - if(EXISTS ${FULL_PATH_EXEC}) - set(EXEC_CACHED ${${varname_root}_EXECUTABLE}) - else(EXISTS ${FULL_PATH_EXEC}) - # This path not being present may indicate the user specified a path - # and made a mistake doing so - warn that this might be the case. - message(WARNING "File path ${${varname_root}_EXECUTABLE} specified for ${varname_root}_EXECUTABLE does not exist - this path will not override ${build_target} executable search results.") - endif(EXISTS ${FULL_PATH_EXEC}) - endif("${FULL_PATH_EXEC}" STREQUAL "${${varname_root}_EXECUTABLE}") - endif("${SUBBUILD_TEST}" STREQUAL "0") - endif(${varname_root}_EXECUTABLE) - - # 2. If any of the required flags are off, this tool is a no-go. - set(DISABLE_STR "") - foreach(item ${TP_REQUIRED_VARS}) - if(NOT ${item}) - set(TP_DISABLED 1) - set(TP_DISABLE_TEST 1) - set(${CMAKE_PROJECT_NAME}_${varname_root}_BUILD OFF) - if(NOT DISABLE_STR) - set(DISABLE_STR "${item}") - else(NOT DISABLE_STR) - set(DISABLE_STR "${DISABLE_STR},${item}") - endif(NOT DISABLE_STR) - endif(NOT ${item}) - endforeach(item ${TP_REQUIRED_VARS}) - if(DISABLE_STR) - set(${CMAKE_PROJECT_NAME}_${varname_root} "DISABLED ${DISABLE_STR}" CACHE STRING "DISABLED ${DISABLED_STR}" FORCE) - mark_as_advanced(FORCE ${CMAKE_PROJECT_NAME}_${varname_root}) - set(${varname_root}_MET_CONDITION 1) - else(DISABLE_STR) - # If we have a leftover disabled setting in the cache from earlier runs, clear it. - if("${local_opt}" MATCHES "DISABLED") - set(${CMAKE_PROJECT_NAME}_${varname_root} "" CACHE STRING "Clear DISABLED setting" FORCE) - mark_as_advanced(CLEAR ${CMAKE_PROJECT_NAME}_${varname_root}) - endif("${local_opt}" MATCHES "DISABLED") - endif(DISABLE_STR) - - # 3. Next - is the executable variable explicitly set to SYSTEM? If it is, we are NOT building it. - if(local_opt) - if("${local_opt}" STREQUAL "SYSTEM") - set(${CMAKE_PROJECT_NAME}_${varname_root}_BUILD OFF) - set(TP_MET_CONDITION 2) - if(TP_NOSYS) - message(WARNING "Compilation of ${build_target} was disabled, but local copy is modified - using a system version of ${build_target} may introduce problems or even fail to work!") - endif(TP_NOSYS) - endif("${local_opt}" STREQUAL "SYSTEM") - endif(local_opt) - - # 4. If we have a NOSYS flag, ALWAYS* use the bundled version. The NOSYS flag signifies that - # the BRL-CAD project requires modifications in the local src/other version of a library or - # tool that are not likely to be present in a system version. These flags should be periodically - # reviewed to determine if they can be removed (i.e. system packages have appeared in modern - # OS distributions with the fixes needed by BRL-CAD...). - # - # * In the case of executables, we'll allow a cached value from the user to override the NOSYS - # flag, since that's a likely scenario for testing, but that shouldn't be done except for testing - # purposes with a NOSYS target. - if(NOT TP_MET_CONDITION AND TP_NOSYS) - set(${CMAKE_PROJECT_NAME}_${varname_root} "BUNDLED" CACHE STRING "NOSYS passed, using bundled ${build_target}" FORCE) - mark_as_advanced(${CMAKE_PROJECT_NAME}_${varname_root}) - set(${CMAKE_PROJECT_NAME}_${varname_root}_BUILD ON) - set(TP_MET_CONDITION 3) - set(TP_DISABLE_TEST 1) - endif(NOT TP_MET_CONDITION AND TP_NOSYS) - - # 5. If we have an explicit BUNDLE request for this particular executable, honor it as long as - # features are satisfied. No point in testing if we know we're turning it on - set vars accordingly. - if(NOT TP_MET_CONDITION AND "${local_opt}" STREQUAL "BUNDLED") - set(${CMAKE_PROJECT_NAME}_${varname_root}_BUILD ON) - set(TP_DISABLE_TEST 1) - set(TP_MET_CONDITION 4) - endif(NOT TP_MET_CONDITION AND "${local_opt}" STREQUAL "BUNDLED") - - - # 5. If BRLCAD_BUNDLED_LIBS is exactly SYSTEM or exactly BUNDLED, and we haven't been overridden by - # one of the other conditions above, go with that. - if(NOT TP_MET_CONDITION) - if("${BRLCAD_BUNDLED_LIBS}" STREQUAL "SYSTEM" OR "${BRLCAD_BUNDLED_LIBS}" STREQUAL "BUNDLED") - set(${CMAKE_PROJECT_NAME}_${varname_root} "${BRLCAD_BUNDLED_LIBS} (AUTO)" CACHE STRING "BRLCAD_BUNDLED_LIBS: ${BRLCAD_BUNDLED_LIBS}" FORCE) - if("${BRLCAD_BUNDLED_LIBS}" STREQUAL "SYSTEM") - set(${CMAKE_PROJECT_NAME}_${varname_root}_BUILD OFF) - set(TP_MET_CONDITION 5) - elseif("${BRLCAD_BUNDLED_LIBS}" STREQUAL "BUNDLED") - set(${CMAKE_PROJECT_NAME}_${varname_root}_BUILD ON) - set(TP_DISABLE_TEST 1) - set(TP_MET_CONDITION 5) - endif("${BRLCAD_BUNDLED_LIBS}" STREQUAL "SYSTEM") - endif("${BRLCAD_BUNDLED_LIBS}" STREQUAL "SYSTEM" OR "${BRLCAD_BUNDLED_LIBS}" STREQUAL "BUNDLED") - endif(NOT TP_MET_CONDITION) - - # If we haven't been knocked out by any of the above conditions, do our testing and base the results on that. - if(NOT TP_DISABLE_TEST) - # Stash the previous results (if any) so we don't repeatedly call out the tests - only report - # if something actually changes in subsequent runs. - set(${varname_root}_FOUND_STATUS ${${varname_root}_FOUND}) - - # Initialize (or rather, uninitialize) variables in preparation for search - set(${varname_root}_FOUND "${varname_root}-NOTFOUND" CACHE STRING "${varname_root}_FOUND" FORCE) - mark_as_advanced(${varname_root}_FOUND) - set(${varname_root}_EXECUTABLE "${varname_root}-NOTFOUND" CACHE STRING "${varname_root}_EXECUTABLE" FORCE) - - # Be quiet if we're doing this over - if("${${varname_root}_FOUND_STATUS}" MATCHES "NOTFOUND") - set(${varname_root}_FIND_QUIETLY TRUE) - endif("${${varname_root}_FOUND_STATUS}" MATCHES "NOTFOUND") - - # Include the Find module for the executable in question - if(EXISTS ${${CMAKE_PROJECT_NAME}_CMAKE_DIR}/Find${varname_root}.cmake) - include(${${CMAKE_PROJECT_NAME}_CMAKE_DIR}/Find${varname_root}.cmake) - else(EXISTS ${${CMAKE_PROJECT_NAME}_CMAKE_DIR}/Find${varname_root}.cmake) - include(${CMAKE_ROOT}/Modules/Find${varname_root}.cmake) - endif(EXISTS ${${CMAKE_PROJECT_NAME}_CMAKE_DIR}/Find${varname_root}.cmake) - - # going to use system or bundled versions of deps - if(${varname_root}_FOUND) - set(${CMAKE_PROJECT_NAME}_${varname_root}_BUILD OFF) - set(${CMAKE_PROJECT_NAME}_${varname_root} "SYSTEM (AUTO)" CACHE STRING "Found System version, using" FORCE) - else(${varname_root}_FOUND) - # If one of our previous conditions precludes building this library, we've got a problem unless the - # cached version is suitable - check that before we warn. - if(NOT "${local_opt}" STREQUAL "SYSTEM" AND NOT "${BRLCAD_BUNDLED_LIBS}" STREQUAL SYSTEM) - set(${CMAKE_PROJECT_NAME}_${varname_root}_BUILD ON) - set(${CMAKE_PROJECT_NAME}_${varname_root} "BUNDLED (AUTO)" CACHE STRING "System test failed, enabling local copy" FORCE) - endif(NOT "${local_opt}" STREQUAL "SYSTEM" AND NOT "${BRLCAD_BUNDLED_LIBS}" STREQUAL SYSTEM) - endif(${varname_root}_FOUND) - - endif(NOT TP_DISABLE_TEST) - - # Now that we've run the Find routine, see if we had a cached value different from any of our - # standard results - set(TP_USING_CACHED 0) - if(NOT "${TP_MET_CONDITION}" STREQUAL "1" AND NOT "${TP_MET_CONDITION}" STREQUAL "4") - if(EXEC_CACHED) - # Is it a build target? If so, don't cache it. - get_filename_component(EXEC_CACHED_ABS_PATH ${EXEC_CACHED} ABSOLUTE) - IF ("${EXEC_CACHED_ABS_PATH}" STREQUAL "${PATH_ABS}") - # Is it the bundled path? (don't override if it is, the bundled option setting takes care of that) - if(NOT "${EXEC_CACHED}" STREQUAL "${CMAKE_BINARY_DIR}/${BIN_DIR}/${build_target}") - # Is it the same as the found results? - if(NOT "${EXEC_CACHED}" STREQUAL "${${varname_root}_EXECUTABLE_FOUND_RESULT}") - set(${varname_root}_EXECUTABLE ${EXEC_CACHED} CACHE STRING "Apparently a user specified path was supplied, use it" FORCE) - set(${CMAKE_PROJECT_NAME}_${varname_root}_BUILD OFF) - set(${CMAKE_PROJECT_NAME}_${varname_root} "SYSTEM (AUTO)" CACHE STRING "Apparently a user specified path was supplied, use it" FORCE) - set(TP_USING_CACHED 1) - endif(NOT "${EXEC_CACHED}" STREQUAL "${${varname_root}_EXECUTABLE_FOUND_RESULT}") - endif(NOT "${EXEC_CACHED}" STREQUAL "${CMAKE_BINARY_DIR}/${BIN_DIR}/${build_target}") - endif("${EXEC_CACHED_ABS_PATH}" STREQUAL "${PATH_ABS}") - endif(EXEC_CACHED) - endif(NOT "${TP_MET_CONDITION}" STREQUAL "1" AND NOT "${TP_MET_CONDITION}" STREQUAL "4") - - # If the CACHED value doesn't look good, and we aren't overridden by any of the other conditions, set based - # on the test results - if(NOT TP_USING_CACHED AND NOT TP_DISABLE_TEST) - if(${varname_root}_FOUND) - set(${CMAKE_PROJECT_NAME}_${varname_root}_BUILD OFF) - if(NOT "${CMAKE_PROJECT_NAME}_${varname_root}" STREQUAL "SYSTEM") - set(${CMAKE_PROJECT_NAME}_${varname_root} "SYSTEM (AUTO)" CACHE STRING "Found System version, using" FORCE) - endif(NOT "${CMAKE_PROJECT_NAME}_${varname_root}" STREQUAL "SYSTEM") - else(${varname_root}_FOUND) - # If one of our previous conditions precludes building this exec, we've got a problem. - if("${local_opt}" STREQUAL "SYSTEM" OR "${BRLCAD_BUNDLED_LIBS}" STREQUAL SYSTEM) - set(${CMAKE_PROJECT_NAME}_${varname_root}_BUILD ON) - set(${CMAKE_PROJECT_NAME}_${varname_root}_NOTFOUND 1) - message(WARNING "Compilation of local version of ${build_target} was disabled, but system version not found!") - if(NOT "${local_opt}" STREQUAL "SYSTEM") - set(${CMAKE_PROJECT_NAME}_${varname_root} "SYSTEM (AUTO)" CACHE STRING "BRLCAD_BUNDLED_LIBS forced to SYSTEM, but library not found!" FORCE) - else(NOT "${local_opt}" STREQUAL "SYSTEM") - set(${CMAKE_PROJECT_NAME}_${varname_root} "SYSTEM" CACHE STRING "Hard-set to SYSTEM by user, but library not found!" FORCE) - endif(NOT "${local_opt}" STREQUAL "SYSTEM") - else("${local_opt}" STREQUAL "SYSTEM" OR "${BRLCAD_BUNDLED_LIBS}" STREQUAL SYSTEM) - set(${CMAKE_PROJECT_NAME}_${varname_root}_BUILD ON) - set(${CMAKE_PROJECT_NAME}_${varname_root} "BUNDLED (AUTO)" CACHE STRING "System test failed, enabling local copy" FORCE) - endif("${local_opt}" STREQUAL "SYSTEM" OR "${BRLCAD_BUNDLED_LIBS}" STREQUAL SYSTEM) - endif(${varname_root}_FOUND) - endif(NOT TP_USING_CACHED AND NOT TP_DISABLE_TEST) - - - if(${CMAKE_PROJECT_NAME}_${varname_root}_BUILD) - # In the case of executables, it is possible that a directory may define more than one - # executable target. If this is the case, we may have already added this directory - - # if so, don't do it again. - if(SRC_OTHER_ADDED_DIRS) - list(FIND SRC_OTHER_ADDED_DIRS ${dir} ADDED_RESULT) - if("${ADDED_RESULT}" STREQUAL "-1") - add_subdirectory(${dir}) - set(SRC_OTHER_ADDED_DIRS ${SRC_OTHER_ADDED_DIRS} ${dir}) - list(REMOVE_DUPLICATES SRC_OTHER_ADDED_DIRS) - set(SRC_OTHER_ADDED_DIRS ${SRC_OTHER_ADDED_DIRS} CACHE STRING "Enabled 3rd party sub-directories" FORCE) - mark_as_advanced(SRC_OTHER_ADDED_DIRS) - endif("${ADDED_RESULT}" STREQUAL "-1") - else(SRC_OTHER_ADDED_DIRS) - add_subdirectory(${dir}) - set(SRC_OTHER_ADDED_DIRS ${dir} CACHE STRING "Enabled 3rd party sub-directories" FORCE) - mark_as_advanced(SRC_OTHER_ADDED_DIRS) - endif(SRC_OTHER_ADDED_DIRS) - if(CMAKE_CONFIGURATION_TYPES) - set(${varname_root}_EXECUTABLE "${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${BIN_DIR}/${build_target}" CACHE STRING "${varname_root}_EXECUTABLE" FORCE) - else(CMAKE_CONFIGURATION_TYPES) - set(${varname_root}_EXECUTABLE "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${build_target}" CACHE STRING "${varname_root}_EXECUTABLE" FORCE) - endif(CMAKE_CONFIGURATION_TYPES) - set(${varname_root}_EXECUTABLE_TARGET ${build_target} CACHE STRING "Build target for ${build_target}" FORCE) - else(${CMAKE_PROJECT_NAME}_${varname_root}_BUILD) - set(${varname_root}_EXECUTABLE_TARGET "" CACHE STRING "No build target for ${build_target}" FORCE) - endif(${CMAKE_PROJECT_NAME}_${varname_root}_BUILD) - - if (TP_ALIASES AND TP_DESCRIPTION) - BRLCAD_OPTION("${CMAKE_PROJECT_NAME}_${varname_root}" "${${CMAKE_PROJECT_NAME}_${varname_root}}" - TYPE ABS - ALIASES ${TP_ALIASES} - DESCRIPTION "${TP_DESCRIPTION}") - endif (TP_ALIASES AND TP_DESCRIPTION) - - mark_as_advanced(${varname_root}_EXECUTABLE) - mark_as_advanced(${varname_root}_EXECUTABLE_TARGET) - mark_as_advanced(${varname_root}_FOUND) - -endfunction(THIRD_PARTY_EXECUTABLE) - # Local Variables: # tab-width: 8 # mode: cmake Modified: brlcad/branches/thirdparty_rework/misc/tools/CMakeLists.txt =================================================================== --- brlcad/branches/thirdparty_rework/misc/tools/CMakeLists.txt 2020-03-25 12:53:32 UTC (rev 75097) +++ brlcad/branches/thirdparty_rework/misc/tools/CMakeLists.txt 2020-03-25 13:16:30 UTC (rev 75098) @@ -18,6 +18,8 @@ # situations, CMake provides a variable CMAKE_CFG_INTDIR that will # insert the correct logic for config-dependent paths. +include("${CMAKE_CURRENT_SOURCE_DIR}/Third_Party_Exec.cmake") + # Clear all pre-defined CMake flags CLEAR_BUILD_FLAGS() Added: brlcad/branches/thirdparty_rework/misc/tools/Third_Party_Exec.cmake =================================================================== --- brlcad/branches/thirdparty_rework/misc/tools/Third_Party_Exec.cmake (rev 0) +++ brlcad/branches/thirdparty_rework/misc/tools/Third_Party_Exec.cmake 2020-03-25 13:16:30 UTC (rev 75098) @@ -0,0 +1,270 @@ +function(THIRD_PARTY_EXECUTABLE dir varname_root build_target) + + # Parse extra arguments + cmake_parse_arguments(TP "NOSYS" "" "REQUIRED_VARS;ALIASES;DESCRIPTION" ${ARGN}) + + # If the exec variable has been explicitly set, get + # an normalized version of it for easier matching + set(local_opt) + if(NOT ${${CMAKE_PROJECT_NAME}_${varname_root}} STREQUAL "") + set(local_opt "${${CMAKE_PROJECT_NAME}_${varname_root}}") + endif(NOT ${${CMAKE_PROJECT_NAME}_${varname_root}} STREQUAL "") + VAL_NORMALIZE(local_opt ABS) + + # Initialize some variables + set(TP_DISABLED 0) + set(TP_DISABLE_TEST 0) + set(TP_MET_CONDITION 0) + + # 0. Whether or not we're building the sources, we are tracking the files + # that are supposed to be in the directory + get_filename_component(DIR_NAME "${dir}" NAME) + if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${DIR_NAME}.dist") + message(FATAL_ERROR "Third party component ${DIR_NAME} does not have a dist file at \"${CMAKE_CURRENT_SOURCE_DIR}/${DIR_NAME}.dist\"") + endif(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${DIR_NAME}.dist") + include("${CMAKE_CURRENT_SOURCE_DIR}/${DIR_NAME}.dist") + CMAKEFILES_IN_DIR(${DIR_NAME}_ignore_files ${dir}) + + # 1. For executables, it is a reasonable use case that the developer manually specifies + # the location for an executable. It is tricky to distinguish this situation from + # a previously cached executable path resulting from a Find*.cmake script. The way + # we will proceed is to cache the value of ${varname_root}_EXECUTABLE if it is defined, and + # at the end check it against the results of running the THIRD_PARTY logic. If + # it matches neither pattern (Bundled or System) it is assumed that the value passed + # in is an intentional setting on the part of the developer. This has one potential + # drawback in that the *removal* of a system executable between searches could result + # in a previously cached system search result being identified as a user-specified + # result - to prevent that, the cached path is only used to override other results + # if the file it specifies actually exists. One additional wrinkle here - if the + # developer has hard-specified BUNDLED for this particular executable, even a user specified + # or cached value will be replaced with the local path. A feature based disablement + # of the tool also applies to the cached version. + if(${varname_root}_EXECUTABLE) + IS_SUBPATH("${CMAKE_BINARY_DIR}" "${${varname_root}_EXECUTABLE}" SUBBUILD_TEST) + if("${SUBBUILD_TEST}" STREQUAL "0") + get_filename_component(FULL_PATH_EXEC ${${varname_root}_EXECUTABLE} ABSOLUTE) + if("${FULL_PATH_EXEC}" STREQUAL "${${varname_root}_EXECUTABLE}") + if(EXISTS ${FULL_PATH_EXEC}) + set(EXEC_CACHED ${${varname_root}_EXECUTABLE}) + else(EXISTS ${FULL_PATH_EXEC}) + # This path not being present may indicate the user specified a path + # and made a mistake doing so - warn that this might be the case. + message(WARNING "File path ${${varname_root}_EXECUTABLE} specified for ${varname_root}_EXECUTABLE does not exist - this path will not override ${build_target} executable search results.") + endif(EXISTS ${FULL_PATH_EXEC}) + endif("${FULL_PATH_EXEC}" STREQUAL "${${varname_root}_EXECUTABLE}") + endif("${SUBBUILD_TEST}" STREQUAL "0") + endif(${varname_root}_EXECUTABLE) + + # 2. If any of the required flags are off, this tool is a no-go. + set(DISABLE_STR "") + foreach(item ${TP_REQUIRED_VARS}) + if(NOT ${item}) + set(TP_DISABLED 1) + set(TP_DISABLE_TEST 1) + set(${CMAKE_PROJECT_NAME}_${varname_root}_BUILD OFF) + if(NOT DISABLE_STR) + set(DISABLE_STR "${item}") + else(NOT DISABLE_STR) + set(DISABLE_STR "${DISABLE_STR},${item}") + endif(NOT DISABLE_STR) + endif(NOT ${item}) + endforeach(item ${TP_REQUIRED_VARS}) + if(DISABLE_STR) + set(${CMAKE_PROJECT_NAME}_${varname_root} "DISABLED ${DISABLE_STR}" CACHE STRING "DISABLED ${DISABLED_STR}" FORCE) + mark_as_advanced(FORCE ${CMAKE_PROJECT_NAME}_${varname_root}) + set(${varname_root}_MET_CONDITION 1) + else(DISABLE_STR) + # If we have a leftover disabled setting in the cache from earlier runs, clear it. + if("${local_opt}" MATCHES "DISABLED") + set(${CMAKE_PROJECT_NAME}_${varname_root} "" CACHE STRING "Clear DISABLED setting" FORCE) + mark_as_advanced(CLEAR ${CMAKE_PROJECT_NAME}_${varname_root}) + endif("${local_opt}" MATCHES "DISABLED") + endif(DISABLE_STR) + + # 3. Next - is the executable variable explicitly set to SYSTEM? If it is, we are NOT building it. + if(local_opt) + if("${local_opt}" STREQUAL "SYSTEM") + set(${CMAKE_PROJECT_NAME}_${varname_root}_BUILD OFF) + set(TP_MET_CONDITION 2) + if(TP_NOSYS) + message(WARNING "Compilation of ${build_target} was disabled, but local copy is modified - using a system version of ${build_target} may introduce problems or even fail to work!") + endif(TP_NOSYS) + endif("${local_opt}" STREQUAL "SYSTEM") + endif(local_opt) + + # 4. If we have a NOSYS flag, ALWAYS* use the bundled version. The NOSYS flag signifies that + # the BRL-CAD project requires modifications in the local src/other version of a library or + # tool that are not likely to be present in a system version. These flags should be periodically + # reviewed to determine if they can be removed (i.e. system packages have appeared in modern + # OS distributions with the fixes needed by BRL-CAD...). + # + # * In the case of executables, we'll allow a cached value from the user to override the NOSYS + # flag, since that's a likely scenario for testing, but that shouldn't be done except for testing + # purposes with a NOSYS target. + if(NOT TP_MET_CONDITION AND TP_NOSYS) + set(${CMAKE_PROJECT_NAME}_${varname_root} "BUNDLED" CACHE STRING "NOSYS passed, using bundled ${build_target}" FORCE) + mark_as_advanced(${CMAKE_PROJECT_NAME}_${varname_root}) + set(${CMAKE_PROJECT_NAME}_${varname_root}_BUILD ON) + set(TP_MET_CONDITION 3) + set(TP_DISABLE_TEST 1) + endif(NOT TP_MET_CONDITION AND TP_NOSYS) + + # 5. If we have an explicit BUNDLE request for this particular executable, honor it as long as + # features are satisfied. No point in testing if we know we're turning it on - set vars accordingly. + if(NOT TP_MET_CONDITION AND "${local_opt}" STREQUAL "BUNDLED") + set(${CMAKE_PROJECT_NAME}_${varname_root}_BUILD ON) + set(TP_DISABLE_TEST 1) + set(TP_MET_CONDITION 4) + endif(NOT TP_MET_CONDITION AND "${local_opt}" STREQUAL "BUNDLED") + + + # 5. If BRLCAD_BUNDLED_LIBS is exactly SYSTEM or exactly BUNDLED, and we haven't been overridden by + # one of the other conditions above, go with that. + if(NOT TP_MET_CONDITION) + if("${BRLCAD_BUNDLED_LIBS}" STREQUAL "SYSTEM" OR "${BRLCAD_BUNDLED_LIBS}" STREQUAL "BUNDLED") + set(${CMAKE_PROJECT_NAME}_${varname_root} "${BRLCAD_BUNDLED_LIBS} (AUTO)" CACHE STRING "BRLCAD_BUNDLED_LIBS: ${BRLCAD_BUNDLED_LIBS}" FORCE) + if("${BRLCAD_BUNDLED_LIBS}" STREQUAL "SYSTEM") + set(${CMAKE_PROJECT_NAME}_${varname_root}_BUILD OFF) + set(TP_MET_CONDITION 5) + elseif("${BRLCAD_BUNDLED_LIBS}" STREQUAL "BUNDLED") + set(${CMAKE_PROJECT_NAME}_${varname_root}_BUILD ON) + set(TP_DISABLE_TEST 1) + set(TP_MET_CONDITION 5) + endif("${BRLCAD_BUNDLED_LIBS}" STREQUAL "SYSTEM") + endif("${BRLCAD_BUNDLED_LIBS}" STREQUAL "SYSTEM" OR "${BRLCAD_BUNDLED_LIBS}" STREQUAL "BUNDLED") + endif(NOT TP_MET_CONDITION) + + # If we haven't been knocked out by any of the above conditions, do our testing and base the results on that. + if(NOT TP_DISABLE_TEST) + # Stash the previous results (if any) so we don't repeatedly call out the tests - only report + # if something actually changes in subsequent runs. + set(${varname_root}_FOUND_STATUS ${${varname_root}_FOUND}) + + # Initialize (or rather, uninitialize) variables in preparation for search + set(${varname_root}_FOUND "${varname_root}-NOTFOUND" CACHE STRING "${varname_root}_FOUND" FORCE) + mark_as_advanced(${varname_root}_FOUND) + set(${varname_root}_EXECUTABLE "${varname_root}-NOTFOUND" CACHE STRING "${varname_root}_EXECUTABLE" FORCE) + + # Be quiet if we're doing this over + if("${${varname_root}_FOUND_STATUS}" MATCHES "NOTFOUND") + set(${varname_root}_FIND_QUIETLY TRUE) + endif("${${varname_root}_FOUND_STATUS}" MATCHES "NOTFOUND") + + # Include the Find module for the executable in question + if(EXISTS ${${CMAKE_PROJECT_NAME}_CMAKE_DIR}/Find${varname_root}.cmake) + include(${${CMAKE_PROJECT_NAME}_CMAKE_DIR}/Find${varname_root}.cmake) + else(EXISTS ${${CMAKE_PROJECT_NAME}_CMAKE_DIR}/Find${varname_root}.cmake) + include(${CMAKE_ROOT}/Modules/Find${varname_root}.cmake) + endif(EXISTS ${${CMAKE_PROJECT_NAME}_CMAKE_DIR}/Find${varname_root}.cmake) + + # going to use system or bundled versions of deps + if(${varname_root}_FOUND) + set(${CMAKE_PROJECT_NAME}_${varname_root}_BUILD OFF) + set(${CMAKE_PROJECT_NAME}_${varname_root} "SYSTEM (AUTO)" CACHE STRING "Found System version, using" FORCE) + else(${varname_root}_FOUND) + # If one of our previous conditions precludes building this library, we've got a problem unless the + # cached version is suitable - check that before we warn. + if(NOT "${local_opt}" STREQUAL "SYSTEM" AND NOT "${BRLCAD_BUNDLED_LIBS}" STREQUAL SYSTEM) + set(${CMAKE_PROJECT_NAME}_${varname_root}_BUILD ON) + set(${CMAKE_PROJECT_NAME}_${varname_root} "BUNDLED (AUTO)" CACHE STRING "System test failed, enabling local copy" FORCE) + endif(NOT "${local_opt}" STREQUAL "SYSTEM" AND NOT "${BRLCAD_BUNDLED_LIBS}" STREQUAL SYSTEM) + endif(${varname_root}_FOUND) + + endif(NOT TP_DISABLE_TEST) + + # Now that we've run the Find routine, see if we had a cached value different from any of our + # standard results + set(TP_USING_CACHED 0) + if(NOT "${TP_MET_CONDITION}" STREQUAL "1" AND NOT "${TP_MET_CONDITION}" STREQUAL "4") + if(EXEC_CACHED) + # Is it a build target? If so, don't cache it. + get_filename_component(EXEC_CACHED_ABS_PATH ${EXEC_CACHED} ABSOLUTE) + IF ("${EXEC_CACHED_ABS_PATH}" STREQUAL "${PATH_ABS}") + # Is it the bundled path? (don't override if it is, the bundled option setting takes care of that) + if(NOT "${EXEC_CACHED}" STREQUAL "${CMAKE_BINARY_DIR}/${BIN_DIR}/${build_target}") + # Is it the same as the found results? + if(NOT "${EXEC_CACHED}" STREQUAL "${${varname_root}_EXECUTABLE_FOUND_RESULT}") + set(${varname_root}_EXECUTABLE ${EXEC_CACHED} CACHE STRING "Apparently a user specified path was supplied, use it" FORCE) + set(${CMAKE_PROJECT_NAME}_${varname_root}_BUILD OFF) + set(${CMAKE_PROJECT_NAME}_${varname_root} "SYSTEM (AUTO)" CACHE STRING "Apparently a user specified path was supplied, use it" FORCE) + set(TP_USING_CACHED 1) + endif(NOT "${EXEC_CACHED}" STREQUAL "${${varname_root}_EXECUTABLE_FOUND_RESULT}") + endif(NOT "${EXEC_CACHED}" STREQUAL "${CMAKE_BINARY_DIR}/${BIN_DIR}/${build_target}") + endif("${EXEC_CACHED_ABS_PATH}" STREQUAL "${PATH_ABS}") + endif(EXEC_CACHED) + endif(NOT "${TP_MET_CONDITION}" STREQUAL "1" AND NOT "${TP_MET_CONDITION}" STREQUAL "4") + + # If the CACHED value doesn't look good, and we aren't overridden by any of the other conditions, set based + # on the test results + if(NOT TP_USING_CACHED AND NOT TP_DISABLE_TEST) + if(${varname_root}_FOUND) + set(${CMAKE_PROJECT_NAME}_${varname_root}_BUILD OFF) + if(NOT "${CMAKE_PROJECT_NAME}_${varname_root}" STREQUAL "SYSTEM") + set(${CMAKE_PROJECT_NAME}_${varname_root} "SYSTEM (AUTO)" CACHE STRING "Found System version, using" FORCE) + endif(NOT "${CMAKE_PROJECT_NAME}_${varname_root}" STREQUAL "SYSTEM") + else(${varname_root}_FOUND) + # If one of our previous conditions precludes building this exec, we've got a problem. + if("${local_opt}" STREQUAL "SYSTEM" OR "${BRLCAD_BUNDLED_LIBS}" STREQUAL SYSTEM) + set(${CMAKE_PROJECT_NAME}_${varname_root}_BUILD ON) + set(${CMAKE_PROJECT_NAME}_${varname_root}_NOTFOUND 1) + message(WARNING "Compilation of local version of ${build_target} was disabled, but system version not found!") + if(NOT "${local_opt}" STREQUAL "SYSTEM") + set(${CMAKE_PROJECT_NAME}_${varname_root} "SYSTEM (AUTO)" CACHE STRING "BRLCAD_BUNDLED_LIBS forced to SYSTEM, but library not found!" FORCE) + else(NOT "${local_opt}" STREQUAL "SYSTEM") + set(${CMAKE_PROJECT_NAME}_${varname_root} "SYSTEM" CACHE STRING "Hard-set to SYSTEM by user, but library not found!" FORCE) + endif(NOT "${local_opt}" STREQUAL "SYSTEM") + else("${local_opt}" STREQUAL "SYSTEM" OR "${BRLCAD_BUNDLED_LIBS}" STREQUAL SYSTEM) + set(${CMAKE_PROJECT_NAME}_${varname_root}_BUILD ON) + set(${CMAKE_PROJECT_NAME}_${varname_root} "BUNDLED (AUTO)" CACHE STRING "System test failed, enabling local copy" FORCE) + endif("${local_opt}" STREQUAL "SYSTEM" OR "${BRLCAD_BUNDLED_LIBS}" STREQUAL SYSTEM) + endif(${varname_root}_FOUND) + endif(NOT TP_USING_CACHED AND NOT TP_DISABLE_TEST) + + + if(${CMAKE_PROJECT_NAME}_${varname_root}_BUILD) + # In the case of executables, it is possible that a directory may define more than one + # executable target. If this is the case, we may have already added this directory - + # if so, don't do it again. + if(SRC_OTHER_ADDED_DIRS) + list(FIND SRC_OTHER_ADDED_DIRS ${dir} ADDED_RESULT) + if("${ADDED_RESULT}" STREQUAL "-1") + add_subdirectory(${dir}) + set(SRC_OTHER_ADDED_DIRS ${SRC_OTHER_ADDED_DIRS} ${dir}) + list(REMOVE_DUPLICATES SRC_OTHER_ADDED_DIRS) + set(SRC_OTHER_ADDED_DIRS ${SRC_OTHER_ADDED_DIRS} CACHE STRING "Enabled 3rd party sub-directories" FORCE) + mark_as_advanced(SRC_OTHER_ADDED_DIRS) + endif("${ADDED_RESULT}" STREQUAL "-1") + else(SRC_OTHER_ADDED_DIRS) + add_subdirectory(${dir}) + set(SRC_OTHER_ADDED_DIRS ${dir} CACHE STRING "Enabled 3rd party sub-directories" FORCE) + mark_as_advanced(SRC_OTHER_ADDED_DIRS) + endif(SRC_OTHER_ADDED_DIRS) + if(CMAKE_CONFIGURATION_TYPES) + set(${varname_root}_EXECUTABLE "${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${BIN_DIR}/${build_target}" CACHE STRING "${varname_root}_EXECUTABLE" FORCE) + else(CMAKE_CONFIGURATION_TYPES) + set(${varname_root}_EXECUTABLE "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${build_target}" CACHE STRING "${varname_root}_EXECUTABLE" FORCE) + endif(CMAKE_CONFIGURATION_TYPES) + set(${varname_root}_EXECUTABLE_TARGET ${build_target} CACHE STRING "Build target for ${build_target}" FORCE) + else(${CMAKE_PROJECT_NAME}_${varname_root}_BUILD) + set(${varname_root}_EXECUTABLE_TARGET "" CACHE STRING "No build target for ${build_target}" FORCE) + endif(${CMAKE_PROJECT_NAME}_${varname_root}_BUILD) + + if (TP_ALIASES AND TP_DESCRIPTION) + BRLCAD_OPTION("${CMAKE_PROJECT_NAME}_${varname_root}" "${${CMAKE_PROJECT_NAME}_${varname_root}}" + TYPE ABS + ALIASES ${TP_ALIASES} + DESCRIPTION "${TP_DESCRIPTION}") + endif (TP_ALIASES AND TP_DESCRIPTION) + + mark_as_advanced(${varname_root}_EXECUTABLE) + mark_as_advanced(${varname_root}_EXECUTABLE_TARGET) + mark_as_advanced(${varname_root}_FOUND) + +endfunction(THIRD_PARTY_EXECUTABLE) + +# Locac Variables: +# tab-width: 8 +# mode: cmake +# indent-tabs-mode: t +# End: +# ex: shiftwidth=2 tabstop=8 Property changes on: brlcad/branches/thirdparty_rework/misc/tools/Third_Party_Exec.cmake ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. _______________________________________________ BRL-CAD Source Commits mailing list brlcad-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/brlcad-commits