diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs index f5cb208..064d7dd 100644 --- a/.settings/org.eclipse.core.resources.prefs +++ b/.settings/org.eclipse.core.resources.prefs @@ -9,12 +9,26 @@ encoding//lutin/multiprocess.py=utf-8 encoding//lutin/system.py=utf-8 encoding//lutin/target.py=utf-8 encoding//lutin/tools.py=utf-8 +encoding//lutin/z_system/lutinSystem_Android_c.py=utf-8 +encoding//lutin/z_system/lutinSystem_Android_cxx.py=utf-8 +encoding//lutin/z_system/lutinSystem_Android_m.py=utf-8 encoding//lutin/z_system/lutinSystem_IOs_c.py=utf-8 +encoding//lutin/z_system/lutinSystem_IOs_cxx.py=utf-8 +encoding//lutin/z_system/lutinSystem_Linux_alsa.py=utf-8 encoding//lutin/z_system/lutinSystem_Linux_c.py=utf-8 encoding//lutin/z_system/lutinSystem_Linux_cxx.py=utf-8 encoding//lutin/z_system/lutinSystem_Linux_egl.py=utf-8 +encoding//lutin/z_system/lutinSystem_Linux_m.py=utf-8 encoding//lutin/z_system/lutinSystem_Linux_mysql.py=utf-8 encoding//lutin/z_system/lutinSystem_Linux_opengl.py=utf-8 +encoding//lutin/z_system/lutinSystem_Linux_pthread.py=utf-8 +encoding//lutin/z_system/lutinSystem_Linux_z.py=utf-8 +encoding//lutin/z_system/lutinSystem_MacOs_Cocoa.py=utf-8 +encoding//lutin/z_system/lutinSystem_Windows_ole.py=utf-8 +encoding//lutin/z_system/lutinSystem_Windows_oleaut.py=utf-8 +encoding//lutin/z_system/lutinSystem_Windows_psapi.py=utf-8 +encoding//lutin/z_system/lutinSystem_Windows_shell.py=utf-8 +encoding//lutin/z_system/lutinSystem_Windows_start-mode-gui.py=utf-8 encoding//lutin/z_target/lutinTarget_Android.py=utf-8 encoding//lutin/z_target/lutinTarget_Debian.py=utf-8 encoding//lutin/z_target/lutinTarget_IOs.py=utf-8 diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt new file mode 100644 index 0000000..bfd8775 --- /dev/null +++ b/cmake/CMakeLists.txt @@ -0,0 +1,20 @@ +cmake_minimum_required(VERSION 3.20) +project(GlobalSearch) + + +message("List of modules: ${CMAKE_MODULE_PATH}") + +#LIST(APPEND CMAKE_MODULE_PATH "cmake") + +#find_package(GLDBuilder REQUIRED) + +include("cmake/GLDBuilder.cmake") + +#GLD_import("./" "etk-core") + +get_filename_component(LOCAL_FILE_PATH "." ABSOLUTE) +GLD_auto_prebuild_load_all("${LOCAL_FILE_PATH}") +GLD_auto_load_all("${LOCAL_FILE_PATH}") + +GLD_instanciate() + diff --git a/cmake/GLDBuilder.cmake b/cmake/GLDBuilder.cmake new file mode 100644 index 0000000..17bc4f2 --- /dev/null +++ b/cmake/GLDBuilder.cmake @@ -0,0 +1,1124 @@ +cmake_minimum_required(VERSION 3.20) + +if (WIN32) + set(CPACK_GENERATOR "ZIP") +else() + set(CPACK_GENERATOR "TGZ") +endif() +set(CPACK_VERBATIM_VARIABLES YES) +include(CPack) + + +## fist step is determining the target: +if (WIN32) + set(GLD_TARGET "Windows" CACHE INTERNAL "") +elseif(APPLE) + set(GLD_TARGET "MacOs" CACHE INTERNAL "") +elseif(LINUX) + set(GLD_TARGET "Linux" CACHE INTERNAL "") +elseif(UNIX AND NOT APPLE) + set(GLD_TARGET "Linux" CACHE INTERNAL "") +else() + message("GLD Can not determine the target !!!") + exit(-1) +endif() + +if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + set(GLD_COMPILATOR "clang" CACHE INTERNAL "") +elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + set(GLD_COMPILATOR "gcc" CACHE INTERNAL "") +elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Intel") + set(GLD_COMPILATOR "intel" CACHE INTERNAL "") +elseif (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") + set(GLD_COMPILATOR "msvc" CACHE INTERNAL "") +else() + message("GLD Can not determine the compilator !!!") + exit(-1) +endif() + +if(CMAKE_BUILD_TYPE STREQUAL "Debug") + set(GLD_MODE "debug" CACHE INTERNAL "") +elseif(CMAKE_BUILD_TYPE STREQUAL "debug") + set(GLD_MODE "debug" CACHE INTERNAL "") +else() + set(GLD_MODE "release" CACHE INTERNAL "") +endif() + + +if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" + OR CMAKE_SYSTEM_PROCESSOR STREQUAL amd64) + set(GLD_ARCH "x86" CACHE INTERNAL "") + set(GLD_BUS_SIZE "64" CACHE INTERNAL "") +elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86" + OR CMAKE_SYSTEM_PROCESSOR STREQUAL "i686") + set(GLD_ARCH "x86" CACHE INTERNAL "") + set(GLD_BUS_SIZE "32" CACHE INTERNAL "") +elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "ppc64") + set(GLD_ARCH "ppc" CACHE INTERNAL "") + set(GLD_BUS_SIZE "64" CACHE INTERNAL "") +elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "ppc") + set(GLD_ARCH "ppc" CACHE INTERNAL "") + set(GLD_BUS_SIZE "32" CACHE INTERNAL "") +elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64" + OR CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") + set(GLD_ARCH "arm" CACHE INTERNAL "") + set(GLD_BUS_SIZE "64" CACHE INTERNAL "") +elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "arm" + OR CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7l" + OR CMAKE_SYSTEM_PROCESSOR STREQUAL "armv9") + set(GLD_ARCH "arm" CACHE INTERNAL "") + set(GLD_BUS_SIZE "32" CACHE INTERNAL "") +else() + message("GLD Can not determine the architecture and bus-size !!!") + exit(-1) +endif() + +# cmake does not support other mode than "intricate" the "isolate" mode is too much complicated to do. +set(GLD_SANITY_MODE "intricate" CACHE INTERNAL "") +# list of current supported language: +# - 'c': C language +# - 'c++': C++ language +# - 'asm': asembler language +# - 'm': Objective-C language +# - 'mm': Objective-C++ language +# - 'java': Java language +# - 'javah': generated c header with Java description (for JNI) +# TODO: maybe permit user to add some other... like "in", "masm", or other pre-step generation code??? +set(GLD_SUPPORT_LANGUAGE "c;asm;c++;m;mm;java;javah" CACHE INTERNAL "") +set(GLD_SUPPORT_LANGUAGE_VARIABLE "C;ASM;CXX;M;MM;JAVA;JAVAH" CACHE INTERNAL "") +set(GLD_LANGUAGE_EXTENTION_C "c;C" CACHE INTERNAL "") +set(GLD_LANGUAGE_EXTENTION_CXX "cpp;CPP;cxx;CXX" CACHE INTERNAL "") +set(GLD_LANGUAGE_EXTENTION_ASM "s;S" CACHE INTERNAL "") +set(GLD_LANGUAGE_EXTENTION_M "m;M" CACHE INTERNAL "") +set(GLD_LANGUAGE_EXTENTION_MM "mm;MM" CACHE INTERNAL "") +set(GLD_LANGUAGE_EXTENTION_JAVA "java" CACHE INTERNAL "") +set(GLD_LANGUAGE_EXTENTION_JAVAH "javah" CACHE INTERNAL "") + +# where is build the module +set(GLD_GLOBAL_BUILD_FOLDER "${CMAKE_CURRENT_BINARY_DIR}/${GLD_TARGET}_${GLD_ARCH}_${GLD_BUS_SIZE}/${GLD_MODE}/build/${GLD_COMPILATOR}/" CACHE INTERNAL "") +# where the package is prepared +set(GLD_GLOBAL_STAGING_FOLDER "${CMAKE_CURRENT_BINARY_DIR}/${GLD_TARGET}_${GLD_ARCH}_${GLD_BUS_SIZE}/${GLD_MODE}/staging/${GLD_COMPILATOR}/" CACHE INTERNAL "") +# whe the bundle (tar, jar ...) is set +set(GLD_GLOBAL_FINAL_FOLDER "${CMAKE_CURRENT_BINARY_DIR}/${GLD_TARGET}_${GLD_ARCH}_${GLD_BUS_SIZE}/${GLD_MODE}/final/${GLD_COMPILATOR}/" CACHE INTERNAL "") + +message("Global GLD properties:") +message(" GLD_MODE : ${GLD_MODE}") +message(" GLD_COMPILATOR : ${GLD_COMPILATOR}") +message(" GLD_TARGET : ${GLD_TARGET}") +message(" GLD_ARCH : ${GLD_ARCH}") +message(" GLD_BUS_SIZE : ${GLD_BUS_SIZE}") +message(" GLD_SANITY_MODE : ${GLD_SANITY_MODE}") +message(" GLD_GLOBAL_BUILD_FOLDER : ${GLD_GLOBAL_BUILD_FOLDER}") +message(" GLD_GLOBAL_STAGING_FOLDER : ${GLD_GLOBAL_STAGING_FOLDER}") +message(" GLD_GLOBAL_FINAL_FOLDER : ${GLD_GLOBAL_FINAL_FOLDER}") + +## +## @brief get the type of a variable +## @param[in] INPUT_JSON Json data. +## @param[in] VARIABLE Name of the variable. +## @param[out] OUT_VAR Retrun type of the node: NULL, NUMBER, STRING, BOOLEAN, ARRAY, OBJECT or NOTFOUND (if does not exist) +## +function(json_get_type OUT_VAR INPUT_JSON VARIABLE) + string(JSON VALUE ERROR_VARIABLE ${VARIABLE} TYPE ${INPUT_JSON} ${VARIABLE}) + if (${VALUE} STREQUAL ${VARIABLE}-NOTFOUND) + set(${OUT_VAR} "NOTFOUND" PARENT_SCOPE) + else() + set(${OUT_VAR} "${VALUE}" PARENT_SCOPE) + endif() +endfunction() + + +function(json_size OUT_VAR INPUT_JSON VARIABLE) + string(JSON VALUE ERROR_VARIABLE ${VARIABLE} LENGTH ${INPUT_JSON} ${VARIABLE}) + if (${VALUE} STREQUAL ${VARIABLE}-NOTFOUND) + set("${OUT_VAR}" 0 PARENT_SCOPE) + else () + set("${OUT_VAR}" ${VALUE} PARENT_SCOPE) + endif() +endfunction() + +function(json_get_data OUT_VAR INPUT_JSON VARIABLE) + string(JSON VALUE GET ${INPUT_JSON} ${VARIABLE}) + set("${OUT_VAR}" ${VALUE} PARENT_SCOPE) +endfunction() + +function(json_object_key OUT_VAR INPUT_JSON IDX) + string(JSON VALUE MEMBER ${INPUT_JSON} ${IDX}) + set("${OUT_VAR}" ${VALUE} PARENT_SCOPE) +endfunction() + +function(json_object_keys OUT_VAR MY_JSON_STRING VARIABLE) + json_size(SIZE ${MY_JSON_STRING} ${VARIABLE}) + #message("target SIZE = ${SIZE}") + json_get_data(OBJECT_DATA ${MY_JSON_STRING} ${VARIABLE}) + MATH(EXPR SIZE "${SIZE}-1") + set(OUT "") + foreach(IDX RANGE ${SIZE}) + json_object_key(ELEMENT ${OBJECT_DATA} ${IDX}) + #message(" - : ${ELEMENT}") + list(APPEND OUT ${ELEMENT}) + endforeach() + set("${OUT_VAR}" ${OUT} PARENT_SCOPE) +endfunction() + +function(json_object_values OUT_VAR INPUT_JSON VARIABLE KEYS) + string(JSON VALUE GET ${INPUT_JSON} ${VARIABLE} ${KEYS}) + set("${OUT_VAR}" ${VALUE} PARENT_SCOPE) +endfunction() + +function(json_get_list OUT_VAR INPUT_JSON VARIABLE) + string(JSON LIST_JSON_ELEMENTS ERROR_VARIABLE ${VARIABLE} GET ${INPUT_JSON} ${VARIABLE}) + if (${LIST_JSON_ELEMENTS} STREQUAL ${VARIABLE}-NOTFOUND) + set("${OUT_VAR}" PARENT_SCOPE) + retrun() + endif() + #message("LIST_JSON_ELEMENTS : ${LIST_JSON_ELEMENTS}") + + string(JSON LENGTH_VALUE LENGTH ${LIST_JSON_ELEMENTS}) + #message("LENGTH_VALUE : ${LENGTH_VALUE}") + if (${LENGTH_VALUE} EQUAL 0) + set("${OUT_VAR}" PARENT_SCOPE) + retrun() + endif() + set(OUT_LIST) + MATH(EXPR LENGTH_VALUE "${LENGTH_VALUE}-1") + foreach(IDX RANGE ${LENGTH_VALUE}) + string(JSON ELEM GET ${LIST_JSON_ELEMENTS} ${IDX}) + #message(" - : ${ELEM}") + list(APPEND OUT_LIST ${ELEM}) + endforeach() + #message("OUT_LIST : ${OUT_LIST}") + set("${OUT_VAR}" ${OUT_LIST} PARENT_SCOPE) +endfunction() + + + +function(json_get_element OUT_VAR INPUT_JSON VARIABLE) + string(JSON ELEMENT ERROR_VARIABLE ${VARIABLE} GET ${INPUT_JSON} ${VARIABLE}) + if ("${ELEMENT}" STREQUAL "${VARIABLE}-NOTFOUND") + set("${OUT_VAR}" "" PARENT_SCOPE) + elseif ("${ELEMENT}" STREQUAL "NOTFOUND") + set("${OUT_VAR}" "" PARENT_SCOPE) + else() + set("${OUT_VAR}" ${ELEMENT} PARENT_SCOPE) + endif() +endfunction() + + + +function(GLD_import_full_group NAME_GLD_MODULE MY_JSON_STRING ELEMENT_TO_CHECK TYPE_VARIABLE) + json_get_type(TYPE ${MY_JSON_STRING} ${ELEMENT_TO_CHECK}) + #message("target type = ${TYPE}") + if (${TYPE} STREQUAL "OBJECT") + json_object_keys(LIST_KEY ${MY_JSON_STRING} ${ELEMENT_TO_CHECK}) + foreach (III ${LIST_KEY}) + # check the target, no need to had unknown target ... + if (${III} STREQUAL "*") + json_object_values(DATA_TARGET ${MY_JSON_STRING} ${ELEMENT_TO_CHECK} "*") + #message("target(*) data: ${DATA_TARGET}") + GLD_import_full(NAME_GLD_MODULE DATA_TARGET) + elseif (${III} STREQUAL ${TYPE_VARIABLE}) + json_object_values(DATA_TARGET ${MY_JSON_STRING} ${ELEMENT_TO_CHECK} "${III}") + GLD_import_full(NAME_GLD_MODULE DATA_TARGET) + #message("target(${III}) data: ${DATA_TARGET}") + else() + message("TODO: get dependency manage '${ELEMENT_TO_CHECK}' : ${III}") + endif() + endforeach() + elseif(${TYPE} STREQUAL "NOTFOUND" OR ${TYPE} STREQUAL "NULL") + # nothing to do .. + else() + message("ERROR : '${ELEMENT_TO_CHECK}' can not be other than an json object : ${TYPE}") + endif() +endfunction() + + +function(GLD_import_element_dependency NAME_GLD_MODULE MY_JSON_STRING) + GLD_get_module_name(LOCAL_MODULE_NAME ${NAME_GLD_MODULE}) + ########################################################## + ## DEPENDENCY: + ########################################################## + json_get_type(TYPE ${MY_JSON_STRING} "dependency") + set(LIST_VALUE "") + set(LIST_OPTIONAL_VALUE "") + #message("Dependency type = ${TYPE}") + if (${TYPE} STREQUAL "ARRAY") + json_size(SIZE ${MY_JSON_STRING} "dependency") + #message("Dependency SIZE = ${SIZE}") + json_get_data(OBJECT_DATA ${MY_JSON_STRING} "dependency") + MATH(EXPR SIZE "${SIZE}-1") + set(VAR_OUT_TMP "") + foreach(IDX RANGE ${SIZE}) + json_get_data(ELEMENT ${OBJECT_DATA} ${IDX}) + json_get_type(TYPE ${OBJECT_DATA} ${IDX}) + if (${TYPE} STREQUAL "STRING") + message(" - : ${ELEMENT}") + list(APPEND VAR_OUT_TMP ${ELEMENT}) + elseif (${TYPE} STREQUAL "OBJECT") + json_get_type(TYPE ${ELEMENT} "name") + if (${TYPE} STREQUAL "STRING") + json_get_data(DEPENDENCY_NAME ${ELEMENT} "name") + json_get_type(TYPE ${ELEMENT} "optional") + #message("optional type = ${TYPE} <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ${DEPENDENCY_NAME}") + if (${TYPE} STREQUAL "BOOLEAN") + json_get_data(DEPENDENCY_OPTIONAL ${ELEMENT} "optional") + if (${DEPENDENCY_OPTIONAL}) + message(" - : ${DEPENDENCY_NAME} (optional) ==> not managed now ...") + #message("optional value ==========================> '${DEPENDENCY_OPTIONAL}' ==> MAYBE") + list(APPEND LIST_OPTIONAL_VALUE ${DEPENDENCY_NAME}) + else() + message(" - : ${DEPENDENCY_NAME}") + #message("optional value ==========================> '${DEPENDENCY_OPTIONAL}' ==> MUST") + list(APPEND VAR_OUT_TMP ${DEPENDENCY_NAME}) + endif() + else() + message(" - : ${DEPENDENCY_NAME}") + list(APPEND VAR_OUT_TMP ${DEPENDENCY_NAME}) + endif() + #message("optional type = ${TYPE} <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ${DEPENDENCY_NAME}") + else() + message("Dependency 'name' is not a string or is missing type: ${TYPE}") + endif() + else() + message("dependency element not manage data : ${ELEMENT}") + ## TODO add in dependency if optional : check if the element exit in the current module list ... + + endif() + endforeach() + list(APPEND LIST_VALUE ${VAR_OUT_TMP}) + elseif(${TYPE} STREQUAL "NOTFOUND") + return() + endif() + set(MODULE_MAP_${LOCAL_MODULE_NAME}_DEPENDENCY ${MODULE_MAP_${LOCAL_MODULE_NAME}_DEPENDENCY} ${LIST_VALUE} CACHE INTERNAL "") + +endfunction() + +function(GLD_import_element_source NAME_GLD_MODULE MY_JSON_STRING) + GLD_get_module_name(LOCAL_MODULE_NAME ${NAME_GLD_MODULE}) + ########################################################## + ## SOURCE: + ########################################################## + set(LIST_VALUE "") + json_get_type(TYPE ${MY_JSON_STRING} "source") + if (${TYPE} STREQUAL "STRING") + json_get_data(OBJECT_DATA ${MY_JSON_STRING} "source") + message(" - : ${OBJECT_DATA}") + list(APPEND LIST_VALUE ${OBJECT_DATA}) + elseif (${TYPE} STREQUAL "ARRAY") + json_get_data(OBJECT_DATA ${MY_JSON_STRING} "source") + json_size(SIZE ${MY_JSON_STRING} "source") + #message("Dependency SIZE = ${SIZE}") + MATH(EXPR SIZE "${SIZE}-1") + set(VAR_OUT_TMP "") + foreach(IDX RANGE ${SIZE}) + json_get_data(ELEMENT ${OBJECT_DATA} ${IDX}) + json_get_type(TYPE ${OBJECT_DATA} ${IDX}) + if (${TYPE} STREQUAL "STRING") + message(" - : ${ELEMENT}") + list(APPEND LIST_VALUE ${ELEMENT}) + elseif (${TYPE} STREQUAL "OBJECT") + json_get_type(TYPE ${ELEMENT} "source") + json_get_data(ELEMENT_SOURCE ${ELEMENT} "source") + if (${TYPE} STREQUAL "STRING") + message(" - : ${ELEMENT_SOURCE}") + list(APPEND LIST_VALUE ${ELEMENT_SOURCE}) + #message("optional type = ${TYPE} <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ${DEPENDENCY_NAME}") + elseif (${TYPE} STREQUAL "ARRAY") + message(" - : ${ELEMENT_SOURCE}") + list(APPEND LIST_VALUE ${ELEMENT_SOURCE}) + else() + message("Dependency 'name' is not a string or is missing type: ${TYPE}") + endif() + # TODO: add the source specific flags or other things ... + else() + message("'source' element not manage data : ${ELEMENT}") + ## TODO add in dependency if optional : check if the element exit in the current module list ... + endif() + endforeach() + elseif (${TYPE} STREQUAL "OBJECT") + # todo: manage object with source like { "c++":[...]...} + elseif(${TYPE} STREQUAL "NOTFOUND") + return() + else() + message(WARNING "Unmanaged type='${TYPE}' for 'source' node") + endif() + set(MODULE_MAP_${LOCAL_MODULE_NAME}_SOURCE ${MODULE_MAP_${LOCAL_MODULE_NAME}_SOURCE} ${LIST_VALUE} CACHE INTERNAL "") +endfunction() + +function(GLD_import_element_header NAME_GLD_MODULE MY_JSON_STRING) + GLD_get_module_name(LOCAL_MODULE_NAME ${NAME_GLD_MODULE}) + ########################################################## + ## HEADER: + ########################################################## + set(LIST_VALUE "") + json_get_type(TYPE ${MY_JSON_STRING} "header") + if (${TYPE} STREQUAL "STRING") + json_get_data(OBJECT_DATA ${MY_JSON_STRING} "header") + message(" -
: ${OBJECT_DATA}") + list(APPEND LIST_VALUE ${OBJECT_DATA}) + elseif (${TYPE} STREQUAL "ARRAY") + json_get_data(OBJECT_DATA ${MY_JSON_STRING} "header") + json_size(SIZE ${MY_JSON_STRING} "header") + #message("Dependency SIZE = ${SIZE}") + MATH(EXPR SIZE "${SIZE}-1") + set(VAR_OUT_TMP "") + foreach(IDX RANGE ${SIZE}) + json_get_data(ELEMENT ${OBJECT_DATA} ${IDX}) + json_get_type(TYPE ${OBJECT_DATA} ${IDX}) + if (${TYPE} STREQUAL "STRING") + message(" -
: ${ELEMENT}") + list(APPEND LIST_VALUE ${ELEMENT}) + elseif (${TYPE} STREQUAL "OBJECT") + json_get_type(TYPE ${ELEMENT} "source") + json_get_data(ELEMENT_SOURCE ${ELEMENT} "source") + if (${TYPE} STREQUAL "STRING") + message(" -
: ${ELEMENT_SOURCE}") + list(APPEND LIST_VALUE ${ELEMENT_SOURCE}) + #message("optional type = ${TYPE} <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ${DEPENDENCY_NAME}") + elseif (${TYPE} STREQUAL "ARRAY") + message(" -
: ${ELEMENT_SOURCE}") + list(APPEND LIST_VALUE ${ELEMENT_SOURCE}) + else() + message("Dependency 'name' is not a string or is missing type: ${TYPE}") + endif() + # TODO: add the source specific flags or other things ... + else() + message("'header' element not manage data : ${ELEMENT}") + ## TODO add in dependency if optional : check if the element exit in the current module list ... + endif() + endforeach() + elseif (${TYPE} STREQUAL "OBJECT") + json_get_data(OBJECT_DATA ${MY_JSON_STRING} "header") + # todo: manage object with source like { "c++":[...]...} + elseif(${TYPE} STREQUAL "NOTFOUND") + return() + else() + message(WARNING "Unmanaged type='${TYPE}' for 'header' node") + endif() + set(MODULE_MAP_${LOCAL_MODULE_NAME}_HEADER ${MODULE_MAP_${LOCAL_MODULE_NAME}_HEADER} ${LIST_VALUE} CACHE INTERNAL "") +endfunction() + +function(GLD_import_element_path NAME_GLD_MODULE MY_JSON_STRING) + GLD_get_module_name(LOCAL_MODULE_NAME ${NAME_GLD_MODULE}) + ########################################################## + ## PATH: + ########################################################## + set(LIST_VALUE "") + json_get_type(TYPE ${MY_JSON_STRING} "path") + if (${TYPE} STREQUAL "STRING") + json_get_data(OBJECT_DATA ${MY_JSON_STRING} "path") + message(" -
: ${OBJECT_DATA}") + list(APPEND LIST_VALUE ${OBJECT_DATA}) + elseif (${TYPE} STREQUAL "ARRAY") + json_get_data(OBJECT_DATA ${MY_JSON_STRING} "path") + json_size(SIZE ${MY_JSON_STRING} "path") + #message("Dependency SIZE = ${SIZE}") + MATH(EXPR SIZE "${SIZE}-1") + set(VAR_OUT_TMP "") + foreach(IDX RANGE ${SIZE}) + json_get_data(ELEMENT ${OBJECT_DATA} ${IDX}) + json_get_type(TYPE ${OBJECT_DATA} ${IDX}) + if (${TYPE} STREQUAL "STRING") + message(" -
: ${ELEMENT}") + list(APPEND LIST_VALUE ${ELEMENT}) + else() + message("'path' element not manage data : ${ELEMENT}") + ## TODO add in dependency if optional : check if the element exit in the current module list ... + endif() + endforeach() + elseif (${TYPE} STREQUAL "OBJECT") + json_get_data(OBJECT_DATA ${MY_JSON_STRING} "path") + # todo: manage object with source like { "c++":[...]...} + elseif(${TYPE} STREQUAL "NOTFOUND") + return() + else() + message(WARNING "Unmanaged type='${TYPE}' for 'path' node") + endif() + set(MODULE_MAP_${LOCAL_MODULE_NAME}_INCLUDE_LOCAL ${MODULE_MAP_${LOCAL_MODULE_NAME}_INCLUDE_LOCAL} ${LIST_VALUE} CACHE INTERNAL "") +endfunction() + +function(GLD_import_element_compilation_version NAME_GLD_MODULE MY_JSON_STRING) + GLD_get_module_name(LOCAL_MODULE_NAME ${NAME_GLD_MODULE}) + ########################################################## + ## COMPILATION-VERSION: + ########################################################## + +endfunction() + +function(GLD_import_element_copy NAME_GLD_MODULE MY_JSON_STRING) + GLD_get_module_name(LOCAL_MODULE_NAME ${NAME_GLD_MODULE}) + ########################################################## + ## COPY: + ########################################################## + +endfunction() + +## +## @brief Get the list of all dependency even if they are optional. +## @param[out] VAR_OUT list of dependency library +## @param[out] VAR_OPTIONAL_OUT list of optional dependency library +## @param[in] MY_JSON_STRING Json string +## @note This function is dependent of the target +## +function(GLD_import_full NAME_GLD_MODULE MY_JSON_STRING) + GLD_import_element_dependency(${NAME_GLD_MODULE} ${MY_JSON_STRING}) + GLD_import_element_source(${NAME_GLD_MODULE} ${MY_JSON_STRING}) + GLD_import_element_header(${NAME_GLD_MODULE} ${MY_JSON_STRING}) + GLD_import_element_path(${NAME_GLD_MODULE} ${MY_JSON_STRING}) + GLD_import_element_compilation_version(${NAME_GLD_MODULE} ${MY_JSON_STRING}) + GLD_import_element_copy(${NAME_GLD_MODULE} ${MY_JSON_STRING}) + + GLD_import_full_group(${NAME_GLD_MODULE} ${MY_JSON_STRING} "target" ${GLD_TARGET}) + + GLD_import_full_group(${NAME_GLD_MODULE} ${MY_JSON_STRING} "mode" ${GLD_MODE}) + + GLD_import_full_group(${NAME_GLD_MODULE} ${MY_JSON_STRING} "arch" ${GLD_ARCH}) + + GLD_import_full_group(${NAME_GLD_MODULE} ${MY_JSON_STRING} "bus-size" ${GLD_BUS_SIZE}) + + GLD_import_full_group(${NAME_GLD_MODULE} ${MY_JSON_STRING} "compilator" ${GLD_COMPILATOR}) + + GLD_import_full_group(${NAME_GLD_MODULE} ${MY_JSON_STRING} "sanity-compilation" ${GLD_SANITY_MODE}) + +endfunction() + + +function(GLD_load_from_file_if_needed VAR_OUT LIBRARY_PATH ELEMENT) + #message("Check element: ${ELEMENT}") + if("${ELEMENT}" MATCHES "file://*") + #message("match file://") + string(REPLACE "file://" "" FILENAME ${ELEMENT}) + #message(" ==> ${FILENAME}") + file (STRINGS "${LIBRARY_PATH}/${FILENAME}" DATA_READ) + set(${VAR_OUT} "${DATA_READ}" PARENT_SCOPE) + else() + set(${VAR_OUT} "${ELEMENT}" PARENT_SCOPE) + endif() +endfunction() + +function(GLD_import NAME_GLD_MODULE) + GLD_get_module_name(LOCAL_MODULE_NAME ${NAME_GLD_MODULE}) + + + # set(MODULE_MAP_${LOCAL_MODULE_NAME}_FOLDER ${FOLDER} CACHE INTERNAL "") + # set(MODULE_MAP_${LOCAL_MODULE_NAME}_FILENAME ${FILENAME} CACHE INTERNAL "") + # set(MODULE_MAP_${LOCAL_MODULE_NAME}_NAME ${NAME_GLD_MODULE} CACHE INTERNAL "") + # set(MODULE_MAP_LIST ${MODULE_MAP_LIST} ${NAME_GLD_MODULE} CACHE INTERNAL "") + # Read the JSON file. + set(MY_JSON_STRING ${MODULE_MAP_${LOCAL_MODULE_NAME}_JSON}) + + # Loop through each element of the JSON array (indices 0 though 1). + + json_get_element(LIBRARY_TYPE ${MY_JSON_STRING} "type") + json_get_element(LIBRARY_SUB_TYPE ${MY_JSON_STRING} "sub-type") + json_get_element(LIBRARY_GROUP_ID ${MY_JSON_STRING} "group-id") + json_get_element(LIBRARY_DECRIPTION ${MY_JSON_STRING} "description") + json_get_element(LIBRARY_LICENCE ${MY_JSON_STRING} "license") + json_get_element(LIBRARY_LICENCE_FILE ${MY_JSON_STRING} "license-file") + json_get_element(LIBRARY_MAINTAINER ${MY_JSON_STRING} "maintainer") + json_get_element(LIBRARY_AUTHORS ${MY_JSON_STRING} "author") + json_get_element(LIBRARY_VERSION ${MY_JSON_STRING} "version") + json_get_element(CODE_QUALITY ${MY_JSON_STRING} "code-quality") + + message("LIBRARY : ${LIBRARY_GROUP_ID}:${NAME_GLD_MODULE}") + message("LIBRARY_TYPE : ${LIBRARY_TYPE} / ${LIBRARY_SUB_TYPE}") + message("LIBRARY_DECRIPTION : ${LIBRARY_DECRIPTION}") + message("LIBRARY_LICENCE : ${LIBRARY_LICENCE}") + if (LIBRARY_LICENCE_FILE) + message("LIBRARY_LICENCE_FILE : ${LIBRARY_LICENCE_FILE}") + #GLD_load_from_file_if_needed(LIBRARY_LICENCE_FILE "${MODULE_MAP_${LOCAL_MODULE_NAME}_FOLDER}" "${LIBRARY_LICENCE_FILE}") + #message(" ==> : ${LIBRARY_LICENCE_FILE}") + endif() + if (LIBRARY_MAINTAINER) + message("LIBRARY_MAINTAINER : ${LIBRARY_MAINTAINER}") + GLD_load_from_file_if_needed(LIBRARY_MAINTAINER "${MODULE_MAP_${LOCAL_MODULE_NAME}_FOLDER}" "${LIBRARY_MAINTAINER}") + message(" ==> : ${LIBRARY_MAINTAINER}") + endif() + if (LIBRARY_AUTHORS) + message("LIBRARY_AUTHORS : ${LIBRARY_AUTHORS}") + GLD_load_from_file_if_needed(LIBRARY_AUTHORS "${MODULE_MAP_${LOCAL_MODULE_NAME}_FOLDER}" "${LIBRARY_AUTHORS}") + message(" ==> : ${LIBRARY_AUTHORS}") + endif() + if (LIBRARY_VERSION) + message("LIBRARY_VERSION : ${LIBRARY_VERSION}") + GLD_load_from_file_if_needed(LIBRARY_VERSION "${MODULE_MAP_${LOCAL_MODULE_NAME}_FOLDER}" "${LIBRARY_VERSION}") + message(" ==> : ${LIBRARY_VERSION}") + # NOTE CMAKE does not support DEV_MODEL, then we use the lact ELEMENT for dev version (666) + string(REPLACE "-dev" ".666" LIBRARY_VERSION ${LIBRARY_VERSION}) + endif() + + #string(REPLACE "-" "_" LIBRARY_NAME222 ${NAME_GLD_MODULE}) + set(LIBRARY_NAME222 ${NAME_GLD_MODULE}) + if (LIBRARY_VERSION) + project(${LIBRARY_NAME222} VERSION ${LIBRARY_VERSION}) + set(${LIBRARY_NAME222} PROPERTIES CPACK_PACKAGE_VERSION ${LIBRARY_VERSION}) + else() + project(${LIBRARY_NAME222}) + endif() + + set(MODULE_MAP_${LOCAL_MODULE_NAME}_INCLUDE_LOCAL "" CACHE INTERNAL "") + + # TODO : Remove if no element in header... + if (MODULE_MAP_${LOCAL_MODULE_NAME}_HEADER) + set(MODULE_MAP_${LOCAL_MODULE_NAME}_INCLUDE_PUBLIC "${GLD_GLOBAL_BUILD_FOLDER}${NAME_GLD_MODULE}/include/" CACHE INTERNAL "") + endif() + # remove if no library generated + set(MODULE_MAP_${LOCAL_MODULE_NAME}_LIB_PATH "${GLD_GLOBAL_STAGING_FOLDER}${NAME_GLD_MODULE}/lib/" CACHE INTERNAL "") + # remove if no doc ... + set(MODULE_MAP_${LOCAL_MODULE_NAME}_DOC_PATH "${GLD_GLOBAL_STAGING_FOLDER}${NAME_GLD_MODULE}/doc/" CACHE INTERNAL "") + + set(MODULE_MAP_${LOCAL_MODULE_NAME}_DEPENDENCY "" CACHE INTERNAL "") + set(MODULE_MAP_${LOCAL_MODULE_NAME}_SOURCE "" CACHE INTERNAL "") + set(MODULE_MAP_${LOCAL_MODULE_NAME}_HEADER "" CACHE INTERNAL "") + + GLD_import_full(${NAME_GLD_MODULE} ${MY_JSON_STRING}) + set(TMP_LIST "") + foreach(III ${MODULE_MAP_${LOCAL_MODULE_NAME}_INCLUDE_LOCAL}) + get_filename_component(BASE_FOLDER ${MODULE_MAP_${LOCAL_MODULE_NAME}_FOLDER}/${III} ABSOLUTE) + list(APPEND TMP_LIST "${BASE_FOLDER}") + endforeach() + set(MODULE_MAP_${LOCAL_MODULE_NAME}_INCLUDE_LOCAL "${TMP_LIST}" CACHE INTERNAL "") + + message(" _INCLUDE_LOCAL : ${MODULE_MAP_${LOCAL_MODULE_NAME}_INCLUDE_LOCAL}") + message(" _INCLUDE_PUBLIC: ${MODULE_MAP_${LOCAL_MODULE_NAME}_INCLUDE_PUBLIC}") + message(" _LIB_PATH : ${MODULE_MAP_${LOCAL_MODULE_NAME}_LIB_PATH}") + message(" _DOC_PATH : ${MODULE_MAP_${LOCAL_MODULE_NAME}_DOC_PATH}") + message(" _DEPENDENCY : ${MODULE_MAP_${LOCAL_MODULE_NAME}_DEPENDENCY}") + message(" _SOURCE : ${MODULE_MAP_${LOCAL_MODULE_NAME}_SOURCE}") + message(" _HEADER : ${MODULE_MAP_${LOCAL_MODULE_NAME}_HEADER}") + + set(TMP_LIST "") + foreach(III ${MODULE_MAP_${LOCAL_MODULE_NAME}_SOURCE}) + get_filename_component(BASE_FOLDER ${MODULE_MAP_${LOCAL_MODULE_NAME}_FOLDER}/${III} ABSOLUTE) + list(APPEND TMP_LIST "${BASE_FOLDER}") + endforeach() + add_library(${LIBRARY_NAME222}_OBJ OBJECT ${TMP_LIST}) + # allow relocation code for shared library: + set_property(TARGET ${LIBRARY_NAME222}_OBJ PROPERTY POSITION_INDEPENDENT_CODE 1) + + + foreach(III ${MODULE_MAP_${LOCAL_MODULE_NAME}_HEADER}) + configure_file(${MODULE_MAP_${LOCAL_MODULE_NAME}_FOLDER}/${III} ${MODULE_MAP_${LOCAL_MODULE_NAME}_INCLUDE_PUBLIC}/${III} COPYONLY) + endforeach() + + set(TMP_LIST ${MODULE_MAP_${LOCAL_MODULE_NAME}_INCLUDE_LOCAL}) + list(APPEND TMP_LIST ${MODULE_MAP_${LOCAL_MODULE_NAME}_INCLUDE_PUBLIC}) + target_include_directories(${LIBRARY_NAME222}_OBJ PUBLIC "${TMP_LIST}") + add_library(${LIBRARY_NAME222}_dynamic SHARED $) + add_library(${LIBRARY_NAME222}_static STATIC $) + + if ("${GLD_TARGET}" STREQUAL "Windows") + set_target_properties(${LIBRARY_NAME222}_dynamic PROPERTIES OUTPUT_NAME ${LIBRARY_NAME222}) + # static will keep the element static at the end (the windows architecture fore shared object need to have a static library to access to the DLL ==> create a conflict!!! + else() + set_target_properties(${LIBRARY_NAME222}_dynamic PROPERTIES OUTPUT_NAME ${LIBRARY_NAME222}) + set_target_properties(${LIBRARY_NAME222}_static PROPERTIES OUTPUT_NAME ${LIBRARY_NAME222}) + endif() + if (LIBRARY_VERSION) + set_target_properties(${LIBRARY_NAME222}_dynamic PROPERTIES VERSION ${LIBRARY_VERSION}) + set_target_properties(${LIBRARY_NAME222}_dynamic PROPERTIES SOVERSION ${LIBRARY_VERSION}) + endif() + if (LIBRARY_DECRIPTION) + set_target_properties(${LIBRARY_NAME222}_dynamic PROPERTIES DESCRIPTION ${LIBRARY_DECRIPTION}) + endif() + + # install dynamic & static library + install(TARGETS ${LIBRARY_NAME222}_dynamic EXPORT ${LIBRARY_NAME222}Targets + RUNTIME DESTINATION ${MODULE_MAP_${LOCAL_MODULE_NAME}_LIB_PATH} + ) + install(TARGETS ${LIBRARY_NAME222}_static + RUNTIME DESTINATION ${MODULE_MAP_${LOCAL_MODULE_NAME}_LIB_PATH}) + + + #install(TARGETS ${LIBRARY_NAME222} EXPORT ${LIBRARY_NAME222}Targets + # LIBRARY DESTINATION lib + # ARCHIVE DESTINATION lib + # RUNTIME DESTINATION bin + # INCLUDES DESTINATION include + #) + # install exported headers + # this copy all the headers in a single folder: + #install(FILES ${EXPORT_HEADER_LIST} DESTINATION include) + # this keep the basic path for each folders: + set(BASE "${PROJECT_SOURCE_DIR}/install") + foreach(ITEM ${EXPORT_HEADER_LIST}) + get_filename_component(ITEM_PATH ${ITEM} PATH) + string(REPLACE ${BASE} "" ITEM_PATH ${ITEM_PATH}) + install(FILES ${ITEM} + DESTINATION "include/${ITEM_PATH}" + COMPONENT Devel) + endforeach() + + + + + include(CMakePackageConfigHelpers) + #write_basic_package_version_file( + # "${CMAKE_CURRENT_BINARY_DIR}/${LIBRARY_NAME222}/${LIBRARY_NAME222}ConfigVersion.cmake" + # VERSION ${LIBRARY_VERSION} + # COMPATIBILITY AnyNewerVersion + #) + # + #export(EXPORT ${LIBRARY_NAME222}Targets + # FILE "${CMAKE_CURRENT_BINARY_DIR}/${LIBRARY_NAME222}/${LIBRARY_NAME222}Targets.cmake" + # NAMESPACE Upstream:: + #) + ##configure_file(cmake/${LIBRARY_NAME222}Config.cmake + ## "${CMAKE_CURRENT_BINARY_DIR}/${LIBRARY_NAME222}/${LIBRARY_NAME222}Config.cmake" + ## COPYONLY + ##) + + set(CONFIG_PACKAGE_LOCATION cmake/${LIBRARY_NAME222}) + install(EXPORT ${LIBRARY_NAME222}Targets + FILE + ${LIBRARY_NAME222}Targets.cmake + NAMESPACE + ${LIBRARY_NAME222}:: + DESTINATION + ${CONFIG_PACKAGE_LOCATION} + ) + #install( + # FILES + # cmake/${LIBRARY_NAME222}Config.cmake + # "${CMAKE_CURRENT_BINARY_DIR}/${LIBRARY_NAME222}/${LIBRARY_NAME222}ConfigVersion.cmake" + # DESTINATION + # ${CONFIG_PACKAGE_LOCATION} + # COMPONENT + # Devel + #) + message("CMAKE_INSTALL_LIBDIR===${CMAKE_INSTALL_LIBDIR}") + + +endfunction() + + +function(sdfsqdfqsdfqrezesrdtygfhsg LIST_OF_MODULE_AVAILLABLE) + include(CMakePackageConfigHelpers) + configure_package_config_file(cmake/${LIBRARY_NAME222}Config.cmake.in + "${PROJECT_BINARY_DIR}/${LIBRARY_NAME222}Config.cmake" + INSTALL_DESTINATION ${CONFIG_PACKAGE_LOCATION} + NO_SET_AND_CHECK_MACRO + NO_CHECK_REQUIRED_COMPONENTS_MACRO) + write_basic_package_version_file( + "${PROJECT_BINARY_DIR}/${LIBRARY_NAME222}ConfigVersion.cmake" + VERSION ${LIBRARY_VERSION} + COMPATIBILITY SameMajorVersion) + install( + FILES + "${PROJECT_BINARY_DIR}/${LIBRARY_NAME222}Config.cmake" + "${PROJECT_BINARY_DIR}/${LIBRARY_NAME222}ConfigVersion.cmake" + DESTINATION ${CONFIG_PACKAGE_LOCATION} + COMPONENT Devel) + + +endfunction() + + +function(GLD_generate_cmake_wrapping LIST_OF_MODULE_AVAILLABLE) + message("Generate cmake wrapping") + foreach(NAME_GLD_MODULE ${LIST_OF_MODULE_AVAILLABLE}) + GLD_get_module_name(LOCAL_MODULE_NAME ${NAME_GLD_MODULE}) + message("Import: ${NAME_GLD_MODULE}") + #MODULE_MAP_LIST_DEPENDENCE_RESOLVED + GLD_import(${NAME_GLD_MODULE}) + endforeach() + message("Generate cmake wrapping (DONE)") +endfunction() + + +## +## @brief List all folder in a specific inout folder. +## @param[out] VAR_OUT Result list of folders. +## @param[in] BASE_FOLDER Basic folder to parse. +## +function(sub_dir_list VAR_OUT BASE_FOLDER) + #message(" Search: ${BASE_FOLDER}" ) + file(GLOB children "${BASE_FOLDER}/*") + #message(" ==>>> ${children}" ) + set(dirlist "") + foreach(child ${children}) + #message(" - ${child}" ) + if(IS_DIRECTORY ${child}) + #message(" ==> is directory" ) + list(APPEND dirlist ${child}) + endif() + endforeach() + set(${VAR_OUT} ${dirlist} PARENT_SCOPE) +endfunction() + + +## +## @brief Recursive search of a specific patter (stop whan find the pattern in a folder. +## (have a limit of parsing ==> optimise resarch in a worktree). +## @param[out] VAR_OUT List of all files that corespond of the reg-exp +## @param[in] BASE_FOLDER Basic folder to parse. +## @param[in] REG_EXP Regular expression to search the data. +## @param[in] LIMIT Lismit of folder to recursively parse. +## +function(find_all_files VAR_OUT BASE_FOLDER REG_EXP LIMIT) + if (${LIMIT} LESS_EQUAL 0) + set(${VAR_OUT} "" PARENT_SCOPE) + return() + endif() + MATH(EXPR LIMIT "${LIMIT}-1") + get_filename_component(BASE_FOLDER ${BASE_FOLDER} ABSOLUTE) + #message("KK Search in subDiratory: ${BASE_FOLDER}/${REG_EXP}" ) + file(GLOB GLD_FILES "${BASE_FOLDER}/${REG_EXP}") + #message("Find file: '${GLD_FILES}'" ) + if("${GLD_FILES}" STREQUAL "") + #message("Search in subDiratory: ${BASE_FOLDER}" ) + # no element continue search... + set(SUBDIRS "") + sub_dir_list(SUBDIRS "${BASE_FOLDER}") + #message(" =!=> : ${SUBDIRS}" ) + foreach(ELEM ${SUBDIRS}) + get_filename_component(DIR_NAME_RELATIVE ${ELEM} NAME) + #message(" =!=> DIR_NAME_RELATIVE = ${DIR_NAME_RELATIVE}" ) + if("${DIR_NAME_RELATIVE}" STREQUAL ".git" OR "${DIR_NAME_RELATIVE}" STREQUAL ".island" OR "${DIR_NAME_RELATIVE}" STREQUAL "archive" OR "${DIR_NAME_RELATIVE}" STREQUAL "out" OR "${DIR_NAME_RELATIVE}" STREQUAL "target") + continue() + endif() + if("${ELEM}" STREQUAL "${BASE_FOLDER}" OR "${ELEM}" STREQUAL "${BASE_FOLDER}/") + continue() + endif() + #message(" element: ${ELEM}" ) + #message(" BASE_FOLDER: ${BASE_FOLDER}" ) + find_all_files(OUT_SUB_LIST "${ELEM}" "${REG_EXP}" ${LIMIT}) + list(APPEND GLD_FILES ${OUT_SUB_LIST}) + endforeach() + endif() + set(${VAR_OUT} ${GLD_FILES} PARENT_SCOPE) +endfunction() + + +function(GLD_get_full_dependency_group VAR_OUT VAR_OPTIONAL_OUT MY_JSON_STRING ELEMENT_TO_CHECK TYPE_VARIABLE) + set(LIST_VALUE "") + set(LIST_OPTIONAL_VALUE "") + json_get_type(TYPE ${MY_JSON_STRING} ${ELEMENT_TO_CHECK}) + #message("target type = ${TYPE}") + if (${TYPE} STREQUAL "OBJECT") + json_object_keys(LIST_KEY ${MY_JSON_STRING} ${ELEMENT_TO_CHECK}) + foreach (III ${LIST_KEY}) + # check the target, no need to had unknown target ... + if (${III} STREQUAL "*") + json_object_values(DATA_TARGET ${MY_JSON_STRING} ${ELEMENT_TO_CHECK} "*") + #message("target(*) data: ${DATA_TARGET}") + GLD_get_full_dependency(VAR_OUT_TMP LIST_OPTIONAL_VALUE_TMP DATA_TARGET) + list(APPEND LIST_VALUE ${DATA_TARGET}) + list(APPEND LIST_OPTIONAL_VALUE ${LIST_OPTIONAL_VALUE_TMP}) + elseif (${III} STREQUAL ${TYPE_VARIABLE}) + json_object_values(DATA_TARGET ${MY_JSON_STRING} ${ELEMENT_TO_CHECK} "${III}") + GLD_get_full_dependency(VAR_OUT_TMP LIST_OPTIONAL_VALUE_TMP DATA_TARGET) + #message("target(${III}) data: ${DATA_TARGET}") + list(APPEND LIST_VALUE ${VAR_OUT_TMP}) + list(APPEND LIST_OPTIONAL_VALUE ${LIST_OPTIONAL_VALUE_TMP}) + else() + message("TODO: get dependency manage '${ELEMENT_TO_CHECK}' : ${III}") + endif() + endforeach() + elseif(${TYPE} STREQUAL "NOTFOUND" OR ${TYPE} STREQUAL "NULL") + # nothing to do .. + else() + message("ERROR : '${ELEMENT_TO_CHECK}' can not be other than an json object : ${TYPE}") + endif() + set(${VAR_OUT} ${LIST_VALUE} PARENT_SCOPE) + set(${VAR_OPTIONAL_OUT} ${LIST_OPTIONAL_VALUE} PARENT_SCOPE) +endfunction() + + +## +## @brief Get the list of all dependency even if they are optional. +## @param[out] VAR_OUT list of dependency library +## @param[out] VAR_OPTIONAL_OUT list of optional dependency library +## @param[in] MY_JSON_STRING Json string +## @note This function is dependent of the target +## +function(GLD_get_full_dependency VAR_OUT VAR_OPTIONAL_OUT MY_JSON_STRING) + json_get_type(TYPE ${MY_JSON_STRING} "dependency") + set(LIST_VALUE "") + set(LIST_OPTIONAL_VALUE "") + #message("Dependency type = ${TYPE}") + if (${TYPE} STREQUAL "ARRAY") + json_size(SIZE ${MY_JSON_STRING} "dependency") + #message("Dependency SIZE = ${SIZE}") + json_get_data(OBJECT_DATA ${MY_JSON_STRING} "dependency") + MATH(EXPR SIZE "${SIZE}-1") + set(VAR_OUT_TMP "") + foreach(IDX RANGE ${SIZE}) + json_get_data(ELEMENT ${OBJECT_DATA} ${IDX}) + json_get_type(TYPE ${OBJECT_DATA} ${IDX}) + if (${TYPE} STREQUAL "STRING") + message(" - : ${ELEMENT}") + list(APPEND VAR_OUT_TMP ${ELEMENT}) + elseif (${TYPE} STREQUAL "OBJECT") + json_get_type(TYPE ${ELEMENT} "name") + if (${TYPE} STREQUAL "STRING") + json_get_data(DEPENDENCY_NAME ${ELEMENT} "name") + json_get_type(TYPE ${ELEMENT} "optional") + #message("optional type = ${TYPE} <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ${DEPENDENCY_NAME}") + if (${TYPE} STREQUAL "BOOLEAN") + json_get_data(DEPENDENCY_OPTIONAL ${ELEMENT} "optional") + if (${DEPENDENCY_OPTIONAL}) + message(" - : ${DEPENDENCY_NAME} (optional)") + #message("optional value ==========================> '${DEPENDENCY_OPTIONAL}' ==> MAYBE") + list(APPEND LIST_OPTIONAL_VALUE ${DEPENDENCY_NAME}) + else() + message(" - : ${DEPENDENCY_NAME}") + #message("optional value ==========================> '${DEPENDENCY_OPTIONAL}' ==> MUST") + list(APPEND VAR_OUT_TMP ${DEPENDENCY_NAME}) + endif() + else() + message(" - : ${DEPENDENCY_NAME}") + list(APPEND VAR_OUT_TMP ${DEPENDENCY_NAME}) + endif() + #message("optional type = ${TYPE} <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ${DEPENDENCY_NAME}") + else() + message("Dependency 'name' is not a string or is missing type: ${TYPE}") + endif() + else() + message("dependency element not manage data : ${ELEMENT}") + ## TODO add in dependency if optional : check if the element exit in the current module list ... + + endif() + endforeach() + list(APPEND LIST_VALUE ${VAR_OUT_TMP}) + endif() + + GLD_get_full_dependency_group(VAR_OUT_TMP LIST_OPTIONAL_VALUE_TMP MY_JSON_STRING "target" ${GLD_TARGET}) + list(APPEND LIST_VALUE ${VAR_OUT_TMP}) + list(APPEND LIST_OPTIONAL_VALUE ${LIST_OPTIONAL_VALUE_TMP}) + + GLD_get_full_dependency_group(VAR_OUT_TMP LIST_OPTIONAL_VALUE_TMP MY_JSON_STRING "mode" ${GLD_MODE}) + list(APPEND LIST_VALUE ${VAR_OUT_TMP}) + list(APPEND LIST_OPTIONAL_VALUE ${LIST_OPTIONAL_VALUE_TMP}) + + GLD_get_full_dependency_group(VAR_OUT_TMP LIST_OPTIONAL_VALUE_TMP MY_JSON_STRING "arch" ${GLD_ARCH}) + list(APPEND LIST_VALUE ${VAR_OUT_TMP}) + list(APPEND LIST_OPTIONAL_VALUE ${LIST_OPTIONAL_VALUE_TMP}) + + GLD_get_full_dependency_group(VAR_OUT_TMP LIST_OPTIONAL_VALUE_TMP MY_JSON_STRING "bus-size" ${GLD_BUS_SIZE}) + list(APPEND LIST_VALUE ${VAR_OUT_TMP}) + list(APPEND LIST_OPTIONAL_VALUE ${LIST_OPTIONAL_VALUE_TMP}) + + GLD_get_full_dependency_group(VAR_OUT_TMP LIST_OPTIONAL_VALUE_TMP MY_JSON_STRING "compilator" ${GLD_COMPILATOR}) + list(APPEND LIST_VALUE ${VAR_OUT_TMP}) + list(APPEND LIST_OPTIONAL_VALUE ${LIST_OPTIONAL_VALUE_TMP}) + + GLD_get_full_dependency_group(VAR_OUT_TMP LIST_OPTIONAL_VALUE_TMP MY_JSON_STRING "sanity-compilation" ${GLD_SANITY_MODE}) + list(APPEND LIST_VALUE ${VAR_OUT_TMP}) + list(APPEND LIST_OPTIONAL_VALUE ${LIST_OPTIONAL_VALUE_TMP}) + + set(${VAR_OUT} ${LIST_VALUE} PARENT_SCOPE) + set(${VAR_OPTIONAL_OUT} ${LIST_OPTIONAL_VALUE} PARENT_SCOPE) +endfunction() + + +function(GLD_read_json_file VAR_OUT JSON_FILE) + file(READ ${JSON_FILE} MY_JSON_STRING) + if("${MY_JSON_STRING}" STREQUAL "") + message(WARNING "Empty json file : '${JSON_FILE}'") + else() + string(REPLACE " " "" MY_JSON_STRING ${MY_JSON_STRING}) + string(REPLACE "\t" "" MY_JSON_STRING ${MY_JSON_STRING}) + string(REPLACE "\n" "" MY_JSON_STRING ${MY_JSON_STRING}) + endif() + set(${VAR_OUT} ${MY_JSON_STRING} PARENT_SCOPE) +endfunction() + + + +set(MODULE_MAP_LIST "" CACHE INTERNAL "") +set(MODULE_MAP_LIST_DEPENDENCE_RESOLVED "" CACHE INTERNAL "") + +function(GLD_get_module_name VAR_OUT BASE_NAME) + string(REPLACE "_" "_U_" TMP ${BASE_NAME}) + string(REPLACE "." "_D_" TMP ${BASE_NAME}) + string(REPLACE "-" "_S_" TMP ${TMP}) + set(${VAR_OUT} ${TMP} PARENT_SCOPE) +endfunction() + +function(GLD_add_module NAME_GLD_MODULE FOLDER FILENAME) + GLD_get_module_name(LOCAL_MODULE_NAME ${NAME_GLD_MODULE}) + message("Add module: ${LOCAL_MODULE_NAME} ==> ${NAME_GLD_MODULE} in ${FILENAME}") + + # load all the json data: + GLD_read_json_file(JSON_DATA "${FOLDER}/${FILENAME}.json") + if("${JSON_DATA}" STREQUAL "") + message(WARNING "SKIP library: ${NAME_GLD_MODULE}") + else() + set(MODULE_MAP_${LOCAL_MODULE_NAME}_FOLDER ${FOLDER} CACHE INTERNAL "") + set(MODULE_MAP_${LOCAL_MODULE_NAME}_FILENAME ${FILENAME} CACHE INTERNAL "") + set(MODULE_MAP_${LOCAL_MODULE_NAME}_NAME ${NAME_GLD_MODULE} CACHE INTERNAL "") + set(MODULE_MAP_LIST ${MODULE_MAP_LIST} ${NAME_GLD_MODULE} CACHE INTERNAL "") + + set(MODULE_MAP_${LOCAL_MODULE_NAME}_JSON "${JSON_DATA}" CACHE INTERNAL "") + endif() +endfunction() + +function(GLD_generate_module_without_optionnal_inexistant NAME_GLD_MODULE) + GLD_get_module_name(LOCAL_MODULE_NAME ${NAME_GLD_MODULE}) + #message("Call : GLD_get_full_dependency(outA, outB, ${MODULE_MAP_${LOCAL_MODULE_NAME}_JSON}) ${NAME_GLD_MODULE} ==> ${LOCAL_MODULE_NAME}") + GLD_get_full_dependency(DEPENDENCY DEPENDENCY_OPTIONAL ${MODULE_MAP_${LOCAL_MODULE_NAME}_JSON}) + set(MODULE_MAP_${LOCAL_MODULE_NAME}_DEPENDENCY ${DEPENDENCY} CACHE INTERNAL "") + set(MODULE_MAP_${LOCAL_MODULE_NAME}_DEPENDENCY_OPTIONAL ${DEPENDENCY_OPTIONAL} CACHE INTERNAL "") +endfunction() + + + +function(GLD_is_in_list VAR_OUT ELEM_TO_CHECK LIST_TO_CHECK) + set(ELEMENT_FIND "true") + #message(" verify '${ELEM_TO_CHECK}' in '${LIST_TO_CHECK}'") + foreach(ELEM ${LIST_TO_CHECK}) + if ("${ELEM_TO_CHECK}" STREQUAL "${ELEM}") + set(${VAR_OUT} "true" PARENT_SCOPE) + #message(" ==> true") + return() + endif() + endforeach() + set(${VAR_OUT} "false" PARENT_SCOPE) + #message(" ==> false") +endfunction() + +function(GLD_are_in_list VAR_OUT LIST_VALUES LIST_TO_CHECK) + set(ELEMENT_FIND "true") + #message(" verify '${LIST_VALUES}' are in '${LIST_TO_CHECK}'") + foreach(ELEM ${LIST_VALUES}) + GLD_is_in_list(EXIST "${ELEM}" "${LIST_TO_CHECK}") + if (${EXIST} STREQUAL "false") + set(${VAR_OUT} "false" PARENT_SCOPE) + #message(" =>> false") + return() + endif() + endforeach() + set(${VAR_OUT} "true" PARENT_SCOPE) + #message(" =>> true") +endfunction() + +## todo: REMOVE OPTIONNAL DEPENDENCY THAT DOES NOT EXIST IN THE LIST +## TODO: display and does not include element that dependency are not resolved and indicate which dependency is not found ... +function(GLD_order_dependency_list VAR_OUT DEPENDENCY_FAILED) + set(TMP_ORDERED "")####### crypto;edtaa3;luaWrapper;freetype;") + set(TMP_UN_ADDED "") + message("===========================================") + message("== STEP 1 : Add all module without dependency:") + message("===========================================") + # step 1 Add all module without dependency: + foreach(MODULE_ELEM ${MODULE_MAP_LIST}) + message("check add element : ${MODULE_ELEM}") + message(" dependency = '${MODULE_ELEM}'") + GLD_get_module_name(LOCAL_MODULE_NAME ${MODULE_ELEM}) + message(" dependency = '${MODULE_MAP_${LOCAL_MODULE_NAME}_DEPENDENCY}'") + # todo check dependency here ... ${MODULE_MAP_${LOCAL_MODULE_NAME}_DEPENDENCY} + list(LENGTH MODULE_MAP_${LOCAL_MODULE_NAME}_DEPENDENCY LIST_LENGTH) + message(" ==> length'${LIST_LENGTH}'") + if (LIST_LENGTH EQUAL 0) + message("Add element ${III} (0 dependency) ******** ") + list(APPEND TMP_ORDERED ${MODULE_ELEM}) + continue() + endif() + list(APPEND TMP_UN_ADDED ${MODULE_ELEM}) + endforeach() + message("result: ${TMP_ORDERED}") + message("===========================================") + message("== STEP 2 : Add all when the dependency are available in the list:") + message("===========================================") + # step 2 Add all when the dependency are available in the list: + list(LENGTH TMP_UN_ADDED LIST_TOTAL_LENGTH) + message("unadded : ${LIST_TOTAL_LENGTH}") + # must be resolved in the number of cycle in the list (maximum) + foreach(III RANGE ${LIST_TOTAL_LENGTH}) + message("cycle : ${III}") + set(TMP_UN_ADDED_TMP ${TMP_UN_ADDED}) + set(TMP_UN_ADDED "") + foreach(ELEM_TO_ADD ${TMP_UN_ADDED_TMP}) + message(" check to add : ${ELEM_TO_ADD}") + GLD_get_module_name(LOCAL_MODULE_NAME ${ELEM_TO_ADD}) + message(" dependency : ${MODULE_MAP_${LOCAL_MODULE_NAME}_DEPENDENCY} in ? ${TMP_ORDERED}") + GLD_are_in_list(IS_ALL_PRESENT "${MODULE_MAP_${LOCAL_MODULE_NAME}_DEPENDENCY}" "${TMP_ORDERED}") + if (${IS_ALL_PRESENT} STREQUAL "true") + message("Add element ${ELEM_TO_ADD} (depend: ${MODULE_MAP_${LOCAL_MODULE_NAME}_DEPENDENCY})") + list(APPEND TMP_ORDERED ${ELEM_TO_ADD}) + else() + list(APPEND TMP_UN_ADDED ${ELEM_TO_ADD}) + endif() + endforeach() + endforeach() + message("result:") + foreach(ELEM ${TMP_ORDERED}) + message(" - ${ELEM}") + endforeach() + message("===========================================") + message("== STEP 3 : All must be added before...") + message("===========================================") + # step 3 All must be added before... + list(LENGTH TMP_UN_ADDED LIST_TOTAL_LENGTH) + if (${LIST_TOTAL_LENGTH} GREATER_EQUAL 0) + message(WARNING "Some element are not added: (${LIST_TOTAL_LENGTH})") + foreach(ELEM ${TMP_UN_ADDED}) + message(" - ${ELEM}") + GLD_get_module_name(LOCAL_MODULE_NAME ${ELEM}) + message(" dep : ${MODULE_MAP_${LOCAL_MODULE_NAME}_DEPENDENCY}") + message(" dep(optional): ${MODULE_MAP_${LOCAL_MODULE_NAME}_DEPENDENCY_OPTIONAL}") + endforeach() + endif() + set(MODULE_MAP_LIST_DEPENDENCE_RESOLVED ${TMP_ORDERED} CACHE INTERNAL "") + set(${VAR_OUT} ${TMP_ORDERED} PARENT_SCOPE) + set(${DEPENDENCY_FAILED} ${TMP_UN_ADDED} PARENT_SCOPE) +endfunction() + + +function(GLD_load_all ROOT_FOLDER BASE_NAME COMMENT_ACTION) + message("Parse all files ${BASE_NAME}*.json: base: ${ROOT_FOLDER}") + #file(GLOB_RECURSE GLD_FILES "${ROOT_FOLDER}/GLD_*.json") + find_all_files(GLD_FILES "${ROOT_FOLDER}" "${BASE_NAME}*.json" 5) + message("List of GLD files:") + foreach(III ${GLD_FILES}) + GET_FILENAME_COMPONENT(FILENAME ${III} NAME_WE) + set(FULL_FILENAME ${FILENAME}) + string(REPLACE "${BASE_NAME}" "" FILENAME ${FILENAME}) + GET_FILENAME_COMPONENT(FOLDER ${III} DIRECTORY) + message(" - ${COMMENT_ACTION} ${FOLDER} ==> ${FILENAME}") + GLD_add_module(${FILENAME} ${FOLDER} ${FULL_FILENAME}) + endforeach() + #GLD_import("./" "etk-core") +endfunction() + +function(GLD_auto_prebuild_load_all ROOT_FOLDER) + GLD_load_all(${ROOT_FOLDER} "GLDPrebuild_${GLD_TARGET}_" "(prebuild)") +endfunction() + +function(GLD_auto_load_all ROOT_FOLDER) + GLD_load_all(${ROOT_FOLDER} "GLD_" "") +endfunction() + + +function(GLD_instanciate) + message("List of modules:") + foreach(III ${MODULE_MAP_LIST}) + GLD_get_module_name(LOCAL_MODULE_NAME ${III}) + message(" - ${III}") + endforeach() + foreach(III ${MODULE_MAP_LIST}) + GLD_get_module_name(LOCAL_MODULE_NAME ${III}) + GLD_generate_module_without_optionnal_inexistant(${III}) + message(" - ${III}") + message(" FOLDER=${MODULE_MAP_${LOCAL_MODULE_NAME}_FOLDER}") + #message(" JSON=${MODULE_MAP_${LOCAL_MODULE_NAME}_JSON}") + message(" DEPENDENCY=${MODULE_MAP_${LOCAL_MODULE_NAME}_DEPENDENCY}") + message(" DEPENDENCY_OPTIONAL=${MODULE_MAP_${LOCAL_MODULE_NAME}_DEPENDENCY_OPTIONAL}") + endforeach() + GLD_order_dependency_list(DEPENDENCY_ORDER DEPENDENCY_FAILED) + + GLD_generate_cmake_wrapping("${DEPENDENCY_ORDER}") + + #message("dependency resolver & ordered:") + #foreach(III ${DEPENDENCY_ORDER}) + # message(" - ${III}") + #endforeach() + + #message("dependency fail:") + #foreach(III ${DEPENDENCY_FAILED}) + # message(" - ${III}") + #endforeach() + +endfunction() + diff --git a/cmake/GLDPrebuild_Linux_alsa.json b/cmake/GLDPrebuild_Linux_alsa.json new file mode 100644 index 0000000..5dbb1f9 --- /dev/null +++ b/cmake/GLDPrebuild_Linux_alsa.json @@ -0,0 +1,19 @@ +{ + "type":"LIBRARY", + "sub-type":"PREBUILD", + "group-id":"gnu", + "description":"ALSA : Advanced Linux Sound Architecture", + "sanity-compilation": { + "intricate": { + "flag":{ + "c-link": "-lasound" + }, + "dependency":[ + "c" + ] + }, + "!intricate":{ + "error":true + } + } +} \ No newline at end of file diff --git a/cmake/GLDPrebuild_Linux_c.json b/cmake/GLDPrebuild_Linux_c.json new file mode 100644 index 0000000..8c4e341 --- /dev/null +++ b/cmake/GLDPrebuild_Linux_c.json @@ -0,0 +1,17 @@ +{ + "type":"LIBRARY", + "sub-type":"PREBUILD", + "group-id":"gnu", + "description":"C: Generic gnu C library", + "license":"LGPL", + "sanity-compilation": { + "intricate": { + "flag":[ + "c-remove": "-nostdinc" + ] + }, + "!intricate":{ + "error":true + } + } +} \ No newline at end of file diff --git a/cmake/GLDPrebuild_Linux_cxx.json b/cmake/GLDPrebuild_Linux_cxx.json new file mode 100644 index 0000000..991d4ea --- /dev/null +++ b/cmake/GLDPrebuild_Linux_cxx.json @@ -0,0 +1,23 @@ +{ + "type":"LIBRARY", + "sub-type":"PREBUILD", + "group-id":"gnu", + "description":"CXX: Generic gnu C++ library", + "license":"LGPL", + "sanity-compilation": { + "intricate": { + "flag":{ + "c++-remove": "-nostdlib", + "c++": "-D__STDCPP_GNU__" + }, + "dependency":[ + "c", + "m", + "pthread" + ] + }, + "!intricate":{ + "error":true + } + } +} \ No newline at end of file diff --git a/cmake/GLDPrebuild_Linux_m.json b/cmake/GLDPrebuild_Linux_m.json new file mode 100644 index 0000000..a9994a4 --- /dev/null +++ b/cmake/GLDPrebuild_Linux_m.json @@ -0,0 +1,20 @@ +{ + "type":"LIBRARY", + "sub-type":"PREBUILD", + "group-id":"gnu", + "description":"M: Generic math library", + "license":"LGPL", + "sanity-compilation": { + "intricate": { + "flag":{ + "c-link": "-lm" + }, + "dependency":[ + "c" + ] + }, + "!intricate":{ + "error":true + } + } +} \ No newline at end of file diff --git a/cmake/GLDPrebuild_Linux_opengl.json b/cmake/GLDPrebuild_Linux_opengl.json new file mode 100644 index 0000000..57bd84b --- /dev/null +++ b/cmake/GLDPrebuild_Linux_opengl.json @@ -0,0 +1,19 @@ +{ + "type":"LIBRARY", + "sub-type":"PREBUILD", + "group-id":"org.opengl", + "description":"OpenGL: Generic graphic library", + "sanity-compilation": { + "intricate": { + "flag":{ + "c-link": "-lGL" + }, + "dependency":[ + "c" + ] + }, + "!intricate":{ + "error":true + } + } +} \ No newline at end of file diff --git a/cmake/GLDPrebuild_Linux_pthread.json b/cmake/GLDPrebuild_Linux_pthread.json new file mode 100644 index 0000000..3db5a85 --- /dev/null +++ b/cmake/GLDPrebuild_Linux_pthread.json @@ -0,0 +1,20 @@ +{ + "type":"LIBRARY", + "sub-type":"PREBUILD", + "group-id":"gnu", + "description":"pthread: Generic multithreading system", + "license":"LGPL", + "sanity-compilation": { + "intricate": { + "flag":{ + "c-link": "-lpthread" + }, + "dependency":[ + "c" + ] + }, + "!intricate":{ + "error":true + } + } +} \ No newline at end of file diff --git a/cmake/GLDPrebuild_Linux_z.json b/cmake/GLDPrebuild_Linux_z.json new file mode 100644 index 0000000..7536022 --- /dev/null +++ b/cmake/GLDPrebuild_Linux_z.json @@ -0,0 +1,19 @@ +{ + "type":"LIBRARY", + "sub-type":"PREBUILD", + "group-id":"gnu", + "description":"Z : z library ", + "sanity-compilation": { + "intricate": { + "flag":{ + "c-link": "-lz" + }, + "dependency":[ + "c" + ] + }, + "!intricate":{ + "error":true + } + } +} \ No newline at end of file diff --git a/lutin/moduleGLD.py b/lutin/moduleGLD.py index 561abe8..e9a43d1 100644 --- a/lutin/moduleGLD.py +++ b/lutin/moduleGLD.py @@ -118,6 +118,9 @@ list_of_element_availlable=[ "xxx/plouf.java" ], "source": { + "*": [ + ... + ], "c": [ ... ], @@ -138,13 +141,18 @@ list_of_element_availlable=[ "xxx/YuyTer.hpp" ] }, + ############## TODO: rename "include" "path":[ "." ], - "compilation-version": { + "compilation-version": { ## old ==> to remove "language": "c++", "version": 2017 }, + "compilation-version": { + "c++": 2017, + "java": 16 + }, "dependency": [ "c", "m", @@ -282,9 +290,16 @@ list_of_element_availlable=[ }, "intricate": { - + } + }, + "instruction-set":{ + not present right now... :the instruction mode available...: } + #### TODO: later + "import": [ + "GDSFGH.json" ## import an other file to have generic definitions ... + ] } get_compilator diff --git a/lutin/z_system/lutinSystem_Linux_cxx.py b/lutin/z_system/lutinSystem_Linux_cxx.py index 1150ff3..591700c 100644 --- a/lutin/z_system/lutinSystem_Linux_cxx.py +++ b/lutin/z_system/lutinSystem_Linux_cxx.py @@ -30,7 +30,7 @@ class System(system.System): self.add_flag("c++", "-D__STDCPP_GNU__") if env.get_isolate_system() == False: self.add_flag("c++-remove", "-nostdlib") - self.add_flag("need-libstdc++", True) + self.add_flag("need-libstdc++", True) # regarder a quoi ca sert !!!! else: self.add_flag("link-lib", "stdc++") compilator_gcc = "g++"