]>
Commit | Line | Data |
---|---|---|
20effc67 TL |
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) |