summaryrefslogtreecommitdiffstats
path: root/src/pybind/mgr/dashboard/frontend/CMakeLists.txt
blob: 2527ef23e85e5cd2d83e38ef475e23a96fd11431 (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
142
143
144
145
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 .*)$"
      ". ${mgr-dashboard-nodeenv-dir}/bin/activate && \\1 && deactivate"
      command ${command})
  else()
    string(REGEX REPLACE
      "^([^ ]=[^ ] )*npm (.*)$"
      "\\1${NPM_EXECUTABLE} \\2"
      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})
  set_property(DIRECTORY APPEND
    PROPERTY ADDITIONAL_MAKE_CLEAN_FILES "${NC_OUTPUT}")
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()
  set(npm_config_python ${MGR_PYTHON_EXECUTABLE})
  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 node_modules
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
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=18.17.0
    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 cache=${mgr-dashboard-nodeenv-dir}/.npm
    ${npm_registry_opts})
  add_custom_target(mgr-dashboard-frontend-deps
    DEPENDS node_modules mgr-dashboard-nodeenv
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
endif(WITH_SYSTEM_NPM)

add_npm_command(
  OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/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 package.json
  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
  COMMENT "dashboard frontend dependencies are being installed"
  ${nodeenv})

# Glob some frontend files.
file(
  GLOB_RECURSE frontend_src
  RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
  src/*.ts
  src/*.html)

# these files are generated during build
list(REMOVE_ITEM frontend_src
  src/environments/environment.prod.ts
  src/environments/environment.ts)

execute_process(
    COMMAND bash -c "jq -r .config.locale ${CMAKE_CURRENT_SOURCE_DIR}/package.json"
    OUTPUT_VARIABLE default_lang
    OUTPUT_STRIP_TRAILING_WHITESPACE)

set(frontend_dist_dir "${CMAKE_CURRENT_BINARY_DIR}/dist")
set(npm_args "--output-path ${frontend_dist_dir}")
if(NOT CMAKE_BUILD_TYPE STREQUAL Debug)
  string(APPEND npm_args " --configuration=production --progress=false")
else()
  string(APPEND npm_args " --progress=false")
endif()

add_npm_command(
  OUTPUT "${frontend_dist_dir}"
  COMMAND DASHBOARD_FRONTEND_LANGS="${DASHBOARD_FRONTEND_LANGS}" npm run build:localize -- ${npm_args}
  DEPENDS ${frontend_src} node_modules
  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
  COMMENT "dashboard frontend is being created"
  ${nodeenv})

add_custom_command(
  OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/package.json
  DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/package.json
  COMMAND ${CMAKE_COMMAND} -E copy_if_different
    ${CMAKE_CURRENT_SOURCE_DIR}/package.json
    ${CMAKE_CURRENT_BINARY_DIR}/package.json)

add_custom_target(mgr-dashboard-frontend-build
  ALL
  DEPENDS
    ${frontend_dist_dir}
    ${CMAKE_CURRENT_BINARY_DIR}/package.json
    mgr-dashboard-frontend-deps
  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})

add_dependencies(tests mgr-dashboard-frontend-build)

install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/dist
  DESTINATION ${CEPH_INSTALL_DATADIR}/mgr/dashboard/frontend)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/package.json
  DESTINATION ${CEPH_INSTALL_DATADIR}/mgr/dashboard/frontend)