Browse Source

refactor: 调整了cmake的文件结构

各个文件夹下均放置cmake文件
按功能划分动态库
clib不直接链接进入vmcore
cmake自动设定环境变量
cmake安装vmlib
SongZihuan 4 years ago
parent
commit
78b0f36539
45 changed files with 302 additions and 93 deletions
  1. 3 3
      CMakeLists.txt
  2. 23 48
      vmcore/CMakeLists.txt
  3. 10 0
      vmcore/file/CMakeLists.txt
  4. 10 0
      vmcore/gc/CMakeLists.txt
  5. 1 1
      vmcore/include/clib.h
  6. 13 1
      vmcore/include/inter.h
  7. 11 0
      vmcore/md5/CMakeLists.txt
  8. 10 0
      vmcore/memory/CMakeLists.txt
  9. 7 0
      vmcore/ofunc/CMakeLists.txt
  10. 12 0
      vmcore/ofunc/clib/CMakeLists.txt
  11. 0 6
      vmcore/ofunc/clib/lib.h
  12. 52 16
      vmcore/ofunc/clib/manager.c
  13. 16 0
      vmcore/ofunc/clib/src/CMakeLists.txt
  14. 2 2
      vmcore/ofunc/clib/src/sys_lib.c
  15. 2 2
      vmcore/ofunc/clib/src/time_lib.c
  16. 0 1
      vmcore/ofunc/include/__ofunc.h
  17. 14 0
      vmcore/ofunc/src/CMakeLists.txt
  18. 1 10
      vmcore/ofunc/src/__ofunc.c
  19. 16 0
      vmcore/ofunc/src/vmobj/CMakeLists.txt
  20. 0 0
      vmcore/ofunc/src/vmobj/bool.c
  21. 0 0
      vmcore/ofunc/src/vmobj/dict.c
  22. 0 0
      vmcore/ofunc/src/vmobj/dictiter.c
  23. 0 0
      vmcore/ofunc/src/vmobj/dou.c
  24. 0 0
      vmcore/ofunc/src/vmobj/error_.c
  25. 0 0
      vmcore/ofunc/src/vmobj/file_.c
  26. 0 0
      vmcore/ofunc/src/vmobj/function.c
  27. 0 0
      vmcore/ofunc/src/vmobj/int.c
  28. 0 0
      vmcore/ofunc/src/vmobj/io.c
  29. 0 0
      vmcore/ofunc/src/vmobj/lib_.c
  30. 0 0
      vmcore/ofunc/src/vmobj/list.c
  31. 0 0
      vmcore/ofunc/src/vmobj/listiter.c
  32. 0 0
      vmcore/ofunc/src/vmobj/object.c
  33. 0 0
      vmcore/ofunc/src/vmobj/pass.c
  34. 0 0
      vmcore/ofunc/src/vmobj/pointer.c
  35. 0 0
      vmcore/ofunc/src/vmobj/str.c
  36. 0 0
      vmcore/ofunc/src/vmobj/struct_.c
  37. 0 0
      vmcore/ofunc/src/vmobj/sys.c
  38. 0 0
      vmcore/ofunc/src/vmobj/vobject.c
  39. 11 0
      vmcore/parser/CMakeLists.txt
  40. 1 1
      vmcore/parser/syntax.c
  41. 10 0
      vmcore/signalhandler/CMakeLists.txt
  42. 43 0
      vmcore/src/CMakeLists.txt
  43. 32 0
      vmcore/src/inter.c
  44. 1 1
      vmcore/src/runfile.c
  45. 1 1
      vmcore/vmlib/hello.vm

+ 3 - 3
CMakeLists.txt

@@ -56,9 +56,9 @@ IF (PG)
 ENDIF()
 
 ADD_EXECUTABLE(VirtualMath main.c ${SRC_LIST})
