Revision: 65859
          http://sourceforge.net/p/brlcad/code/65859
Author:   starseeker
Date:     2015-08-09 15:42:35 +0000 (Sun, 09 Aug 2015)
Log Message:
-----------
Make a stab at cleaning up a problem where we were using outputs from one 
add_custom_command in multiple build targets.  Per the CMake documentation this 
isn't safe for parallel builds.  Need to do a systematic check through the 
build logic to see if we're doing this anywhere else.  These changes need 
testing in heavily parallel environments to see if they are adequate - for 
example, it may be necessary to assign the include directories for the obj 
targets on a per target basis in stead of using the global include_directories 
command to make sure one of the targets doesn't end up trying to use a header 
from the other directory (we could have unique header names too - I'm not sure 
which is the best way to go with that yet.)

Modified Paths:
--------------
    brlcad/trunk/src/conv/step/CMakeLists.txt
    brlcad/trunk/src/conv/step/g-step/CMakeLists.txt
    brlcad/trunk/src/libgcv/CMakeLists.txt

Modified: brlcad/trunk/src/conv/step/CMakeLists.txt
===================================================================
--- brlcad/trunk/src/conv/step/CMakeLists.txt   2015-08-07 22:17:59 UTC (rev 
65858)
+++ brlcad/trunk/src/conv/step/CMakeLists.txt   2015-08-09 15:42:35 UTC (rev 
65859)
@@ -30,7 +30,7 @@
 
   # Because SCHEMA_OUT_DIR is the working directory for exp2cxx, it must be
   # created at configure time and be present when exp2cxx is run
-  set(SCHEMA_OUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/${SCHEMA_NAME})
+  set(SCHEMA_OUT_DIR 
${CMAKE_CURRENT_BINARY_DIR}/${SCHEMA_NAME}_${TARGET_SUFFIX})
   make_directory(${SCHEMA_OUT_DIR})
   include_directories(${SCHEMA_OUT_DIR})
   DISTCLEAN(${SCHEMA_OUT_DIR})
@@ -56,10 +56,7 @@
     )
 
   # Define a common custom build target that ensures the exp2cxx outputs
-  # are present.  Do this rather than relying on custom commands in the
-  # subdirectories to avoid multiple build targets trying to run exp2cxx
-  # simultaneously to generate identical inputs (unknown if that is 
problematic)
-  # and to add extra robustness for parallel build target ordering.
+  # are present.
   set(WATCHED_FILES ${EXPRESS_OUTPUT})
   string(REPLACE " " "\\ " WATCHED_FILES "${WATCHED_FILES}")
   set(STAMP_OUT_FILE ${SCHEMA_OUT_DIR}/step_express_${SCHEMA_NAME}.done)

Modified: brlcad/trunk/src/conv/step/g-step/CMakeLists.txt
===================================================================
--- brlcad/trunk/src/conv/step/g-step/CMakeLists.txt    2015-08-07 22:17:59 UTC 
(rev 65858)
+++ brlcad/trunk/src/conv/step/g-step/CMakeLists.txt    2015-08-09 15:42:35 UTC 
(rev 65859)
@@ -74,6 +74,8 @@
   )
 CMAKEFILES(${IGNORE_FILES})
 
+GENERATE_SCHEMA_INPUTS(${STEP_SCHEMA_FILE} list_elements)
+
 set(list_elements_srcs ${express_srcs} list_elements.cpp)
 BRLCAD_ADDEXEC(list_elements "${list_elements_srcs}" "${gstep_LIBS}" NO_STRICT 
NO_INSTALL)
 if(MSVC)

Modified: brlcad/trunk/src/libgcv/CMakeLists.txt
===================================================================
--- brlcad/trunk/src/libgcv/CMakeLists.txt      2015-08-07 22:17:59 UTC (rev 
65858)
+++ brlcad/trunk/src/libgcv/CMakeLists.txt      2015-08-09 15:42:35 UTC (rev 
65859)
@@ -3,15 +3,24 @@
   ${CMAKE_CURRENT_BINARY_DIR}
   )
 
