@@ -47,6 +47,7 @@ UNIFY_ENVVARS_AND_CACHE(ICU_LIBRARY_DIR)
4747UNIFY_ENVVARS_AND_CACHE (OPENCOLLADA_INCLUDE_DIR )
4848UNIFY_ENVVARS_AND_CACHE (OPENCOLLADA_LIBRARY_DIR )
4949UNIFY_ENVVARS_AND_CACHE (PCRE_LIBRARY_DIR )
50+ UNIFY_ENVVARS_AND_CACHE (PYTHON_EXECUTABLE )
5051
5152# Find Boost
5253IF (MSVC )
@@ -274,25 +275,78 @@ if(NOT WIN32)
274275 INCLUDE_DIRECTORIES (${INCLUDE_DIRECTORIES} /usr/inc /usr/local/inc /usr/local/include/oce )
275276endif ()
276277
277- IF (USE_IFC4)
278- ADD_DEFINITIONS (-DUSE_IFC4 )
279- SET (IFC_RELEASE_NOT_USED "2x3" )
280- ELSE ()
281- ADD_DEFINITIONS (-DUSE_IFC2x3 ) # TODO Make all caps? i.e. USE_IFC2X3
282- SET (IFC_RELEASE_NOT_USED "4" )
283- ENDIF ()
278+ function (files_for_ifc_version IFC_VERSION RESULT_NAME )
279+ set (IFC_PARSE_DIR ${CMAKE_CURRENT_SOURCE_DIR} /../src/ifcparse)
280+ set (${RESULT_NAME}
281+ ${IFC_PARSE_DIR} /Ifc${IFC_VERSION} .h
282+ ${IFC_PARSE_DIR} /Ifc${IFC_VERSION} enum.h
283+ ${IFC_PARSE_DIR} /Ifc${IFC_VERSION} -latebound.h
284+ ${IFC_PARSE_DIR} /Ifc${IFC_VERSION} .cpp
285+ ${IFC_PARSE_DIR} /Ifc${IFC_VERSION} -latebound.cpp
286+ PARENT_SCOPE
287+ )
288+ endfunction ()
289+
290+ if (COMPILE_SCHEMA)
291+ set (IFC_RELEASE_NOT_USED "2x3" "4" )
292+
293+ if (PYTHON_EXECUTABLE)
294+ set (PYTHON_EXECUTABLE_USED ${PYTHON_EXECUTABLE} )
295+ else ()
296+ set (PYTHON_EXECUTABLE_USED "python" )
297+ endif ()
298+
299+ # Install pyparsing if necessary
300+ execute_process (COMMAND ${PYTHON_EXECUTABLE_USED} -m pip "list" OUTPUT_VARIABLE PYTHON_PACKAGE_LIST )
301+ string (FIND "${PYTHON_PACKAGE_LIST} " pyparsing PYPARSING_FOUND)
302+ if ("${PYPARSING_FOUND} " STREQUAL "-1" )
303+ message (STATUS "Installing pyparsing" )
304+ execute_process (COMMAND ${PYTHON_EXECUTABLE_USED} -m pip "install" --user pyparsing )
305+ else ()
306+ message (STATUS "Python interpreter with pyparsing found" )
307+ endif ()
308+
309+ # Bootstrap the parser
310+ message (STATUS "Compiling schema, this will take a while..." )
311+ execute_process (COMMAND ${PYTHON_EXECUTABLE_USED} bootstrap.py express.bnf
312+ WORKING_DIRECTORY ../src/ifcexpressparser
313+ OUTPUT_FILE express_parser.py )
314+
315+ # Generate code
316+ execute_process (COMMAND ${PYTHON_EXECUTABLE_USED} ../ifcexpressparser/express_parser.py ../../${COMPILE_SCHEMA}
317+ WORKING_DIRECTORY ../src/ifcparse
318+ OUTPUT_VARIABLE COMPILED_SCHEMA_NAME )
319+
320+ # Prevent the schema that had just been compiled from being excluded
321+ if (${COMPILED_SCHEMA_NAME} STREQUAL "IFC2X3" )
322+ list (REMOVE_ITEM IFC_RELEASE_NOT_USED "2x3" )
323+ elseif (${COMPILED_SCHEMA_NAME} STREQUAL "IFC4" )
324+ list (REMOVE_ITEM IFC_RELEASE_NOT_USED "4" )
325+ endif ()
326+ else ()
327+ if (USE_IFC4)
328+ add_definitions (-DUSE_IFC4 )
329+ set (IFC_RELEASE_NOT_USED "2x3" )
330+ else ()
331+ add_definitions (-DUSE_IFC2x3 ) # TODO Make all caps? i.e. USE_IFC2X3
332+ set (IFC_RELEASE_NOT_USED "4" )
333+ endif ()
334+ endif ()
284335
285336# IfcParse
286337file (GLOB CPP_FILES ../src/ifcparse/*.cpp )
287338file (GLOB H_FILES ../src/ifcparse/*.h )
288339set (SOURCE_FILES ${CPP_FILES} ${H_FILES} )
289- # Remove sources specific to an IFC release we are not using
290- list (REMOVE_ITEM SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR} /../src/ifcparse/Ifc${IFC_RELEASE_NOT_USED} .h)
291- list (REMOVE_ITEM SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR} /../src/ifcparse/Ifc${IFC_RELEASE_NOT_USED} enum.h)
292- list (REMOVE_ITEM SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR} /../src/ifcparse/Ifc${IFC_RELEASE_NOT_USED} -latebound.h)
293- list (REMOVE_ITEM SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR} /../src/ifcparse/Ifc${IFC_RELEASE_NOT_USED} .cpp)
294- list (REMOVE_ITEM SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR} /../src/ifcparse/Ifc${IFC_RELEASE_NOT_USED} -latebound.cpp)
340+
341+ foreach (IFC_RELEASE ${IFC_RELEASE_NOT_USED} )
342+ files_for_ifc_version (${IFC_RELEASE} SOURCE_FILES_NOT_USED )
343+ foreach (SOURCE_FILE ${SOURCE_FILES_NOT_USED} )
344+ list (REMOVE_ITEM SOURCE_FILES ${SOURCE_FILE} )
345+ endforeach ()
346+ endforeach ()
347+
295348ADD_LIBRARY (IfcParse STATIC ${SOURCE_FILES} )
349+
296350IF (UNICODE_SUPPORT)
297351 TARGET_LINK_LIBRARIES (IfcParse ${ICU_LIBRARIES} )
298352ENDIF ()
0 commit comments