-TARGET_LINK_LIBRARIES(VirtualMath vmcore)
-TARGET_INCLUDE_DIRECTORIES(vmcore PRIVATE HELLOVM_INCLUDE_DICT)
-ADD_DEPENDENCIES(VirtualMath vmcore)  # 添加依赖关系
+TARGET_LINK_LIBRARIES(VirtualMath vmcore_src)
+TARGET_INCLUDE_DIRECTORIES(vmcore_src PRIVATE HELLOVM_INCLUDE_DICT)
+ADD_DEPENDENCIES(VirtualMath vmcore_src)  # 添加依赖关系
 SET_TARGET_PROPERTIES(VirtualMath PROPERTIES
         OUTPUT_NAME "hellovm"  # 设置输出名
         INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib"  # 设置rpath

+ 23 - 48
vmcore/CMakeLists.txt

@@ -4,28 +4,14 @@ SET(CMAKE_C_STANDARD 11)
 
 SET(VMCORE_INCLUDE_DICT
         ${vmcore_SOURCE_DIR}/include
-        ${vmcore_SOURCE_DIR}/parser/include
         ${vmcore_SOURCE_DIR}/src/include
         ${vmcore_SOURCE_DIR}/ofunc/include
-        ${vmcore_SOURCE_DIR}/md5/include
-        ${vmcore_SOURCE_DIR}/ofunc/clib/include
         )
 
 SET(VMCORE_SRC_DIR
-        ${vmcore_SOURCE_DIR}/memory
         ${vmcore_SOURCE_DIR}/src
-        ${vmcore_SOURCE_DIR}/gc
-        ${vmcore_SOURCE_DIR}/file
-        ${vmcore_SOURCE_DIR}/parser
-        ${vmcore_SOURCE_DIR}/ofunc/src
-        ${vmcore_SOURCE_DIR}/ofunc/clib
-        ${vmcore_SOURCE_DIR}/signalhandler
-        ${vmcore_SOURCE_DIR}/md5
         )
 
-# 添加头文件
-INCLUDE_DIRECTORIES(${VMCORE_INCLUDE_DICT} BEFORE)
-
 # 搜索源文件
 FOREACH(DIR ${VMCORE_SRC_DIR})
     SET(TMP)  # 清空
@@ -34,38 +20,27 @@ FOREACH(DIR ${VMCORE_SRC_DIR})
 ENDFOREACH()
 MESSAGE(STATUS "vmcore src list = ${SRC}")
 
-# 处理依赖库
-FIND_PATH(ffih ffi.h REQUIRED)
-INCLUDE_DIRECTORIES(${ffih})
-
-FIND_LIBRARY(libffi NAMES ffi REQUIRED)
-FIND_LIBRARY(libdl NAMES dl REQUIRED)
-
-IF (libffi AND ffih)
-    MESSAGE(STATUS "libffi = ${libffi} ffi.h in ${ffih}")
-ELSE()
-    MESSAGE(FATAL_ERROR "not found libffi or ffi.h")
-ENDIF()
+# 处理内部依赖库
+ADD_SUBDIRECTORY(${vmcore_SOURCE_DIR}/signalhandler)
+ADD_SUBDIRECTORY(${vmcore_SOURCE_DIR}/parser)
+ADD_SUBDIRECTORY(${vmcore_SOURCE_DIR}/memory)
+ADD_SUBDIRECTORY(${vmcore_SOURCE_DIR}/md5)
+ADD_SUBDIRECTORY(${vmcore_SOURCE_DIR}/gc)
+ADD_SUBDIRECTORY(${vmcore_SOURCE_DIR}/file)
+ADD_SUBDIRECTORY(${vmcore_SOURCE_DIR}/ofunc)
 
-IF (libdl)
-    MESSAGE(STATUS "libdl = ${libdl}")
-ELSE()
-    MESSAGE(FATAL_ERROR "not found libdl")
-ENDIF()
-
-IF (PG)
-    ADD_COMPILE_OPTIONS(-pg)
-    ADD_LINK_OPTIONS(-pg)
-    ADD_LIBRARY(vmcore STATIC ${SRC})  ## debug模式下, 以静态库形式链接
-ELSE()
-    ADD_LIBRARY(vmcore SHARED ${SRC})
-ENDIF()
-
-TARGET_LINK_LIBRARIES(vmcore ${libffi} ${libdl} m)
-TARGET_INCLUDE_DIRECTORIES(vmcore PRIVATE VMCORE_INCLUDE_DICT)
-SET_TARGET_PROPERTIES(vmcore PROPERTIES
-        PUBLIC_HEADER ${vmcore_SOURCE_DIR}/include/virtualmath.h  # 设置public的头文件
-        OUTPUT_NAME "vmcore"  # 设置输出名
-        VERSION 3.1  # 设置版本号
-        )
-INSTALL(TARGETS vmcore)
+# 添加头文件
+INCLUDE_DIRECTORIES(${VMCORE_INCLUDE_DICT} BEFORE)
+INCLUDE_DIRECTORIES(${OFUNC_INCLUDE_DICT} BEFORE)
+MESSAGE(STATUS "VMCORE_INCLUDE_DICT = ${VMCORE_INCLUDE_DICT}")
+
+# 编译和链接vmcore
+ADD_SUBDIRECTORY(${vmcore_SOURCE_DIR}/src)
+TARGET_LINK_LIBRARIES(vmcore_src vm_signal vm_parser vm_memory vm_md5 vm_gc vm_clib vm_obj vm_file)
+
+# 安装vmlib
+SET(VMLIB_PATH ${CMAKE_INSTALL_PREFIX}/vmlib)
+SET(CLIB_PATH ${CMAKE_INSTALL_PREFIX}/lib)
+INSTALL(DIRECTORY ${vmcore_SOURCE_DIR}/vmlib/ DESTINATION ${VMLIB_PATH})
+INSTALL(CODE "SET(ENV{VIRTUALMATHPATH} \"${VMLIB_PATH},${CLIB_PATH}\")")  # 设置系统环境变量(安装时候执行)
+INSTALL(CODE "MESSAGE(STATUS \"Now Install\")")  # 安装时运行

+ 10 - 0
vmcore/file/CMakeLists.txt

@@ -0,0 +1,10 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 3.16)
+PROJECT(vm_file C)
+SET(CMAKE_C_STANDARD 11)
+
+INCLUDE_DIRECTORIES(${VMCORE_INCLUDE_DICT} BEFORE)
+AUX_SOURCE_DIRECTORY(${vm_file_SOURCE_DIR} VM_FILE_SRC)
+
+ADD_LIBRARY(vm_file SHARED ${VM_FILE_SRC})
+SET_TARGET_PROPERTIES(vm_file PROPERTIES OUTPUT_NAME "vmio")
+INSTALL(TARGETS vm_file)