-PERPLEX_TARGET(OBJ_Scanner wfobj/obj_rules.l
-  ${CMAKE_CURRENT_BINARY_DIR}/obj_rules.cpp 
${CMAKE_CURRENT_BINARY_DIR}/obj_scanner.h)
-LEMON_TARGET(OBJ_Parser wfobj/obj_grammar.yy
-  ${CMAKE_CURRENT_BINARY_DIR}/obj_grammar.cpp 
${CMAKE_CURRENT_BINARY_DIR}/obj_grammar.hpp)
-ADD_PERPLEX_LEMON_DEPENDENCY(OBJ_Scanner OBJ_Parser)
+# For parallel safety, need separate names and files for each target.
+# Should probably rework this whole perplex/lemon combo into one macro,
+# since this will be the common pattern.
+macro(GEN_OBJ_SRCS targetname)
+  file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/OBJ_${targetname}_SRCS)
+  include_directories(${CMAKE_CURRENT_BINARY_DIR}/OBJ_${targetname}_SRCS)
+  DISTCLEAN(${CMAKE_CURRENT_BINARY_DIR}/OBJ_${targetname}_SRCS)
+  PERPLEX_TARGET(OBJ_${targetname}_Scanner wfobj/obj_rules.l
+    
${CMAKE_CURRENT_BINARY_DIR}/OBJ_${targetname}_SRCS/obj_${targetname}_rules.cpp 
${CMAKE_CURRENT_BINARY_DIR}/OBJ_${targetname}_SRCS/obj_scanner.h)
+  LEMON_TARGET(OBJ_${targetname}_Parser wfobj/obj_grammar.yy
+    
${CMAKE_CURRENT_BINARY_DIR}/OBJ_${targetname}_SRCS/obj_${targetname}_grammar.cpp
 ${CMAKE_CURRENT_BINARY_DIR}/OBJ_${targetname}_SRCS/obj_grammar.hpp)
+  ADD_PERPLEX_LEMON_DEPENDENCY(OBJ_${targetname}_Scanner 
OBJ_${targetname}_Parser)
+endmacro(GEN_OBJ_SRCS)
 
+GEN_OBJ_SRCS(obj-g)
 set(OBJ_G_SRCS
-  ${CMAKE_CURRENT_BINARY_DIR}/obj_grammar.cpp
-  ${CMAKE_CURRENT_BINARY_DIR}/obj_rules.cpp
+  ${CMAKE_CURRENT_BINARY_DIR}/OBJ_obj-g_SRCS/obj_obj-g_grammar.cpp
+  ${CMAKE_CURRENT_BINARY_DIR}/OBJ_obj-g_SRCS/obj_obj-g_rules.cpp
   wfobj/obj_parser.cpp
   ../conv/obj-g.c
   wfobj/tri_face.c
@@ -41,6 +50,8 @@
   )
 BRLCAD_LIB_INCLUDE_DIRS(gcv GCV_INCLUDE_DIRS "")
 
+
+GEN_OBJ_SRCS(libgcv)
 set(LIBGCV_SOURCES
   bottess.c
   facetize.c
@@ -49,6 +60,8 @@
   region_end_mc.c
   tri_intersect.c
   bot_solidity.c
+  ${CMAKE_CURRENT_BINARY_DIR}/OBJ_libgcv_SRCS/obj_libgcv_grammar.cpp
+  ${CMAKE_CURRENT_BINARY_DIR}/OBJ_libgcv_SRCS/obj_libgcv_rules.cpp
   )
 
 list(APPEND LIBGCV_SOURCES
@@ -63,8 +76,6 @@
   conv/obj/obj_read.c
   wfobj/obj_parser.cpp
   wfobj/tri_face.c
-  ${CMAKE_CURRENT_BINARY_DIR}/obj_grammar.cpp
-  ${CMAKE_CURRENT_BINARY_DIR}/obj_rules.cpp
   )
 
 BRLCAD_ADDLIB(libgcv "${LIBGCV_SOURCES}" "librt;libwdb;libbu")

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


------------------------------------------------------------------------------
_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits

Reply via email to