From: Kefu Chai Date: Tue, 20 Jul 2021 12:38:45 +0000 (+0800) Subject: cmake: push frontend build logic down X-Git-Tag: v17.1.0~1313^2~4 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=7633a97a153f5304ae37bc1afb5292f534728ad1;p=ceph.git cmake: push frontend build logic down it's simpler to build frontend in frontend/CMakeLists.txt Signed-off-by: Kefu Chai --- diff --git a/src/pybind/mgr/dashboard/CMakeLists.txt b/src/pybind/mgr/dashboard/CMakeLists.txt index b8d558f0ce87..04a7dc17de18 100644 --- a/src/pybind/mgr/dashboard/CMakeLists.txt +++ b/src/pybind/mgr/dashboard/CMakeLists.txt @@ -1,145 +1,4 @@ -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}) - 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() - 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 ${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. -file( - GLOB_RECURSE frontend_src - RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} - frontend/src/*.ts - frontend/src/*.html) - -# these files are generated during build -list(REMOVE_ITEM frontend_src - frontend/src/environments/environment.prod.ts - 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) - -set(frontend_dist_dir "${CMAKE_CURRENT_BINARY_DIR}/frontend/dist") -set(npm_args "--output-path ${frontend_dist_dir}") -if(NOT CMAKE_BUILD_TYPE STREQUAL Debug) - string(APPEND npm_args " --prod --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} frontend/node_modules - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/src/pybind/mgr/dashboard/frontend - COMMENT "dashboard frontend is being created" - ${nodeenv} -) - -add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/frontend/package.json - DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/frontend/package.json - COMMAND ${CMAKE_COMMAND} -E copy_if_different - ${CMAKE_CURRENT_SOURCE_DIR}/frontend/package.json - ${CMAKE_CURRENT_BINARY_DIR}/frontend/package.json) - -add_custom_target(mgr-dashboard-frontend-build - ALL - DEPENDS - ${frontend_dist_dir} - ${CMAKE_CURRENT_BINARY_DIR}/frontend/package.json - mgr-dashboard-frontend-deps - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/src/pybind/mgr/dashboard/frontend) - -add_dependencies(tests mgr-dashboard-frontend-build) - -install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/frontend/dist - DESTINATION ${CEPH_INSTALL_DATADIR}/mgr/dashboard/frontend) -install(FILES ${CMAKE_CURRENT_BINARY_DIR}/frontend/package.json - DESTINATION ${CEPH_INSTALL_DATADIR}/mgr/dashboard/frontend) +add_subdirectory(frontend) if(WITH_TESTS) include(AddCephTest) diff --git a/src/pybind/mgr/dashboard/frontend/CMakeLists.txt b/src/pybind/mgr/dashboard/frontend/CMakeLists.txt new file mode 100644 index 000000000000..48ef908f0e11 --- /dev/null +++ b/src/pybind/mgr/dashboard/frontend/CMakeLists.txt @@ -0,0 +1,137 @@ +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}) + 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() + 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=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 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 ${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 " --prod --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) diff --git a/src/pybind/mgr/dashboard/run-frontend-e2e-tests.sh b/src/pybind/mgr/dashboard/run-frontend-e2e-tests.sh index c375d677812e..2c82069f9964 100755 --- a/src/pybind/mgr/dashboard/run-frontend-e2e-tests.sh +++ b/src/pybind/mgr/dashboard/run-frontend-e2e-tests.sh @@ -83,7 +83,7 @@ DASH_DIR=`pwd` cd ../../../../${BUILD_DIR} FULL_PATH_BUILD_DIR=`pwd` -[[ "$(command -v npm)" == '' ]] && . ${FULL_PATH_BUILD_DIR}/src/pybind/mgr/dashboard/node-env/bin/activate +[[ "$(command -v npm)" == '' ]] && . ${FULL_PATH_BUILD_DIR}/src/pybind/mgr/dashboard/frontend/node-env/bin/activate : ${CYPRESS_CACHE_FOLDER:="${FULL_PATH_BUILD_DIR}/src/pybind/mgr/dashboard/cypress"} diff --git a/src/pybind/mgr/dashboard/run-frontend-unittests.sh b/src/pybind/mgr/dashboard/run-frontend-unittests.sh index 2cfb81fb5182..8432c6f9546b 100755 --- a/src/pybind/mgr/dashboard/run-frontend-unittests.sh +++ b/src/pybind/mgr/dashboard/run-frontend-unittests.sh @@ -7,7 +7,7 @@ SCRIPTPATH="$( cd "$(dirname "$0")" ; pwd -P )" cd $CEPH_ROOT/src/pybind/mgr/dashboard/frontend [ -z "$BUILD_DIR" ] && BUILD_DIR=build if [ `uname` != "FreeBSD" ]; then - . $CEPH_ROOT/${BUILD_DIR}/src/pybind/mgr/dashboard/node-env/bin/activate + . $CEPH_ROOT/${BUILD_DIR}/src/pybind/mgr/dashboard/frontend/node-env/bin/activate fi # Build