+# TODO Validate the argument of "requires"
+function(get_project_build_order VAR)
+ # This file will describe the dependencies among projects
+ set(DEPS_FILE "${CMAKE_CURRENT_BINARY_DIR}/contrib.deps")
+
+ # Remove .deps file
+ file(REMOVE "${DEPS_FILE}")
+
+ # Let's create .deps file
+ list_subdirectories(PROJECT_DIRS)
+
+ foreach(PROJECT_DIR IN ITEMS ${PROJECT_DIRS})
+ set(SUCC "${PROJECT_DIR}")
+ set(REQUIRES_FILE "${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_DIR}/requires.cmake")
+
+ macro(require PRED)
+ file(APPEND "${DEPS_FILE}" "${PRED} ${SUCC}\n")
+ endmacro(require)
+
+ file(APPEND "${DEPS_FILE}" "${SUCC} ${SUCC}\n")
+ if(EXISTS "${REQUIRES_FILE}")
+ include(${REQUIRES_FILE})
+ endif(EXISTS "${REQUIRES_FILE}")
+ endforeach(PROJECT_DIR)
+
+ # NOTE "tsort" is a part of the POSIX.1 standard.
+ #
+ # Reference: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/tsort.html
+ execute_process(COMMAND tsort "${DEPS_FILE}"
+ OUTPUT_VARIABLE ORDER
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+ # Remove newline characters
+ # TODO Check which one (UNIX_COMMAND or WINDOWS_COMMAND) is correct
+ separate_arguments(ORDER UNIX_COMMAND ${ORDER})
+
+ set(${VAR} "${ORDER}" PARENT_SCOPE)
+endfunction(get_project_build_order)
+
function(add_nncc_contrib_directory DIR)
string(TOUPPER ${DIR} PREFIX)
endfunction(add_nncc_contrib_directory)
function(add_nncc_contrib_directories)
- # NOTE Add caffegen, nnkit, ann and tflchef before enco as enco's test framework depends on these projects
- add_nncc_contrib_directory(caffegen)
- add_nncc_contrib_directory(nnkit)
- add_nncc_contrib_directory(ann)
- add_nncc_contrib_directory(tflchef) # tflchef uses nni of nnkit as a tool
-
- list_subdirectories(PROJECT_DIRS EXCLUDES caffegen nnkit ann tflchef)
+ get_project_build_order(PROJECT_DIRS)
foreach(PROJECT_DIR IN ITEMS ${PROJECT_DIRS})
add_nncc_contrib_directory(${PROJECT_DIR})