+ 10 - 0
vmcore/gc/CMakeLists.txt

@@ -0,0 +1,10 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 3.16)
+PROJECT(vm_gc C)
+SET(CMAKE_C_STANDARD 11)
+
+INCLUDE_DIRECTORIES(${VMCORE_INCLUDE_DICT} BEFORE)
+AUX_SOURCE_DIRECTORY(${vm_gc_SOURCE_DIR} VM_GC_SRC)
+
+ADD_LIBRARY(vm_gc SHARED ${VM_GC_SRC})
+SET_TARGET_PROPERTIES(vm_gc PROPERTIES OUTPUT_NAME "vmgc")
+INSTALL(TARGETS vm_gc)

+ 1 - 1
vmcore/include/clib.h

@@ -5,5 +5,5 @@
 struct Inter;
 struct LinkValue;
 void importClibCore(char *file, struct LinkValue *belong, FUNC_CORE);
-bool checkCLib(char *file);
+bool checkCLib(char **file);
 #endif //VIRTUALMATH_CLIB_H

+ 13 - 1
vmcore/include/inter.h

@@ -93,6 +93,11 @@ struct Result;
 #define M_NOT (44)
 #define M_NEGATE (45)
 
+struct ClibInfo {
+    void *dl;
+    struct ClibInfo *next;
+};
+
 struct Inter{
     struct Value *base;
     struct LinkValue *link_base;
@@ -100,7 +105,7 @@ struct Inter{
     struct Var *base_var;
     struct LinkValue *base_belong;
     struct Package *package;
-
+    struct ClibInfo *clib_info;
     struct VarList *var_list;
     struct InterData{
         FILE *inter_stdout;
@@ -143,6 +148,7 @@ struct Inter{
 typedef struct Inter Inter;
 typedef struct Statement Statement;
 typedef enum ResultType ResultType;
+typedef struct ClibInfo ClibInfo;
 
 Inter *makeInter(char *out, char *error_, char *in, LinkValue *belong);
 void freeInter(Inter *inter, bool show_gc);
@@ -152,4 +158,10 @@ void runCodeFile(Inter *inter, char *file[]);
 bool runParser(char *code_file, Inter *inter, bool is_one, Statement **st);
 void mergeInter(Inter *new, Inter *base);
 Inter *deriveInter(LinkValue *belong, Inter *inter);
+
+ClibInfo *makeClibInfo();
+void makeClibInfoToInter(void *dl, Inter *inter);
+ClibInfo *freeClibInfo(ClibInfo *info);
+void freeClibInfoFromInter(Inter *inter);
+
 #endif //VIRTUALMATH_INTER_H

+ 11 - 0
vmcore/md5/CMakeLists.txt

@@ -0,0 +1,11 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 3.16)
+PROJECT(vm_md5 C)
+SET(CMAKE_C_STANDARD 11)
+
+INCLUDE_DIRECTORIES(${VMCORE_INCLUDE_DICT} BEFORE)
+INCLUDE_DIRECTORIES(${vm_md5_SOURCE_DIR}/include BEFORE)
+AUX_SOURCE_DIRECTORY(${vm_md5_SOURCE_DIR} VM_MD5_SRC)
+
+ADD_LIBRARY(vm_md5 SHARED ${VM_MD5_SRC})
+SET_TARGET_PROPERTIES(vm_md5 PROPERTIES OUTPUT_NAME "md5")
+INSTALL(TARGETS vm_md5)

+ 10 - 0
vmcore/memory/CMakeLists.txt

@@ -0,0 +1,10 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 3.16)
+PROJECT(vm_memory C)
+SET(CMAKE_C_STANDARD 11)
+
+INCLUDE_DIRECTORIES(${VMCORE_INCLUDE_DICT} BEFORE)
+AUX_SOURCE_DIRECTORY(${vm_memory_SOURCE_DIR} VM_MEM_SRC)
+
+ADD_LIBRARY(vm_memory SHARED ${VM_MEM_SRC})
+SET_TARGET_PROPERTIES(vm_memory PROPERTIES OUTPUT_NAME "mem")
+INSTALL(TARGETS vm_memory)

+ 7 - 0
vmcore/ofunc/CMakeLists.txt

@@ -0,0 +1,7 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 3.16)
+PROJECT(vm_ofunc C)
+SET(CMAKE_C_STANDARD 11)
+
+SET(OFUNC_INCLUDE_DICT ${PROJECT_SOURCE_DIR}/include)
+ADD_SUBDIRECTORY(${vm_ofunc_SOURCE_DIR}/clib)
+ADD_SUBDIRECTORY(${vm_ofunc_SOURCE_DIR}/src)

+ 12 - 0
vmcore/ofunc/clib/CMakeLists.txt

@@ -0,0 +1,12 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 3.16)
+PROJECT(vm_clib C)
+SET(CMAKE_C_STANDARD 11)
+
+INCLUDE_DIRECTORIES(${VMCORE_INCLUDE_DICT} BEFORE)
+INCLUDE_DIRECTORIES(${OFUNC_INCLUDE_DICT} BEFORE)
+
+ADD_LIBRARY(vm_clib SHARED ${vm_clib_SOURCE_DIR}/manager)
+SET_TARGET_PROPERTIES(vm_clib PROPERTIES OUTPUT_NAME "clib")
+
+ADD_SUBDIRECTORY(${vm_clib_SOURCE_DIR}/src)
+INSTALL(TARGETS vm_clib)

