blob: 7cf12f164e53bd3f1f1a3079f3f2a5859f4ac85b (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
# 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}/compiler.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} ")
endmacro(require)
file(APPEND "${DEPS_FILE}" "${SUCC} ${SUCC} ")
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_compiler_directory DIR)
string(TOUPPER ${DIR} PREFIX)
option(BUILD_COMPILER_${PREFIX} "Build compiler/${dir}" ON)
set(BUILD_WHITELIST "" CACHE STRING "Set modules to be built")
if(NOT BUILD_WHITELIST STREQUAL "")
set(ENABLE OFF)
set(CURRENT_DIR ${DIR})
foreach(ACCEPTED_DIR IN ITEMS ${BUILD_WHITELIST})
if(ACCEPTED_DIR STREQUAL CURRENT_DIR)
set(ENABLE ON)
endif()
endforeach(ACCEPTED_DIR)
else()
set(ENABLE ${BUILD_COMPILER_${PREFIX}})
endif()
# This line prevents some errors in this CMakeLists.txt
if(NOT DEFINED ENABLE)
message(FATAL_ERROR "Undefined ENABLE! Please check CMakeLists.txt")
endif()
if(ENABLE)
message(STATUS "Configure ${PREFIX}")
add_subdirectory(${DIR})
message(STATUS "Configure ${PREFIX} - Done")
endif(ENABLE)
endfunction(add_compiler_directory)
function(add_compiler_directories)
get_project_build_order(PROJECT_DIRS)
foreach(PROJECT_DIR IN ITEMS ${PROJECT_DIRS})
add_compiler_directory(${PROJECT_DIR})
endforeach(PROJECT_DIR)
endfunction(add_compiler_directories)
add_compiler_directories()
|