summaryrefslogtreecommitdiffstats
path: root/src/pybind/mgr/dashboard/CMakeLists.txt
blob: 0c8d46d65ee99499920bcbd61cdbc04868ff4518 (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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
include(CMakeParseArguments)
function(add_npm_command)
  set(options NODEENV)
  set(single_kw OUTPUT COMMENT WORKING_DIRECTORY)
  set(multi_kw COMMAND DEPENDS)
  cmake_parse_arguments(NC "${options}" "${single_kw}" "${multi_kw}" ${ARGN})
  string(REPLACE ";" " " command "${NC_COMMAND}")
  if(NC_NODEENV)
    string(REGEX REPLACE "^(.*(npm|npx) .*)$" ". ${mgr-dashboard-nodeenv-dir}/bin/activate && \\1 && deactivate" command ${command})
  endif()
  string(REPLACE " " ";" command "${command}")
  add_custom_command(
    OUTPUT "${NC_OUTPUT}"
    COMMAND ${command}
    DEPENDS ${NC_DEPENDS}
    WORKING_DIRECTORY "${NC_WORKING_DIRECTORY}"
    COMMENT ${NC_COMMENT})
endfunction(add_npm_command)

function(add_npm_options)
  set(commands)
  cmake_parse_arguments(NC "" "NODEENV_DIR;TARGET" "OPTION" ${ARGN})
  foreach(opt ${NC_OPTION})
    string(REPLACE "=" ";" opt ${opt})
    list(GET opt 0 key)
    list(GET opt 1 value)
    list(APPEND commands
      COMMAND
      . ${NC_NODEENV_DIR}/bin/activate &&
      npm config set ${key} ${value} --userconfig ${NC_NODEENV_DIR}/.npmrc &&
      deactivate)
  endforeach()
  add_custom_target(${NC_TARGET}
    ${commands}
    DEPENDS ${NC_NODEENV_DIR}/bin/npm
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
endfunction(add_npm_options)

if(WITH_SYSTEM_NPM)
  set(mgr-dashboard-nodeenv-dir )
  set(nodeenv "")
  add_custom_target(mgr-dashboard-frontend-deps
    DEPENDS frontend/node_modules
    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/src/pybind/mgr/dashboard/frontend
  )
else(WITH_SYSTEM_NPM)
  set(mgr-dashboard-nodeenv-dir ${CMAKE_CURRENT_BINARY_DIR}/node-env)
  set(nodeenv NODEENV)
  set(mgr-dashboard-userconfig --userconfig ${mgr-dashboard-nodeenv-dir}/.npmrc)
  if(DEFINED ENV{NODE_MIRROR})
    set(node_mirror_opt "--mirror=$ENV{NODE_MIRROR}")
  endif()
  add_custom_command(
    OUTPUT "${mgr-dashboard-nodeenv-dir}/bin/npm"
    COMMAND ${CMAKE_SOURCE_DIR}/src/tools/setup-virtualenv.sh --python=${MGR_PYTHON_EXECUTABLE} ${mgr-dashboard-nodeenv-dir}
    COMMAND ${mgr-dashboard-nodeenv-dir}/bin/pip install nodeenv
    COMMAND ${mgr-dashboard-nodeenv-dir}/bin/nodeenv --verbose ${node_mirror_opt} -p --node=12.18.2
    COMMAND mkdir ${mgr-dashboard-nodeenv-dir}/.npm
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
    COMMENT "dashboard nodeenv is being installed"
    )
  if(DEFINED ENV{NPM_REGISTRY})
    set(npm_registry_opts "OPTION" "registry=$ENV{NPM_REGISTRY}")
  endif()
  add_npm_options(
    NODEENV_DIR ${mgr-dashboard-nodeenv-dir}
    TARGET mgr-dashboard-nodeenv
    OPTION python=${MGR_PYTHON_EXECUTABLE}
    OPTION cache=${mgr-dashboard-nodeenv-dir}/.npm
    ${npm_registry_opts})
  add_custom_target(mgr-dashboard-frontend-deps
    DEPENDS frontend/node_modules mgr-dashboard-nodeenv
    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/src/pybind/mgr/dashboard/frontend
  )
endif(WITH_SYSTEM_NPM)

add_npm_command(
  OUTPUT "${CMAKE_SOURCE_DIR}/src/pybind/mgr/dashboard/frontend/node_modules"
  COMMAND CYPRESS_CACHE_FOLDER=${CMAKE_SOURCE_DIR}/build/src/pybind/mgr/dashboard/cypress NG_CLI_ANALYTICS=false npm ci -f ${mgr-dashboard-userconfig}
  DEPENDS frontend/package.json
  WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/src/pybind/mgr/dashboard/frontend
  COMMENT "dashboard frontend dependencies are being installed"
  ${nodeenv}
)

# Glob some frontend files. With CMake 3.6, this can be simplified
# to *.ts *.html. Just add:
# list(FILTER frontend_src INCLUDE REGEX "frontend/src")
file(
  GLOB_RECURSE frontend_src
  frontend/src/*.ts
  frontend/src/*.html
  frontend/src/*/*.ts
  frontend/src/*/*.html
  frontend/src/*/*/*.ts
  frontend/src/*/*/*.html
  frontend/src/*/*/*/*.ts
  frontend/src/*/*/*/*.html
  frontend/src/*/*/*/*/*.ts
  frontend/src/*/*/*/*/*.html
  frontend/src/*/*/*/*/*/*.ts
  frontend/src/*/*/*/*/*/*.html)

# these files are generated during build
list(REMOVE_ITEM frontend_src
  ${CMAKE_SOURCE_DIR}/src/pybind/mgr/dashboard/frontend/src/environments/environment.prod.ts
  ${CMAKE_SOURCE_DIR}/src/pybind/mgr/dashboard/frontend/src/environments/environment.ts)

execute_process(
    COMMAND bash -c "jq -r .config.locale ${CMAKE_SOURCE_DIR}/src/pybind/mgr/dashboard/frontend/package.json"
    OUTPUT_VARIABLE default_lang
    OUTPUT_STRIP_TRAILING_WHITESPACE)

if(NOT CMAKE_BUILD_TYPE STREQUAL Debug)
  set(npm_args "--prod --progress=false")
else()
  set(npm_args "--progress=false")
endif()

add_npm_command(
  OUTPUT "${CMAKE_SOURCE_DIR}/src/pybind/mgr/dashboard/frontend/dist"
  COMMAND DASHBOARD_FRONTEND_LANGS="${DASHBOARD_FRONTEND_LANGS}" npm run build:localize -- ${npm_args}
  DEPENDS ${frontend_src} frontend/node_modules
  WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/src/pybind/mgr/dashboard/frontend
  COMMENT "dashboard frontend is being created"
  ${nodeenv}
)
add_custom_target(mgr-dashboard-frontend-build
  ALL
  DEPENDS frontend/dist mgr-dashboard-frontend-deps
  WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/src/pybind/mgr/dashboard/frontend)

add_dependencies(tests mgr-dashboard-frontend-build)

if(WITH_TESTS)
  include(AddCephTest)
  add_tox_test(mgr-dashboard-py3 TOX_ENVS py3)
  add_tox_test(mgr-dashboard-lint TOX_ENVS lint)
  add_tox_test(mgr-dashboard-check TOX_ENVS check)
  add_tox_test(mgr-dashboard-openapi TOX_ENVS openapi-check)
endif()