+ 0 - 6
vmcore/ofunc/clib/lib.h

@@ -1,6 +0,0 @@
-#ifndef VIRTUALMATH_LIB_H
-#define VIRTUALMATH_LIB_H
-#include "__ofunc.h"
-void registeredSysLib(R_FUNC);
-void registeredTimeLib(R_FUNC);
-#endif //VIRTUALMATH_LIB_H

+ 52 - 16
vmcore/ofunc/clib/manager.c

@@ -1,23 +1,59 @@
 #include "__virtualmath.h"
-#include "lib.h"
 
-static struct InFo{
-    char *name;
-    Registered reg;
-} ManagerInFo[] = {{"sys", registeredSysLib},
-                   {"time", registeredTimeLib},
-                   {NULL, NULL}};
-
-bool checkCLib(char *file) {
-    for (struct InFo *info = ManagerInFo; info->name != NULL; info++)
-        if (eqString(file, info->name))
-            return true;
-    return false;
+#define CHECK_CLIB(path, dl) ((dl = dlopen(path, RTLD_NOW)) != NULL) && (dlsym(dl, "registered") != NULL)
+
+bool checkCLib(char **file) {
+    char *lib_file = strncmp(*file, "libvm", 5) == 0 ? memStrcpy(*file) : memStrcatIter("libvm", false, *file, ".so", NULL);
+    bool return_ = false;
+    void *tmp_dl;
+
+    char arr_cwd[200];
+    char *p_cwd = NULL;
+    getcwd(arr_cwd, 200);
+    p_cwd = memStrcatIter(arr_cwd, false, SEP, lib_file, NULL);  // 以NULL结尾表示结束
+    if (CHECK_CLIB(p_cwd, tmp_dl)) {
+        return_ = true;
+        dlclose(tmp_dl);
+    }
+    memFree(p_cwd);
+
+
+    if (!return_) {
+        char *path = memStrcpy(getenv("VIRTUALMATHPATH"));
+        for (char *tmp = strtok(path, ";"), *new_dir; tmp != NULL; tmp = strtok(NULL, ";")) {
+            if (*(tmp + (memStrlen(tmp) - 1)) != SEP_CH)
+                new_dir = memStrcatIter(tmp, false, SEP, lib_file, NULL);  // 以NULL结尾表示结束
+            else
+                new_dir = memStrcat(tmp, lib_file, false, false);
+
+            if (CHECK_CLIB(new_dir, tmp_dl)) {
+                return_ = true;
+                dlclose(tmp_dl);
+            }
+            memFree(new_dir);
+        }
+        memFree(path);
+    }
+
+    if (return_) {
+        memFree(*file);
+        *file = lib_file;
+    } else
+        memFree(lib_file);
+    return return_;
 }
+#undef CHECK_CLIB
 
 void importClibCore(char *file, struct LinkValue *belong, FUNC_CORE){
-    for (struct InFo *info = ManagerInFo; info->name != NULL; info++) {
-        if (eqString(file, info->name))
-            info->reg(CR_FUNC(belong, var_list));
+    void *dl;
+    Registered reg;
+    if (file != NULL) {
+        dl = dlopen(file, RTLD_NOW);
+        reg = dlsym(dl, "registered");
+        if (reg != NULL) {
+            reg(CR_FUNC(belong, var_list));
+            makeClibInfoToInter(dl, inter);
+        } else
+            dlclose(dl);
     }
 }

+ 16 - 0
vmcore/ofunc/clib/src/CMakeLists.txt

@@ -0,0 +1,16 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 3.16)
+PROJECT(vm_clib_src C)
+SET(CMAKE_C_STANDARD 11)
+
+INCLUDE_DIRECTORIES(${VMCORE_INCLUDE_DICT} BEFORE)
+INCLUDE_DIRECTORIES(${OFUNC_INCLUDE_DICT} BEFORE)
+
+FUNCTION(SET_CLIB PATH NAME)  # clib 编译为动态库, 但是不直接链接进入程序
+    STRING(REGEX REPLACE ".+/(.+)\\..*" "\\1" FILE_NAME ${PATH})
+    ADD_LIBRARY(${FILE_NAME} SHARED ${PATH})
+    SET_TARGET_PROPERTIES(${FILE_NAME} PROPERTIES OUTPUT_NAME "vm${NAME}")
+    INSTALL(TARGETS ${FILE_NAME})
+ENDFUNCTION()
+
+SET_CLIB(sys_lib.c sys)
+SET_CLIB(time_lib.c time)

+ 2 - 2
vmcore/ofunc/clib/sys_lib.c → vmcore/ofunc/clib/src/sys_lib.c

@@ -1,4 +1,4 @@
-#include "lib.h"
+#include "__ofunc.h"
 
 static ResultType vm_setNowRunCore(O_FUNC, bool type){
     LinkValue *function_value = NULL;
@@ -215,7 +215,7 @@ static ResultType vm_exec(O_FUNC){
     return result->type;
 }
 
-void registeredSysLib(R_FUNC){
+void registered(R_FUNC){
     NameFunc tmp[] = {{L"is_now_run",             vm_isnowrun,       fp_no_, .var=nfv_notpush},
                       {L"dis_now_run",            vm_disnowrun,      fp_no_, .var=nfv_notpush},
                       {L"quit",                   vm_quit,           fp_no_, .var=nfv_notpush},

+ 2 - 2
vmcore/ofunc/clib/sys_time.c → vmcore/ofunc/clib/src/time_lib.c

@@ -1,4 +1,4 @@
-#include "lib.h"
+#include "__ofunc.h"
 
 static ResultType vm_selfunCore(O_FUNC){
     time_t t;
@@ -12,7 +12,7 @@ static ResultType vm_selfunCore(O_FUNC){
     return result->type;
 }
 
-void registeredTimeLib(R_FUNC){
+void registered(R_FUNC){
     NameFunc tmp[] = {{L"time", vm_selfunCore, fp_no_, .var=nfv_notpush},
                       {NULL, NULL}};
     iterBaseNameFunc(tmp, belong, CFUNC_CORE(var_list));

+ 0 - 1
vmcore/ofunc/include/__ofunc.h

@@ -4,7 +4,6 @@
 #include "__base.h"
 #include "__run.h"
 
-void newObjectSettingPresetting(LinkValue *func, LinkValue *name, Inter *inter);
 LinkValue *registeredFunctionCore(OfficialFunction of, wchar_t *name, enum NameFuncVar nfv, FUNC_NT);
 
 bool iterNameFunc(NameFunc *list, FUNC_NT);

+ 14 - 0
vmcore/ofunc/src/CMakeLists.txt

@@ -0,0 +1,14 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 3.16)
+PROJECT(vm_obj C)
+SET(CMAKE_C_STANDARD 11)
+
+ADD_SUBDIRECTORY(${vm_obj_SOURCE_DIR}/vmobj)
+
+INCLUDE_DIRECTORIES(${VMCORE_INCLUDE_DICT} BEFORE)
+INCLUDE_DIRECTORIES(${OFUNC_INCLUDE_DICT} BEFORE)
+AUX_SOURCE_DIRECTORY(${vm_obj_SOURCE_DIR} VM_OBJ_SRC)
+
+ADD_LIBRARY(vm_obj SHARED ${VM_OBJ_SRC})
+TARGET_LINK_LIBRARIES(vm_obj ${OBJ_LIST})  # 基础的obj类型直接链接
+SET_TARGET_PROPERTIES(vm_obj PROPERTIES OUTPUT_NAME "vmobj")
+INSTALL(TARGETS vm_obj)

+ 1 - 10
vmcore/ofunc/src/__ofunc.c

@@ -130,13 +130,4 @@ void addBaseClassVar(wchar_t *name, LinkValue *obj, LinkValue *belong, Inter *in
     if (!RUN_TYPE(result.type))
         printError(&result, inter, true);
     freeResult(&result);
-}
-
-void newObjectSettingPresetting(LinkValue *func, LinkValue *name, Inter *inter) {
-    Result result;
-    setResultCore(&result);
-    newObjectSetting(name, LINEFILE, func, &result, inter, NULL);
-    if (RUN_TYPE(result.type))
-        printError(&result, inter, true);
-    freeResult(&result);
-}
+}

+ 16 - 0
vmcore/ofunc/src/vmobj/CMakeLists.txt

@@ -0,0 +1,16 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 3.16)
+SET(CMAKE_C_STANDARD 11)
+
+INCLUDE_DIRECTORIES(${VMCORE_INCLUDE_DICT} BEFORE)
+INCLUDE_DIRECTORIES(${OFUNC_INCLUDE_DICT} BEFORE)
+
+SET(_OBJ_LIST)
+AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR} SRC_FILES)
+FOREACH(FILE_PATH ${SRC_FILES})
+    STRING(REGEX REPLACE ".+/(.+)\\..*" "\\1" FILE_NAME ${FILE_PATH})
+    ADD_LIBRARY(${FILE_NAME} SHARED ${FILE_PATH})
+    SET(_OBJ_LIST ${_OBJ_LIST} ${FILE_NAME})
+    SET_TARGET_PROPERTIES(${FILE_NAME} PROPERTIES OUTPUT_NAME ${FILE_NAME})
+    INSTALL(TARGETS ${FILE_NAME})
+ENDFOREACH(FILE_PATH)
+SET(OBJ_LIST ${_OBJ_LIST} CACHE INTERNAL "OBJ_LIST" FORCE)  # 作为全局变量

+ 0 - 0
vmcore/ofunc/src/bool.c → vmcore/ofunc/src/vmobj/bool.c


+ 0 - 0
vmcore/ofunc/src/dict.c → vmcore/ofunc/src/vmobj/dict.c


+ 0 - 0
vmcore/ofunc/src/dictiter.c → vmcore/ofunc/src/vmobj/dictiter.c


+ 0 - 0
vmcore/ofunc/src/dou.c → vmcore/ofunc/src/vmobj/dou.c


+ 0 - 0
vmcore/ofunc/src/error_.c → vmcore/ofunc/src/vmobj/error_.c


+ 0 - 0
vmcore/ofunc/src/file_.c → vmcore/ofunc/src/vmobj/file_.c


+ 0 - 0
vmcore/ofunc/src/function.c → vmcore/ofunc/src/vmobj/function.c


+ 0 - 0
vmcore/ofunc/src/int.c → vmcore/ofunc/src/vmobj/int.c


+ 0 - 0
vmcore/ofunc/src/io.c → vmcore/ofunc/src/vmobj/io.c


+ 0 - 0
vmcore/ofunc/src/lib_.c → vmcore/ofunc/src/vmobj/lib_.c


+ 0 - 0
vmcore/ofunc/src/list.c → vmcore/ofunc/src/vmobj/list.c


+ 0 - 0
vmcore/ofunc/src/listiter.c → vmcore/ofunc/src/vmobj/listiter.c


+ 0 - 0
vmcore/ofunc/src/object.c → vmcore/ofunc/src/vmobj/object.c


+ 0 - 0
vmcore/ofunc/src/pass.c → vmcore/ofunc/src/vmobj/pass.c


+ 0 - 0
vmcore/ofunc/src/pointer.c → vmcore/ofunc/src/vmobj/pointer.c


+ 0 - 0
vmcore/ofunc/src/str.c → vmcore/ofunc/src/vmobj/str.c


+ 0 - 0
vmcore/ofunc/src/struct_.c → vmcore/ofunc/src/vmobj/struct_.c


+ 0 - 0
vmcore/ofunc/src/sys.c → vmcore/ofunc/src/vmobj/sys.c


+ 0 - 0
vmcore/ofunc/src/vobject.c → vmcore/ofunc/src/vmobj/vobject.c


+ 11 - 0
vmcore/parser/CMakeLists.txt

@@ -0,0 +1,11 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 3.16)
+PROJECT(vm_parser C)
+SET(CMAKE_C_STANDARD 11)
+
+INCLUDE_DIRECTORIES(${VMCORE_INCLUDE_DICT} BEFORE)
+INCLUDE_DIRECTORIES(${vm_parser_SOURCE_DIR}/include BEFORE)
+AUX_SOURCE_DIRECTORY(${vm_parser_SOURCE_DIR} VM_PARSER_SRC)
+
+ADD_LIBRARY(vm_parser SHARED ${VM_PARSER_SRC})
+SET_TARGET_PROPERTIES(vm_parser PROPERTIES OUTPUT_NAME "parser")
+INSTALL(TARGETS vm_parser)

+ 1 - 1
vmcore/parser/syntax.c

@@ -368,7 +368,7 @@ int getMatherStatus(LexFile *file, LexMathers *mathers) {
         strMatherMacro(MATHER_REGO, "fall");
         strMatherMacro(MATHER_RESTART, "restart");
         strMatherMacro(MATHER_RETURN, "return");
-        strMatherMacro(MATHER_YIELD, "pause");
+        strMatherMacro(MATHER_YIELD, "yield");
         strMatherMacro(MATHER_IMPORT, "import");
         strMatherMacro(MATHER_INCLUDE, "include");
 

+ 10 - 0
vmcore/signalhandler/CMakeLists.txt

@@ -0,0 +1,10 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 3.16)
+PROJECT(vm_signal C)
+SET(CMAKE_C_STANDARD 11)
+
+INCLUDE_DIRECTORIES(${VMCORE_INCLUDE_DICT} BEFORE)
+AUX_SOURCE_DIRECTORY(${vm_signal_SOURCE_DIR} VM_SIGNAL_SRC)
+
+ADD_LIBRARY(vm_signal SHARED ${VM_SIGNAL_SRC})
+SET_TARGET_PROPERTIES(vm_signal PROPERTIES OUTPUT_NAME "signal")
+INSTALL(TARGETS vm_signal)

+ 43 - 0
vmcore/src/CMakeLists.txt

@@ -0,0 +1,43 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 3.16)
+PROJECT(vmcore_src C)
+SET(CMAKE_C_STANDARD 11)
+
+# 搜索源文件
+AUX_SOURCE_DIRECTORY(${vmcore_src_SOURCE_DIR} SRC)
+MESSAGE(STATUS "vmcore src list = ${SRC}")
+
+# 处理外部依赖库
+FIND_PATH(ffih ffi.h REQUIRED)
+INCLUDE_DIRECTORIES(${ffih})
+
+FIND_LIBRARY(libffi NAMES ffi REQUIRED)
+FIND_LIBRARY(libdl NAMES dl REQUIRED)
+
+IF (libffi AND ffih)
+    MESSAGE(STATUS "libffi = ${libffi} ffi.h in ${ffih}")
+ELSE()
+    MESSAGE(FATAL_ERROR "not found libffi or ffi.h")
+ENDIF()
+
+IF (libdl)
+    MESSAGE(STATUS "libdl = ${libdl}")
+ELSE()
+    MESSAGE(FATAL_ERROR "not found libdl")
+ENDIF()
+
+IF (PG)
+    ADD_COMPILE_OPTIONS(-pg)
+    ADD_LINK_OPTIONS(-pg)
+    ADD_LIBRARY(vmcore_src STATIC ${SRC})  ## debug模式下, 以静态库形式链接
+ELSE()
+    ADD_LIBRARY(vmcore_src SHARED ${SRC})
+ENDIF()
+
+TARGET_LINK_LIBRARIES(vmcore_src ${libffi} ${libdl} m)
+TARGET_INCLUDE_DIRECTORIES(vmcore_src PRIVATE VMCORE_INCLUDE_DICT)
+SET_TARGET_PROPERTIES(vmcore_src PROPERTIES
+        PUBLIC_HEADER ${vmcore_SOURCE_DIR}/include/virtualmath.h  # 设置public的头文件
+        OUTPUT_NAME "vmcore"  # 设置输出名
+        VERSION 3.1  # 设置版本号
+        )
+INSTALL(TARGETS vmcore_src)

+ 32 - 0
vmcore/src/inter.c

@@ -191,6 +191,7 @@ void freeInter(Inter *inter, bool show_gc) {
 
     while (inter->hash_base != NULL)
         freeHashTable(&inter->hash_base);
+    freeClibInfoFromInter(inter);
     memFree(inter);
     return_:
     return;
@@ -201,6 +202,7 @@ void mergeInter(Inter *new, Inter *base){
     LinkValue **base_linkValue = NULL;
     HashTable **base_hash = NULL;
     Var **base_var = NULL;
+    ClibInfo **info = NULL;
 
     gc_runDelAll(new);
     freeBaseInterData(new);
@@ -214,11 +216,14 @@ void mergeInter(Inter *new, Inter *base){
         PASS;
     for (base_var = &base->base_var; *base_var != NULL; base_var = &(*base_var)->gc_next)
         PASS;
+    for (info = &base->clib_info; *info != NULL; info = &(*info)->next)
+        PASS;
 
     *base_value = new->base;
     *base_linkValue = new->link_base;
     *base_hash = new->hash_base;
     *base_var = new->base_var;
+    *info = new->clib_info;
     if (base->package == NULL)
         base->package = new->package;
     memFree(new);
@@ -235,6 +240,33 @@ Inter *deriveInter(LinkValue *belong, Inter *inter) {
     return import_inter;
 }
 
+ClibInfo *makeClibInfo() {
+    ClibInfo *tmp = memCalloc(1, sizeof(ClibInfo));
+    tmp->dl = NULL;
+    tmp->next = NULL;
+    return tmp;
+}
+
+void makeClibInfoToInter(void *dl, Inter *inter) {
+    ClibInfo *tmp = makeClibInfo();
+    tmp->next = inter->clib_info;
+    tmp->dl = dl;
+    inter->clib_info = tmp;
+}
+
+ClibInfo *freeClibInfo(ClibInfo *info) {
+    ClibInfo *next = info->next;
+    if (info->dl != NULL)
+        dlclose(info->dl);
+    memFree(info);
+    return next;
+}
+
+void freeClibInfoFromInter(Inter *inter) {
+    for (ClibInfo *tmp = inter->clib_info; tmp != NULL; tmp = freeClibInfo(tmp))
+        PASS;
+}
+
 #if DEBUG
 /* ***********************DEBUG 专用函数*********************************** */
 

+ 1 - 1
vmcore/src/runfile.c

@@ -95,7 +95,7 @@ int checkFileDir(char **file_dir, FUNC) {
 }
 
     clib:
-    if (checkCLib(*file_dir))  // 检查是否为 clib
+    if (checkCLib(file_dir))  // 检查是否为 clib
         return 2;
 
     error_:

+ 1 - 1
vmlib/hello.vm → vmcore/vmlib/hello.vm

@@ -1,3 +1,3 @@
-def printHello(){
+fun printHello(){
     print("HelloVirtualMath")
 }