]> git.proxmox.com Git - ceph.git/blob - ceph/src/pybind/mgr/dashboard/frontend/CMakeLists.txt
cb76722bac1a8fefb107a3e021e77fd529b0b59b
[ceph.git] / ceph / src / pybind / mgr / dashboard / frontend / CMakeLists.txt
1 include(CMakeParseArguments)
2 function(add_npm_command)
3 set(options NODEENV)
4 set(single_kw OUTPUT COMMENT WORKING_DIRECTORY)
5 set(multi_kw COMMAND DEPENDS)
6 cmake_parse_arguments(NC "${options}" "${single_kw}" "${multi_kw}" ${ARGN})
7 string(REPLACE ";" " " command "${NC_COMMAND}")
8 if(NC_NODEENV)
9 string(REGEX REPLACE
10 "^(([^ ]+=[^ ]+ )*npm .*)$"
11 ". ${mgr-dashboard-nodeenv-dir}/bin/activate && \\1 && deactivate"
12 command ${command})
13 else()
14 string(REGEX REPLACE
15 "^([^ ]=[^ ] )*npm (.*)$"
16 "\\1${NPM_EXECUTABLE} \\2"
17 command ${command})
18 endif()
19 string(REPLACE " " ";" command "${command}")
20 add_custom_command(
21 OUTPUT "${NC_OUTPUT}"
22 COMMAND ${command}
23 DEPENDS ${NC_DEPENDS}
24 WORKING_DIRECTORY "${NC_WORKING_DIRECTORY}"
25 COMMENT ${NC_COMMENT})
26 set_property(DIRECTORY APPEND
27 PROPERTY ADDITIONAL_MAKE_CLEAN_FILES "${NC_OUTPUT}")
28 endfunction(add_npm_command)
29
30 function(add_npm_options)
31 set(commands)
32 cmake_parse_arguments(NC "" "NODEENV_DIR;TARGET" "OPTION" ${ARGN})
33 foreach(opt ${NC_OPTION})
34 string(REPLACE "=" ";" opt ${opt})
35 list(GET opt 0 key)
36 list(GET opt 1 value)
37 list(APPEND commands
38 COMMAND
39 . ${NC_NODEENV_DIR}/bin/activate &&
40 npm config set ${key} ${value} --userconfig ${NC_NODEENV_DIR}/.npmrc &&
41 deactivate)
42 endforeach()
43 add_custom_target(${NC_TARGET}
44 ${commands}
45 DEPENDS ${NC_NODEENV_DIR}/bin/npm
46 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
47 endfunction(add_npm_options)
48
49 if(WITH_SYSTEM_NPM)
50 set(mgr-dashboard-nodeenv-dir )
51 set(nodeenv "")
52 add_custom_target(mgr-dashboard-frontend-deps
53 DEPENDS node_modules
54 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
55 else(WITH_SYSTEM_NPM)
56 set(mgr-dashboard-nodeenv-dir ${CMAKE_CURRENT_BINARY_DIR}/node-env)
57 set(nodeenv NODEENV)
58 set(mgr-dashboard-userconfig --userconfig ${mgr-dashboard-nodeenv-dir}/.npmrc)
59 if(DEFINED ENV{NODE_MIRROR})
60 set(node_mirror_opt "--mirror=$ENV{NODE_MIRROR}")
61 endif()
62 add_custom_command(
63 OUTPUT "${mgr-dashboard-nodeenv-dir}/bin/npm"
64 COMMAND ${CMAKE_SOURCE_DIR}/src/tools/setup-virtualenv.sh --python=${MGR_PYTHON_EXECUTABLE} ${mgr-dashboard-nodeenv-dir}
65 COMMAND ${mgr-dashboard-nodeenv-dir}/bin/pip install nodeenv
66 COMMAND ${mgr-dashboard-nodeenv-dir}/bin/nodeenv --verbose ${node_mirror_opt} -p --node=12.18.2
67 COMMAND mkdir ${mgr-dashboard-nodeenv-dir}/.npm
68 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
69 COMMENT "dashboard nodeenv is being installed")
70 if(DEFINED ENV{NPM_REGISTRY})
71 set(npm_registry_opts "OPTION" "registry=$ENV{NPM_REGISTRY}")
72 endif()
73 add_npm_options(
74 NODEENV_DIR ${mgr-dashboard-nodeenv-dir}
75 TARGET mgr-dashboard-nodeenv
76 OPTION python=${MGR_PYTHON_EXECUTABLE}
77 OPTION cache=${mgr-dashboard-nodeenv-dir}/.npm
78 ${npm_registry_opts})
79 add_custom_target(mgr-dashboard-frontend-deps
80 DEPENDS node_modules mgr-dashboard-nodeenv
81 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
82 endif(WITH_SYSTEM_NPM)
83
84 add_npm_command(
85 OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/node_modules"
86 COMMAND CYPRESS_CACHE_FOLDER=${CMAKE_SOURCE_DIR}/build/src/pybind/mgr/dashboard/cypress NG_CLI_ANALYTICS=false npm ci -f ${mgr-dashboard-userconfig}
87 DEPENDS package.json
88 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
89 COMMENT "dashboard frontend dependencies are being installed"
90 ${nodeenv})
91
92 # Glob some frontend files.
93 file(
94 GLOB_RECURSE frontend_src
95 RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
96 src/*.ts
97 src/*.html)
98
99 # these files are generated during build
100 list(REMOVE_ITEM frontend_src
101 src/environments/environment.prod.ts
102 src/environments/environment.ts)
103
104 execute_process(
105 COMMAND bash -c "jq -r .config.locale ${CMAKE_CURRENT_SOURCE_DIR}/package.json"
106 OUTPUT_VARIABLE default_lang
107 OUTPUT_STRIP_TRAILING_WHITESPACE)
108
109 set(frontend_dist_dir "${CMAKE_CURRENT_BINARY_DIR}/dist")
110 set(npm_args "--output-path ${frontend_dist_dir}")
111 if(NOT CMAKE_BUILD_TYPE STREQUAL Debug)
112 string(APPEND npm_args " --prod --progress=false")
113 else()
114 string(APPEND npm_args " --progress=false")
115 endif()
116
117 add_npm_command(
118 OUTPUT "${frontend_dist_dir}"
119 COMMAND DASHBOARD_FRONTEND_LANGS="${DASHBOARD_FRONTEND_LANGS}" npm run build:localize -- ${npm_args}
120 DEPENDS ${frontend_src} node_modules
121 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
122 COMMENT "dashboard frontend is being created"
123 ${nodeenv})
124
125 add_custom_command(
126 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/package.json
127 DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/package.json
128 COMMAND ${CMAKE_COMMAND} -E copy_if_different
129 ${CMAKE_CURRENT_SOURCE_DIR}/package.json
130 ${CMAKE_CURRENT_BINARY_DIR}/package.json)
131
132 add_custom_target(mgr-dashboard-frontend-build
133 ALL
134 DEPENDS
135 ${frontend_dist_dir}
136 ${CMAKE_CURRENT_BINARY_DIR}/package.json
137 mgr-dashboard-frontend-deps
138 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
139
140 add_dependencies(tests mgr-dashboard-frontend-build)
141
142 install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/dist
143 DESTINATION ${CEPH_INSTALL_DATADIR}/mgr/dashboard/frontend)
144 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/package.json
145 DESTINATION ${CEPH_INSTALL_DATADIR}/mgr/dashboard/frontend)