Revision: 46333
          http://brlcad.svn.sourceforge.net/brlcad/?rev=46333&view=rev
Author:   starseeker
Date:     2011-08-23 14:59:41 +0000 (Tue, 23 Aug 2011)

Log Message:
-----------
Add more CMake logic for re2c/lemon, this time relating to deciding whether or 
not to build local copies - this is Not Done, particularly the FindRE2C and 
FindLEMON files, but checkpointing.

Modified Paths:
--------------
    brlcad/trunk/misc/CMake/ThirdParty.cmake
    brlcad/trunk/src/other/CMakeLists.txt

Added Paths:
-----------
    brlcad/trunk/misc/CMake/FindLEMON.cmake
    brlcad/trunk/misc/CMake/FindRE2C.cmake

Added: brlcad/trunk/misc/CMake/FindLEMON.cmake
===================================================================
--- brlcad/trunk/misc/CMake/FindLEMON.cmake                             (rev 0)
+++ brlcad/trunk/misc/CMake/FindLEMON.cmake     2011-08-23 14:59:41 UTC (rev 
46333)
@@ -0,0 +1,115 @@
+# - Find lemon executable and provides macros to generate custom build rules
+# The module defines the following variables
+#
+#  LEMON_EXECUTABLE - path to the lemon program
+#  LEMON_FOUND - true if the program was found
+#
+# If lemon is found, the module defines the macros:
+#  LEMON_TARGET(<Name> <LemonInput> <CodeOutput> [VERBOSE <file>]
+#              [COMPILE_FLAGS <string>])
+# which will create  a custom rule to generate  a parser. <LemonInput> is
+# the path to  a lemon file. <CodeOutput> is the name  of the source file
+# generated by lemon.  A header file is also  be generated, and contains
+# the  token  list.  If  COMPILE_FLAGS  option is  specified,  the  next
+# parameter is  added in the lemon command line.  if  VERBOSE option is
+# specified, <file> is created  and contains verbose descriptions of the
+# grammar and parser. The macro defines a set of variables:
+#  LEMON_${Name}_DEFINED - true is the macro ran successfully
+#  LEMON_${Name}_INPUT - The input source file, an alias for <LemonInput>
+#  LEMON_${Name}_OUTPUT_SOURCE - The source file generated by lemon 
+#  LEMON_${Name}_OUTPUT_HEADER - The header file generated by lemon
+#  LEMON_${Name}_OUTPUTS - The sources files generated by lemon
+#  LEMON_${Name}_COMPILE_FLAGS - Options used in the lemon command line
+#
+#  ====================================================================
+#  Example:
+#
+#   find_package(LEMON)
+#   LEMON_TARGET(MyParser parser.y ${CMAKE_CURRENT_BINARY_DIR}/parser.cpp)
+#   add_executable(Foo main.cpp ${LEMON_MyParser_OUTPUTS})
+#  ====================================================================
+#
+#=============================================================================
+# Copyright 2010 United States Government as represented by
+#                the U.S. Army Research Laboratory.
+# Copyright 2009 Kitware, Inc.
+# Copyright 2006 Tristan Carel
+# All rights reserved.
+# 
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#  
+# * Redistributions of source code must retain the above copyright
+#   notice, this list of conditions and the following disclaimer.
+# 
+# * Redistributions in binary form must reproduce the above copyright
+#   notice, this list of conditions and the following disclaimer in the
+#   documentation and/or other materials provided with the distribution.
+# 
+# * The names of the authors may not be used to endorse or promote
+#   products derived from this software without specific prior written
+#   permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#=============================================================================
+
+
+FIND_PROGRAM(LEMON_EXECUTABLE lemon DOC "path to the lemon executable")
+MARK_AS_ADVANCED(LEMON_EXECUTABLE)
+
+IF(LEMON_EXECUTABLE)
+       #============================================================
+       # LEMON_TARGET (public macro)
+       #============================================================
+       #
+       MACRO(LEMON_TARGET Name LemonInput LemonOutput)
+               SET(LEMON_TARGET_outputs "${LemonOutput}")
+               IF(NOT ${ARGC} EQUAL 3 AND NOT ${ARGC} EQUAL 4)
+                       MESSAGE(SEND_ERROR "Usage")
+               ELSE()
+                       # lemon generates files in source dir, so we need to 
move them
+                       STRING(REGEX REPLACE "y$" "c" SRC_FILE "${ARGV1}")
+                       STRING(REGEX REPLACE "y$" "h" HEADER_FILE "${ARGV1}")
+                       STRING(REGEX REPLACE "y$" "out" OUT_FILE "${ARGV1}")
+                       STRING(REGEX REPLACE "^(.*)(\\.[^.]*)$" "\\2" _fileext 
"${ARGV2}")
+                       STRING(REPLACE "c" "h" _fileext ${_fileext})
+                       STRING(REGEX REPLACE "^(.*)(\\.[^.]*)$" 
"\\1${_fileext}" LEMON_${Name}_OUTPUT_HEADER "${ARGV2}")
+                       LIST(APPEND LEMON_TARGET_outputs 
"${LEMON_${Name}_OUTPUT_HEADER}")
+
+                       ADD_CUSTOM_COMMAND(OUTPUT ${LEMON_TARGET_outputs}
+                               COMMAND ${LEMON_EXECUTABLE} ${ARGV1} ${ARGV3}
+                               COMMAND ${CMAKE_COMMAND} -E rename 
${HEADER_FILE} ${LEMON_${Name}_OUTPUT_HEADER}
+                               COMMAND ${CMAKE_COMMAND} -E rename ${SRC_FILE} 
${ARGV2}
+                               COMMAND ${CMAKE_COMMAND} -E remove ${OUT_FILE}
+                               DEPENDS ${ARGV1}
+                               COMMENT "[LEMON][${Name}] Building parser with 
${LEMON_EXECUTABLE}"
+                               WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
+
+                       # define target variables
+                       SET(LEMON_${Name}_DEFINED TRUE)
+                       SET(LEMON_${Name}_INPUT ${ARGV1})
+                       SET(LEMON_${Name}_OUTPUTS ${LEMON_TARGET_outputs})
+                       SET(LEMON_${Name}_COMPILE_FLAGS ${LEMON_TARGET_cmdopt})
+                       SET(LEMON_${Name}_OUTPUT_SOURCE "${LemonOutput}")
+               ENDIF(NOT ${ARGC} EQUAL 3 AND NOT ${ARGC} EQUAL 4)
+       ENDMACRO(LEMON_TARGET)
+       #
+       #============================================================
+
+ENDIF(LEMON_EXECUTABLE)
+
+INCLUDE(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(LEMON DEFAULT_MSG LEMON_EXECUTABLE)
+
+# FindLEMON.cmake ends here


Property changes on: brlcad/trunk/misc/CMake/FindLEMON.cmake
___________________________________________________________________
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + native

Added: brlcad/trunk/misc/CMake/FindRE2C.cmake
===================================================================
--- brlcad/trunk/misc/CMake/FindRE2C.cmake                              (rev 0)
+++ brlcad/trunk/misc/CMake/FindRE2C.cmake      2011-08-23 14:59:41 UTC (rev 
46333)
@@ -0,0 +1,143 @@
+# - Find re2c executable and provides a macro to generate custom build rules
+#
+# The module defines the following variables:
+#  RE2C_FOUND - true is re2c executable is found
+#  RE2C_EXECUTABLE - the path to the re2c executable
+#
+# If re2c is found on the system, the module provides the macro:
+#  RE2C_TARGET(Name RE2CInput RE2COutput [COMPILE_FLAGS <string>])
+# which creates a custom command  to generate the <RE2COutput> file from
+# the <RE2CInput> file.  If  COMPILE_FLAGS option is specified, the next
+# parameter is added to the re2c  command line. Name is an alias used to
+# get  details of  this custom  command.  Indeed the  macro defines  the
+# following variables:
+#  RE2C_${Name}_DEFINED - true is the macro ran successfully
+#  RE2C_${Name}_OUTPUTS - the source file generated by the custom rule, an
+#  alias for RE2COutput
+#  RE2C_${Name}_INPUT - the re2c source file, an alias for ${RE2CInput}
+#
+# RE2C scanners oftenly use tokens  defined by Lemon: the code generated
+# by RE2C  depends of the header  generated by Lemon.   This module also
+# defines a macro:
+#  ADD_RE2C_YACC_DEPENDENCY(RE2CTarget LemonTarget)
+# which  adds the  required dependency  between a  scanner and  a parser
+# where  <RE2CTarget>  and <LemonTarget>  are  the  first parameters  of
+# respectively RE2C_TARGET and YACC_TARGET macros.
+#
+#  ====================================================================
+#  Example:
+#
+#   find_package(YACC)
+#   find_package(RE2C)
+#
+#   YACC_TARGET(MyParser parser.y ${CMAKE_CURRENT_BINARY_DIR}/parser.cpp
+#   RE2C_TARGET(MyScanner scanner.re  ${CMAKE_CURRENT_BIANRY_DIR}/scanner.cpp)
+#   ADD_RE2C_YACC_DEPENDENCY(MyScanner MyParser)
+#
+#   include_directories(${CMAKE_CURRENT_BINARY_DIR})
+#   add_executable(Foo
+#      Foo.cc
+#      ${YACC_MyParser_OUTPUTS}
+#      ${RE2C_MyScanner_OUTPUTS}
+#   )
+#  ====================================================================
+#
+#=============================================================================
+# Copyright 2010 United States Government as represented by
+#                the U.S. Army Research Laboratory.
+# Copyright 2009 Kitware, Inc.
+# Copyright 2006 Tristan Carel
+# All rights reserved.
+# 
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#  
+# * Redistributions of source code must retain the above copyright
+#   notice, this list of conditions and the following disclaimer.
+# 
+# * Redistributions in binary form must reproduce the above copyright
+#   notice, this list of conditions and the following disclaimer in the
+#   documentation and/or other materials provided with the distribution.
+# 
+# * The names of the authors may not be used to endorse or promote
+#   products derived from this software without specific prior written
+#   permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#=============================================================================
+
+FIND_PROGRAM(RE2C_EXECUTABLE re2c DOC "path to the re2c executable")
+MARK_AS_ADVANCED(RE2C_EXECUTABLE)
+
+IF(RE2C_EXECUTABLE)
+
+  #============================================================
+  # RE2C_TARGET (public macro)
+  #============================================================
+  #
+  MACRO(RE2C_TARGET Name Input Output)
+    SET(RE2C_TARGET_usage "RE2C_TARGET(<Name> <Input> <Output> [COMPILE_FLAGS 
<string>]")
+    IF(${ARGC} GREATER 3)
+      IF(${ARGC} EQUAL 5)
+        IF("${ARGV3}" STREQUAL "COMPILE_FLAGS")
+          SET(RE2C_EXECUTABLE_opts  "${ARGV4}")
+          SEPARATE_ARGUMENTS(RE2C_EXECUTABLE_opts)
+        ELSE()
+          MESSAGE(SEND_ERROR ${RE2C_TARGET_usage})
+        ENDIF()
+      ELSE()
+        MESSAGE(SEND_ERROR ${RE2C_TARGET_usage})
+      ENDIF()
+    ENDIF()
+
+    ADD_CUSTOM_COMMAND(OUTPUT ${Output}
+      COMMAND ${RE2C_EXECUTABLE}
+      ARGS ${RE2C_EXECUTABLE_opts} -o${Output} ${Input}
+      DEPENDS ${Input}
+               COMMENT "[RE2C][${Name}] Building scanner with 
${RE2C_EXECUTABLE}"
+      WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
+
+    SET(RE2C_${Name}_DEFINED TRUE)
+    SET(RE2C_${Name}_OUTPUTS ${Output})
+    SET(RE2C_${Name}_INPUT ${Input})
+    SET(RE2C_${Name}_COMPILE_FLAGS ${RE2C_EXECUTABLE_opts})
+  ENDMACRO(RE2C_TARGET)
+  #============================================================
+
+
+  #============================================================
+  # ADD_RE2C_LEMON_DEPENDENCY (public macro)
+  #============================================================
+  #
+  MACRO(ADD_RE2C_LEMON_DEPENDENCY RE2CTarget LemonTarget)
+
+         IF(NOT RE2C_${RE2CTarget}_OUTPUTS)
+                 MESSAGE(SEND_ERROR "RE2C target `${RE2CTarget}' does not 
exists.")
+    ENDIF()
+
+    IF(NOT LEMON_${LemonTarget}_OUTPUT_HEADER)
+      MESSAGE(SEND_ERROR "Lemon target `${LemonTarget}' does not exists.")
+    ENDIF()
+
+        SET_SOURCE_FILES_PROPERTIES(${RE2C_${RE2CTarget}_OUTPUTS}
+      PROPERTIES OBJECT_DEPENDS ${LEMON_${LemonTarget}_OUTPUT_HEADER})
+  ENDMACRO(ADD_RE2C_LEMON_DEPENDENCY)
+  #============================================================
+
+ENDIF(RE2C_EXECUTABLE)
+
+INCLUDE(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(RE2C DEFAULT_MSG RE2C_EXECUTABLE)
+
+# FindRE2C.cmake ends here


Property changes on: brlcad/trunk/misc/CMake/FindRE2C.cmake
___________________________________________________________________
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + native

Modified: brlcad/trunk/misc/CMake/ThirdParty.cmake
===================================================================
--- brlcad/trunk/misc/CMake/ThirdParty.cmake    2011-08-23 14:40:26 UTC (rev 
46332)
+++ brlcad/trunk/misc/CMake/ThirdParty.cmake    2011-08-23 14:59:41 UTC (rev 
46333)
@@ -76,4 +76,65 @@
        MARK_AS_ADVANCED(${upper}_INCLUDE_DIR)
 ENDMACRO(THIRD_PARTY)
 
+#-----------------------------------------------------------------------------
+MACRO(THIRD_PARTY_EXECUTABLE lower dir)
+       STRING(TOUPPER ${lower} upper)
+       BUNDLE_OPTION(${CMAKE_PROJECT_NAME}_${upper} "")
+       FOREACH(extraarg ${ARGN})
+               IF(extraarg STREQUAL "NOSYS")
+                       IF(${CMAKE_PROJECT_NAME}_${upper} STREQUAL "AUTO (S)")
+                               SET(${CMAKE_PROJECT_NAME}_${upper} "AUTO" CACHE 
STRING "NOSYS passed - striped system flag from AUTO" FORCE)
+                       ENDIF(${CMAKE_PROJECT_NAME}_${upper} STREQUAL "AUTO 
(S)")
+               ENDIF(extraarg STREQUAL "NOSYS")
+       ENDFOREACH(extraarg ${ARGN})
+       # Main search logic
+       IF(${CMAKE_PROJECT_NAME}_${upper} STREQUAL "BUNDLED" OR 
${CMAKE_PROJECT_NAME}_${upper} STREQUAL "AUTO (B)")
+               SET(${CMAKE_PROJECT_NAME}_${upper}_BUILD ON)
+               SET(${upper}_EXECUTABLE "${lower}" CACHE STRING "set by 
THIRD_PARTY macro" FORCE)
+       ELSE(${CMAKE_PROJECT_NAME}_${upper} STREQUAL "BUNDLED" OR 
${CMAKE_PROJECT_NAME}_${upper} STREQUAL "AUTO (B)")
+               SET(${CMAKE_PROJECT_NAME}_${upper}_BUILD OFF)
+               # 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(${upper}_FOUND_STATUS ${${upper}_FOUND})
+               # Initialize (or rather, uninitialize) variables in preparation 
for search
+               SET(${upper}_FOUND "${upper}-NOTFOUND" CACHE STRING 
"${upper}_FOUND" FORCE)
+               MARK_AS_ADVANCED(${upper}_FOUND)
+               SET(${upper}_EXECUTABLE "${upper}-NOTFOUND" CACHE STRING 
"${upper}_EXECUTABLE" FORCE)
+               # Be quiet if we're doing this over
+               IF("${${upper}_FOUND_STATUS}" MATCHES "${upper}-NOTFOUND")
+                       SET(${upper}_FIND_QUIETLY TRUE)
+               ENDIF("${${upper}_FOUND_STATUS}" MATCHES "${upper}-NOTFOUND")
+               # Include the Find module for the library in question
+               IF(EXISTS ${${CMAKE_PROJECT_NAME}_CMAKE_DIR}/Find${upper}.cmake)
+                       
INCLUDE(${${CMAKE_PROJECT_NAME}_CMAKE_DIR}/Find${upper}.cmake)
+               ELSE(EXISTS 
${${CMAKE_PROJECT_NAME}_CMAKE_DIR}/Find${upper}.cmake)
+                       INCLUDE(${CMAKE_ROOT}/Modules/Find${upper}.cmake)
+               ENDIF(EXISTS 
${${CMAKE_PROJECT_NAME}_CMAKE_DIR}/Find${upper}.cmake)
+               # If we didn't find it, and options allow it, enable the local 
copy
+               IF(NOT ${upper}_FOUND AND NOT ${CMAKE_PROJECT_NAME}_${upper} 
STREQUAL "SYSTEM" AND NOT ${CMAKE_PROJECT_NAME}_${upper} STREQUAL "AUTO (S)")
+                       SET(${CMAKE_PROJECT_NAME}_${upper}_BUILD ON)
+                       SET(${upper}_EXECUTABLE "${lower}" CACHE STRING "set by 
THIRD_PARTY macro" FORCE)
+               ELSE(NOT ${upper}_FOUND AND NOT ${CMAKE_PROJECT_NAME}_${upper} 
STREQUAL "SYSTEM" AND NOT ${CMAKE_PROJECT_NAME}_${upper} STREQUAL "AUTO (S)")
+                       SET(${upper}_FOUND "TRUE" CACHE STRING "${upper}_FOUND" 
FORCE)
+               ENDIF(NOT ${upper}_FOUND AND NOT ${CMAKE_PROJECT_NAME}_${upper} 
STREQUAL "SYSTEM" AND NOT ${CMAKE_PROJECT_NAME}_${upper} STREQUAL "AUTO (S)")
+               IF(${upper}_FOUND)
+                       IF("${${upper}_FOUND_STATUS}" MATCHES 
"${upper}-NOTFOUND")
+                               MESSAGE("Reconfiguring to use system ${upper}")
+                       ENDIF("${${upper}_FOUND_STATUS}" MATCHES 
"${upper}-NOTFOUND")
+               ENDIF(${upper}_FOUND)
+       ENDIF(${CMAKE_PROJECT_NAME}_${upper} STREQUAL "BUNDLED" OR 
${CMAKE_PROJECT_NAME}_${upper} STREQUAL "AUTO (B)")
+       IF(${CMAKE_PROJECT_NAME}_${upper}_BUILD)
+               ADD_SUBDIRECTORY(${dir})
+               IF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${dir}.dist)
+                       FILE(STRINGS ${CMAKE_CURRENT_SOURCE_DIR}/${dir}.dist 
${dir}_ignore_files)
+                       DISTCHECK_IGNORE(${dir} ${dir}_ignore_files)
+               ELSE(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${dir}.dist)
+                       MESSAGE("Local build, but file 
${CMAKE_CURRENT_SOURCE_DIR}/${dir}.dist not found")
+               ENDIF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${dir}.dist)
+       ELSE(${CMAKE_PROJECT_NAME}_${upper}_BUILD)
+               DISTCHECK_IGNORE_ITEM(${dir})
+       ENDIF(${CMAKE_PROJECT_NAME}_${upper}_BUILD)
+       MARK_AS_ADVANCED(${upper}_EXECUTABLE)
+ENDMACRO(THIRD_PARTY_EXECUTABLE)
 
+

Modified: brlcad/trunk/src/other/CMakeLists.txt
===================================================================
--- brlcad/trunk/src/other/CMakeLists.txt       2011-08-23 14:40:26 UTC (rev 
46332)
+++ brlcad/trunk/src/other/CMakeLists.txt       2011-08-23 14:59:41 UTC (rev 
46333)
@@ -41,12 +41,8 @@
 
#---------------------------------------------------------------------------------
 # Local Copies of Tools
 
#---------------------------------------------------------------------------------
-OPTION(BUILD_LOCAL_TOOLS "Build local copies of re2c and lemon" OFF)
-MARK_AS_ADVANCED(BUILD_LOCAL_TOOLS)
-IF(BUILD_LOCAL_TOOLS)
-ENDIF(BUILD_LOCAL_TOOLS)
-DISTCHECK_IGNORE_ITEM(re2c)
-DISTCHECK_IGNORE_ITEM(lemon)
+THIRD_PARTY_EXECUTABLE(re2c re2c)
+THIRD_PARTY_EXECUTABLE(lemon lemon)
 
 # Ignore the boost subdir - it's only used for the boost headers and is not
 # compiled


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

------------------------------------------------------------------------------
Get a FREE DOWNLOAD! and learn more about uberSVN rich system, 
user administration capabilities and model configuration. Take 
the hassle out of deploying and managing Subversion and the 
tools developers use with it. http://p.sf.net/sfu/wandisco-d2d-2
_______________________________________________
BRL-CAD Source Commits mailing list
brlcad-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/brlcad-commits

Reply via email to