From: <ai...@us...> - 2013-12-04 06:43:42
|
Revision: 12808 http://sourceforge.net/p/plplot/code/12808 Author: airwin Date: 2013-12-04 06:43:38 +0000 (Wed, 04 Dec 2013) Log Message: ----------- Implement CMake logic to handle dependencies correctly for the new epa_build add_subdirectory paradigm. Tested by: Alan W. Irwin <ai...@us...> on Linux using epa_build with -DBUILD_THE_BUILD_TOOLS=ON cmake option and the build_tk target with the build_tk dependency on build_tcl correctly taken care of. N.B. This is a good start showing the dependent build case works, but there is still a lot of editing to do to get build configurations other than Tcl and Tk compatible with the new paradigm. Modified Paths: -------------- trunk/cmake/epa_build/CMakeLists.txt trunk/cmake/epa_build/tk/CMakeLists.txt Modified: trunk/cmake/epa_build/CMakeLists.txt =================================================================== --- trunk/cmake/epa_build/CMakeLists.txt 2013-12-03 23:56:24 UTC (rev 12807) +++ trunk/cmake/epa_build/CMakeLists.txt 2013-12-04 06:43:38 UTC (rev 12808) @@ -166,7 +166,7 @@ _EPA_visited_subdirectories_LIST _EPA_processed_subdirectories_LIST _EPA_needed_subdirectories_LIST - _EPA_build_target_LIST + _EPA_build_targets_LIST _EPA_PATH _source_PATH _IF_RETURN @@ -179,11 +179,10 @@ #message(STATUS "DEBUG: ${_EPA_visited_subdirectories_LIST} = ${${_EPA_visited_subdirectories_LIST}}") #message(STATUS "DEBUG: ${_EPA_processed_subdirectories_LIST} = ${${_EPA_processed_subdirectories_LIST}}") #message(STATUS "DEBUG: ${_EPA_needed_subdirectories_LIST} = ${${_EPA_needed_subdirectories_LIST}}") - #message(STATUS "DEBUG: ${_EPA_build_target_LIST} = ${${_EPA_build_target_LIST}}") + #message(STATUS "DEBUG: ${_EPA_build_targets_LIST} = ${${_EPA_build_targets_LIST}}") #message(STATUS "DEBUG: ${_EPA_PATH} = ${${_EPA_PATH}}") #message(STATUS "DEBUG: ${_source_PATH} = ${${_source_PATH}}") #message(STATUS "DEBUG: ${_IF_RETURN} = ${${_IF_RETURN}}") - list(APPEND ${_EPA_visited_subdirectories_LIST} ${${_PACKAGE}}) # Remove dependencies that should be ignored. if(${_dependencies_LIST} AND ${_ignored_dependencies_LIST}) @@ -205,11 +204,17 @@ list(REMOVE_ITEM remaining_dependencies_LIST ${${_EPA_processed_subdirectories_LIST}}) endif(remaining_dependencies_LIST AND ${_EPA_processed_subdirectories_LIST}) - if(remaining_dependencies_LIST) + if(0 AND remaining_dependencies_LIST) list(FIND ${_EPA_visited_subdirectories_LIST} ${${_PACKAGE}} index) if(index GREATER -1) message(FATAL_ERROR "Circular dependency: ${_PACKAGE} = ${${_PACKAGE}} has been visited before without subsequently resolving all dependencies.") endif(index GREATER -1) + + # Mark this subdirectory as being visited so that the above circular + # dependency check will work if the next visit still has remaining + # dependencies. + list(APPEND ${_EPA_visited_subdirectories_LIST} ${${_PACKAGE}}) + # Put the remaining dependencies at the top of the list so they # will be processed before the current subdirectory. list(APPEND ${_EPA_needed_subdirectories_LIST} ${remaining_dependencies_LIST}) @@ -222,8 +227,15 @@ # parent subdirectory should make immediate return to top-level directory. set(${_IF_RETURN} ON PARENT_SCOPE) return() - endif(remaining_dependencies_LIST) + endif(0 AND remaining_dependencies_LIST) + foreach(build_configuration ${remaining_dependencies_LIST}) + add_subdirectory( + ${CMAKE_SOURCE_DIR}/${build_configuration} + ${CMAKE_BINARY_DIR}/${build_configuration} + ) + endforeach(build_configuration ${remaining_dependencies_LIST}) + # Add this subdirectory to the list of subdirectories that have # already been processed by the top-level CMakeLists.txt logic. list(APPEND ${_EPA_processed_subdirectories_LIST} ${${_PACKAGE}}) @@ -233,7 +245,7 @@ list(APPEND ${_dependencies_targets} build_${build_configuration}) endforeach(build_configuration ${${_dependences_LIST}}) - list(APPEND ${_EPA_build_target_LIST} build_${${_PACKAGE}}) + list(APPEND ${_EPA_build_targets_LIST} build_${${_PACKAGE}}) # Data that is related to the PATH that must be used. if(MSYS_PLATFORM) @@ -245,13 +257,17 @@ endif(MSYS_PLATFORM) #message(STATUS "DEBUG: (modified for ${${_PACKAGE}}) ${_EPA_PATH} = ${${_EPA_PATH}}") + # Mark this subdirectory as visited for no logical purpose other + # than to be less confusing for debugging. + list(APPEND ${_EPA_visited_subdirectories_LIST} ${${_PACKAGE}}) + # Propagate changed output arguments to parent scope of function. set(${_dependencies_LIST} ${${_dependencies_LIST}} PARENT_SCOPE) set(${_dependencies_targets} ${${_dependencies_targets}} PARENT_SCOPE) set(${_EPA_visited_subdirectories_LIST} ${${_EPA_visited_subdirectories_LIST}} PARENT_SCOPE) set(${_EPA_processed_subdirectories_LIST} ${${_EPA_processed_subdirectories_LIST}} PARENT_SCOPE) set(${_EPA_needed_subdirectories_LIST} ${${_EPA_needed_subdirectories_LIST}} PARENT_SCOPE) - set(${_EPA_build_target_LIST} ${${_EPA_build_target_LIST}} PARENT_SCOPE) + set(${_EPA_build_targets_LIST} ${${_EPA_build_targets_LIST}} PARENT_SCOPE) set(${_EPA_PATH} ${${_EPA_PATH}} PARENT_SCOPE) set(${_source_PATH} ${${_source_PATH}} PARENT_SCOPE) # Parent subdirectory should continue processing rather than immediately @@ -385,7 +401,7 @@ #pkg-config ##subversion #swig - tcl + tk # itcl version 4 is integrated into tcl # itk version 4 is not integrated into tk (or tcl). #itk @@ -425,7 +441,9 @@ # This updates EPA_needed_subdirectories_LIST, # EPA_processed_subdirectories_LIST, and EPA_build_targets_LIST. add_subdirectory(${subdirectory}) - list(REMOVE_ITEM EPA_needed_subdirectories_LIST ${EPA_processed_subdirectories_LIST}) + if(EPA_processed_subdirectories_LIST) + list(REMOVE_ITEM EPA_needed_subdirectories_LIST ${EPA_processed_subdirectories_LIST}) + endif(EPA_processed_subdirectories_LIST) message(STATUS "DEBUG: visited ${subdirectory}") message(STATUS "DEBUG: EPA_needed_subdirectories_LIST = ${EPA_needed_subdirectories_LIST}") message(STATUS "DEBUG: EPA_visited_subdirectories_LIST = ${EPA_visited_subdirectories_LIST}") Modified: trunk/cmake/epa_build/tk/CMakeLists.txt =================================================================== --- trunk/cmake/epa_build/tk/CMakeLists.txt 2013-12-03 23:56:24 UTC (rev 12807) +++ trunk/cmake/epa_build/tk/CMakeLists.txt 2013-12-04 06:43:38 UTC (rev 12808) @@ -1,6 +1,7 @@ # tk/CMakeLists.txt -# CMakeLists.txt file to configure the build of tk. +# Configure the build of tk. + # Copyright (C) 2013 Alan W. Irwin # This file is free software; you can redistribute it and/or @@ -17,50 +18,42 @@ # License along with this file; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -# The top-level CMakeLists.txt file that includes this file should -# have run "include(ExternalProject)" and set EPA_BASE variable (and -# corresponding directory property) as well as various EPA variables -# used below that configure how the External_Project functions -# operate. - # These build configuration details for Tk adapted from information in # <http://www.linuxfromscratch.org/blfs/view/svn/general/tk.html>. -# Protect against configuring a build twice in one CMake call -if(tk_configured) - return() -endif(tk_configured) -set(tk_configured ON) +set(PACKAGE tk) # List of dependencies (most of which are build tools) which should be # ignored. -set(EPA_ignored_dependencies_LIST ${extra_ignored_dependencies_list}) +set(ignored_dependencies_LIST ${extra_ignored_dependencies_list}) -set(tk_dependencies_LIST tcl) -# Remove dependencies that should be ignored. -if(tk_dependencies_LIST) - list(REMOVE_ITEM tk_dependencies_LIST ${EPA_ignored_dependencies_LIST}) -endif(tk_dependencies_LIST) +set(dependencies_LIST tcl) -set(tk_dependencies_targets) -foreach(build_configuration ${tk_dependencies_LIST}) - if(EXISTS ${CMAKE_SOURCE_DIR}/${build_configuration}/CMakeLists.txt) - include(${build_configuration}/CMakeLists.txt) - list(APPEND tk_dependencies_targets build_${build_configuration}) - else(EXISTS ${CMAKE_SOURCE_DIR}/${build_configuration}/CMakeLists.txt) - message(STATUS "Warning: A build_configuration for ${build_configuration} does not exist so it is assumed this dependency of tk has been installed another way.") - endif(EXISTS ${CMAKE_SOURCE_DIR}/${build_configuration}/CMakeLists.txt) -endforeach(build_configuration ${tk_dependences_LIST}) +# Do boilerplate tasks that must be done for each different project +# that is configured as part of epa_build. +epa_boilerplate( + ignored_dependencies_LIST + PACKAGE + dependencies_LIST + dependencies_targets + EPA_visited_subdirectories_LIST + EPA_processed_subdirectories_LIST + EPA_needed_subdirectories_LIST + EPA_build_targets_LIST + EPA_PATH + source_PATH + IF_RETURN + ) -# This can be safely done only after above includes. -set(PACKAGE tk) +# Propagate list changes to parent scope. +set(EPA_visited_subdirectories_LIST ${EPA_visited_subdirectories_LIST} PARENT_SCOPE) +set(EPA_processed_subdirectories_LIST ${EPA_processed_subdirectories_LIST} PARENT_SCOPE) +set(EPA_needed_subdirectories_LIST ${EPA_needed_subdirectories_LIST} PARENT_SCOPE) +set(EPA_build_targets_LIST ${EPA_build_targets_LIST} PARENT_SCOPE) -# Data that is related to downloads. -# Note that TCL_TK_VERSION and TCL_TK_LIBVERSION variables supplied -# by tcl/CMakeLists.txt which is included above. -set(URL http://downloads.sourceforge.net/project/tcl/Tcl/${TCL_TK_VERSION}/tk${TCL_TK_VERSION}-src.tar.gz) -set(${PACKAGE}_DOWNLOAD_HASH_TYPE MD5) -set(${PACKAGE}_DOWNLOAD_HASH 63f21c3a0e0cefbd854b4eb29b129ac6) +if(IF_RETURN) + return() +endif(IF_RETURN) # Data that is related to the PATH that must be used. # N.B. note below that we always use the unix subdirectory of the @@ -70,28 +63,32 @@ # version of configure may be good enough for our needs for all # platforms. if(MSYS_PLATFORM) - #set(EPA_PATH_NODLL "${EPA_PATH}") - #set(EPA_PATH "${EPA_BASE}/Build/build_${PACKAGE}/dll;${EPA_PATH_NODLL}") - determine_msys_path(EPA_PATH "${EPA_PATH}") - # Must have all elements of env command in MSYS platform form - determine_msys_path(source_PATH "${EPA_BASE}/Source/build_${PACKAGE}/unix") - set(${PACKAGE}_SET_CFLAGS "CFLAGS=$ENV{CFLAGS}") + set(source_PATH ${source_PATH}\unix) else(MSYS_PLATFORM) - set(source_PATH "${EPA_BASE}/Source/build_${PACKAGE}/unix") - set(${PACKAGE}_SET_CFLAGS "CFLAGS=$ENV{CFLAGS}") + set(source_PATH ${source_PATH}/unix) endif(MSYS_PLATFORM) -#message(STATUS "modified EPA_PATH for ${PACKAGE} = ${EPA_PATH}") +set(CFLAGS "$ENV{CFLAGS}") +# Drop -fvisibility=hidden since that option may not work for this package. +string(REGEX REPLACE "-fvisibility=hidden" "" CFLAGS "${CFLAGS}") + +# Data that is related to downloads. +set(TCL_TK_VERSION 8.6.1) +string(REGEX REPLACE "\\.[0-9]$" "" TCL_TK_LIBVERSION ${TCL_TK_VERSION}) +set(URL http://downloads.sourceforge.net/project/tcl/Tcl/${TCL_TK_VERSION}/tk${TCL_TK_VERSION}-src.tar.gz) +set(DOWNLOAD_HASH_TYPE MD5) +set(DOWNLOAD_HASH 63f21c3a0e0cefbd854b4eb29b129ac6) + if(EPA_HAVE_64_BIT_OS) - set(TK_ENABLE_64_BIT --enable-64bit) + set(ENABLE_64_BIT --enable-64bit) endif(EPA_HAVE_64_BIT_OS) ExternalProject_Add( build_${PACKAGE} - DEPENDS ${${PACKAGE}_dependencies_targets} + DEPENDS ${dependencies_targets} URL ${URL} - URL_HASH ${${PACKAGE}_DOWNLOAD_HASH_TYPE}=${${PACKAGE}_DOWNLOAD_HASH} - CONFIGURE_COMMAND ${ENV_EXECUTABLE} PATH=${EPA_PATH} ${${PACKAGE}_SET_CFLAGS} CPPFLAGS=-I${EPA_CMAKE_INSTALL_PREFIX}/include ${source_PATH}/${EPA_CONFIGURE_COMMAND} --mandir=${EPA_CMAKE_INSTALL_PREFIX}/share/man ${TK_ENABLE_64_BIT} + URL_HASH ${DOWNLOAD_HASH_TYPE}=${DOWNLOAD_HASH} + CONFIGURE_COMMAND ${ENV_EXECUTABLE} PATH=${EPA_PATH} "CFLAGS=${CFLAGS}" CPPFLAGS=-I${EPA_CMAKE_INSTALL_PREFIX}/include ${source_PATH}/${EPA_CONFIGURE_COMMAND} --mandir=${EPA_CMAKE_INSTALL_PREFIX}/share/man ${ENABLE_64_BIT} BUILD_COMMAND ${ENV_EXECUTABLE} PATH=${EPA_PATH} ${EPA_PARALLEL_MAKE_COMMAND} INSTALL_COMMAND ${ENV_EXECUTABLE} PATH=${EPA_PATH} ${EPA_PARALLEL_MAKE_COMMAND} install ) @@ -116,8 +113,3 @@ COMMAND ${CHMOD_EXECUTABLE} -v ${SO_NUMERICAL_PERMISSIONS} ${EPA_CMAKE_INSTALL_PREFIX}/lib/libtk${TCL_TK_LIBVERSION}.so APPEND ) - -list(APPEND build_target_LIST build_${PACKAGE}) -# Restore EPA_PATH to original state. -set(EPA_PATH "${EPA_ORIGINAL_NATIVE_PATH}") -#message(STATUS "${PACKAGE} restored original EPA_PATH = ${EPA_PATH}") This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |