Merge branch 'feature-foreign-content' into 'develop'

Feature foreign content

See merge request MESA_framework/maat!3
This commit is contained in:
郑超
2018-09-26 19:50:17 +08:00
12 changed files with 241 additions and 83 deletions

51
.gitignore vendored
View File

@@ -1,9 +1,44 @@
SI/
*.I*
*.P*
*.S*
*.W*
*.[od]
*.[1-9]*
*.log
# Created by https://www.gitignore.io/api/c++,clion
### C++ ###
# Prerequisites
*.d
# Compiled Object files
*.slo
*.lo
*.o
*.obj
# Precompiled Headers
*.gch
*.pch
# Compiled Dynamic libraries
*.so
*.dylib
*.dll
# Fortran module files
*.mod
*.smod
# Compiled Static libraries
*.lai
*.la
*.a
*.lib
# Executables
*.exe
*.out
*.app
# CMake
cmake-build-*/
# Clion
.idea/
# Vscode
.vscode/*

View File

@@ -1,6 +1,7 @@
cmake_minimum_required (VERSION 3.5)
project (maatframe)
set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -Wall)
set(MAAT_DEPEND_DYN_LIB MESA_handle_logger MESA_htable pcre rulescan pthread m pcre MESA_field_stat2 crypto)
include_directories(${PROJECT_SOURCE_DIR}/inc/)
include_directories(/opt/MESA/include/MESA/)

View File

@@ -1,9 +1,9 @@
cmake_minimum_required(VERSION 2.6)
cmake_minimum_required(VERSION 3.5)
project(maatframe)
set(MAAT_FRAME_MAJOR_VERSION 2)
set(MAAT_FRAME_MINOR_VERSION 2)
set(MAAT_FRAME_PATCH_VERSION 20180923)
set(MAAT_FRAME_MINOR_VERSION 3)
set(MAAT_FRAME_PATCH_VERSION 20180926)
set(MAAT_FRAME_VERSION ${MAAT_FRAME_MAJOR_VERSION}.${MAAT_FRAME_MINOR_VERSION}.${MAAT_FRAME_PATCH_VERSION})
message(STATUS "Maat Frame, Version: ${MAAT_FRAME_VERSION}")
@@ -19,7 +19,8 @@ set_target_properties(maat_frame_static PROPERTIES LINKER_LANGUAGE CXX)
set_target_properties(maat_frame_static PROPERTIES OUTPUT_NAME maatframe)
set_target_properties(maat_frame_static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
target_include_directories(maat_frame_static PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/inc_internal/)
target_include_directories(maat_frame_static PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/inc_internal/hiredis)
#target_include_directories(maat_frame_static PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/inc_internal/hiredis)
target_link_libraries(maat_frame_static hiredis-vip-static)
# Shared Library Output
add_library(maat_frame_shared SHARED ${MAAT_SRC})
@@ -30,7 +31,7 @@ set_target_properties(maat_frame_shared PROPERTIES VERSION ${MAAT_FRAME_MAJOR_VE
set_target_properties(maat_frame_shared PROPERTIES SOVERSION ${MAAT_FRAME_MAJOR_VERSION})
target_include_directories(maat_frame_shared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/inc_internal/)
target_include_directories(maat_frame_shared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/inc_internal/hiredis)
target_link_libraries(maat_frame_shared MESA_handle_logger MESA_htable pcre rulescan pthread m pcre MESA_field_stat2 crypto hiredis_vip)
target_link_libraries(maat_frame_shared hiredis-vip-static ${MAAT_DEPEND_DYN_LIB})
install(DIRECTORY ${PROJECT_SOURCE_DIR}/inc/ DESTINATION /opt/MESA/include/MESA/ FILES_MATCHING PATTERN "*.h")
install(TARGETS maat_frame_shared DESTINATION /opt/MESA/lib/)

View File

@@ -1403,7 +1403,7 @@ const char* find_Nth_column(const char* line, int Nth, int* column_len)
break;
}
}
if(start==0)
if(start==end)
{
return NULL;
}
@@ -1456,14 +1456,57 @@ void rewrite_table_line_with_foreign(struct serial_rule_t*p)
p->table_line=rewrite_line;
return;
}
int get_foreign_keys(redisContext *ctx, struct serial_rule_t* rule_list, int rule_num, _Maat_feather_t* feather, const char* dir,void *logger)
void _get_foregin_keys(struct serial_rule_t* p_rule, int* foreign_columns, int n_foreign, const char* dir, void* logger)
{
int ret=0, table_id=0, i=0, j=0;
int foreign_key_size=0;
int rule_with_foreign_key=0;
int ret=0, i=0;
const char* p_foreign=NULL;
struct _Maat_table_info_t* p_table=NULL;
int foreign_key_size=0;
struct stat file_info;
p_rule->n_foreign=n_foreign;
p_rule->f_keys=(struct foreign_key*)calloc(sizeof(struct foreign_key),n_foreign);
for(i=0; i<n_foreign; i++)
{
p_foreign=find_Nth_column(p_rule->table_line, foreign_columns[i], &foreign_key_size);
if(p_foreign==NULL)
{
MESA_handle_runtime_log(logger,RLOG_LV_FATAL,maat_redis_monitor
, "Get %s,%d foreign keys failed: No %dth column."
, p_rule->table_name, p_rule->rule_id, foreign_columns[i]);
continue;
}
if(0!=strncmp(p_foreign, foreign_source_prefix, strlen(foreign_source_prefix)))
{
MESA_handle_runtime_log(logger,RLOG_LV_FATAL,maat_redis_monitor
,"Get %s,%d foreign key failed: Invalid source prefix %s."
, p_rule->table_name, p_rule->rule_id, foreign_columns[i]);
continue;
}
p_rule->f_keys[i].column=foreign_columns[i];
foreign_key_size=foreign_key_size-strlen(foreign_source_prefix);
p_foreign+=strlen(foreign_source_prefix);
if(0!=strncmp(p_foreign, foreign_key_prefix, strlen(foreign_key_prefix)))
{
MESA_handle_runtime_log(logger,RLOG_LV_INFO,maat_redis_monitor
,"%s,%d foreign key prefix %s is discouraged."
,p_rule->table_name, p_rule->rule_id, foreign_columns[i]);
}
p_rule->f_keys[i].key=(char*)calloc(sizeof(char),foreign_key_size+1);
memcpy(p_rule->f_keys[i].key, p_foreign, foreign_key_size);
p_rule->f_keys[i].filename=get_foreign_cont_filename(p_rule->table_name, p_rule->rule_id, p_rule->f_keys[i].key, dir);
ret=stat(p_rule->f_keys[i].filename, &file_info);
if(ret==0)
{
p_rule->f_keys[i].is_existed=1;
}
}
return;
}
int get_foreign_keys_define(redisContext *ctx, struct serial_rule_t* rule_list, int rule_num, _Maat_feather_t* feather, const char* dir,void *logger)
{
int ret=0, table_id=0, i=0;
int rule_with_foreign_key=0;
struct _Maat_table_info_t* p_table=NULL;
for(i=0; i<rule_num; i++)
{
if(rule_list[i].table_line==NULL)
@@ -1480,54 +1523,47 @@ int get_foreign_keys(redisContext *ctx, struct serial_rule_t* rule_list, int rul
{
continue;
}
rule_list[i].n_foreign=p_table->n_foreign;
rule_list[i].f_keys=(struct foreign_key*)calloc(sizeof(struct foreign_key), rule_list[i].n_foreign);
for(j=0;j<p_table->n_foreign;j++)
{
p_foreign=find_Nth_column(rule_list[i].table_line, p_table->foreign_columns[j], &foreign_key_size);
if(p_foreign==NULL)
{
MESA_handle_runtime_log(logger,RLOG_LV_FATAL,maat_redis_monitor
, "Get %s,%d foreign keys failed: No %dth column."
, rule_list[i].table_name, rule_list[i].rule_id, p_table->foreign_columns[j]);
continue;
}
if(0!=strncmp(p_foreign, foreign_source_prefix, strlen(foreign_source_prefix)))
{
MESA_handle_runtime_log(logger,RLOG_LV_FATAL,maat_redis_monitor
,"Get %s,%d foreign key failed: Invalid source prefix %s."
, rule_list[i].table_name, rule_list[i].rule_id, p_foreign);
continue;
}
rule_list[i].f_keys[j].column=p_table->foreign_columns[j];
foreign_key_size=foreign_key_size-strlen(foreign_source_prefix);
p_foreign+=strlen(foreign_source_prefix);
if(0!=strncmp(p_foreign, foreign_key_prefix, strlen(foreign_key_prefix)))
{
MESA_handle_runtime_log(logger,RLOG_LV_INFO,maat_redis_monitor
,"%s,%d foreign key prefix %s is discouraged."
, rule_list[i].table_name, rule_list[i].rule_id, p_foreign);
}
rule_list[i].f_keys[j].key=(char*)calloc(sizeof(char),foreign_key_size+1);
memcpy(rule_list[i].f_keys[j].key, p_foreign, foreign_key_size);
rule_list[i].f_keys[j].filename=get_foreign_cont_filename(rule_list[i].table_name, rule_list[i].rule_id, rule_list[i].f_keys[j].key, dir);
ret=stat(rule_list[i].f_keys[j].filename, &file_info);
if(ret==0)
{
rule_list[i].f_keys[j].is_existed=1;
}
}
_get_foregin_keys(rule_list+i, p_table->foreign_columns, p_table->n_foreign, dir, logger);
rule_with_foreign_key++;
}
return rule_with_foreign_key;
}
int get_foreign_keys_by_prefix(redisContext *ctx, struct serial_rule_t* rule_list, int rule_num, const char* dir,void *logger)
{
int i=0, j=0, foreign_key_size=0;
int rule_with_foreign_key=0;
const char* p_foreign=NULL;
int n_foreign=0;
int foreign_columns[MAX_FOREIGN_CLMN_NUM];
for(i=0; i<rule_num; i++)
{
j=1;
n_foreign=0;
do{
p_foreign=find_Nth_column(rule_list[i].table_line, j, &foreign_key_size);
if(p_foreign!=NULL&&foreign_key_size>(int)strlen(foreign_source_prefix)&&0==strncmp(p_foreign,foreign_source_prefix, strlen(foreign_source_prefix)))
{
foreign_columns[n_foreign]=j;
n_foreign++;
}
j++;
}while(p_foreign!=NULL&&n_foreign<MAX_FOREIGN_CLMN_NUM);
if(n_foreign>0)
{
_get_foregin_keys(rule_list+i, foreign_columns, n_foreign,dir,logger);
rule_with_foreign_key++;
}
}
return rule_with_foreign_key;
}
struct foreign_conts_track
{
int rule_idx;
int foreign_idx;
};
void _get_foreign_conts(redisContext *ctx, struct serial_rule_t* rule_list, int rule_num, void *logger)
void _get_foreign_conts(redisContext *ctx, struct serial_rule_t* rule_list, int rule_num, int print_fn, void *logger)
{
int i=0, j=0, ret=0;
int key_num=0;
@@ -1584,6 +1620,10 @@ void _get_foreign_conts(redisContext *ctx, struct serial_rule_t* rule_list, int
fwrite(reply->str, 1, reply->len, fp);
fclose(fp);
fp=NULL;
if(print_fn==1)
{
printf("Written foreign content %s\n",p->f_keys[track[i].foreign_idx].filename);
}
}
}
freeReplyObject(reply);
@@ -1591,14 +1631,14 @@ void _get_foreign_conts(redisContext *ctx, struct serial_rule_t* rule_list, int
free(track);
return;
}
void get_foreign_conts(redisContext *ctx, struct serial_rule_t* rule_list, int rule_num, void *logger)
void get_foreign_conts(redisContext *ctx, struct serial_rule_t* rule_list, int rule_num, int print_fn, void *logger)
{
int max_redis_batch=4*1024,batch_cnt=0;
int success_cnt=0;
while(success_cnt<rule_num)
{
batch_cnt=MIN(rule_num-success_cnt,max_redis_batch);
_get_foreign_conts(ctx,rule_list+success_cnt,batch_cnt,logger);
_get_foreign_conts(ctx,rule_list+success_cnt,batch_cnt,print_fn,logger);
success_cnt+=batch_cnt;
}
return;
@@ -1663,10 +1703,10 @@ void redis_monitor_traverse(long long version,redisContext *c,
{
MESA_handle_runtime_log(logger,RLOG_LV_FATAL,maat_redis_monitor,"%d of %d rules are empty.",empty_value_num,rule_num);
}
}
ret=get_foreign_keys_define(c, rule_list, rule_num, feather, feather->foreign_cont_dir, logger);
if(ret>0)
{
{
get_foreign_conts(c, rule_list, rule_num, 0, logger);
}
}
@@ -2018,7 +2058,7 @@ int Maat_cmd_set_file(Maat_feather_t feather,const char* key, const char* value,
reply=NULL;
return -1;
}
freeReplyObject(reply);
freeReplyObject(reply);
return 1;
}
void Maat_add_region2cmd(struct Maat_cmd_t* cmd,int which_group,const struct Maat_region_t* region)

View File

@@ -32,7 +32,7 @@
#include "stream_fuzzy_hash.h"
#include "gram_index_engine.h"
int MAAT_FRAME_VERSION_2_2_20180925=1;
int MAAT_FRAME_VERSION_2_2_20180926=1;
const char* CHARSET_STRING[]={"NONE","gbk","big5","unicode","utf8","bin",
"unicode_ascii_esc","unicode_ascii_aligned","unicode_ncr_dec","unicode_ncr_hex","url_encode_gb2312","url_encode_utf8",""};
@@ -3009,6 +3009,15 @@ void garbage_bury(MESA_lqueue_head garbage_q,int timeout,void *logger)
"Foreign content file %s remove failed.",
bag->filename);
}
else
{
MESA_handle_runtime_log(logger,RLOG_LV_DEBUG,maat_module,
"Foreign content file %s remove success.",
bag->filename);
}
free(bag->filename);
bag->filename=NULL;
break;
default:
assert(0);

View File

@@ -500,6 +500,11 @@ void maat_stat_output(struct _Maat_feather_t* feather);
redisReply *_wrap_redisCommand(redisContext *c, const char *format, ...);
int get_rm_key_list(redisContext *c, long long instance_version, long long desired_version, long long* new_version, struct serial_rule_t** list,int *update_type, void* logger, int cumulative_off);
int get_maat_redis_value(redisContext *c,struct serial_rule_t* rule_list,int rule_num,void* logger,int print_process);
int get_foreign_keys_by_prefix(redisContext *ctx, struct serial_rule_t* rule_list, int rule_num, const char* dir,void *logger);
void get_foreign_conts(redisContext *ctx, struct serial_rule_t* rule_list, int rule_num, int print_fn, void *logger);
void rewrite_table_line_with_foreign(struct serial_rule_t*p);
void set_serial_rule(struct serial_rule_t* rule,enum MAAT_OPERATION op,int rule_id,int label_id,const char* table_name,const char* line, long long timeout);
void empty_serial_rules(struct serial_rule_t* rule);
int exec_serial_rule(redisContext* ctx,struct serial_rule_t* s_rule,int serial_rule_num, long long server_time, void* logger);

View File

@@ -664,8 +664,7 @@ protected:
const char* foregin_dir="./foreign_files/";
Maat_set_feather_opt(_shared_feather, MAAT_OPT_FOREIGN_CONT_DIR,foregin_dir, strlen(foregin_dir)+1);
int linger_timeout=4;
linger_timeout=2;
Maat_set_feather_opt(_shared_feather, MAAT_OPT_FOREIGN_CONT_LINGER,&linger_timeout, sizeof(linger_timeout));
Maat_cmd_flushDB(_shared_feather);
@@ -678,10 +677,11 @@ protected:
}
// Some expensive resource shared by all tests.
static Maat_feather_t _shared_feather;
static Maat_feather_t _shared_feather;
static int linger_timeout;
};
Maat_feather_t MaatCmdTest::_shared_feather;
int MaatCmdTest::linger_timeout;
int test_add_expr_command(Maat_feather_t feather,const char* region_table,int config_id, int timeout,int label_id, const char* keywords)
{
struct Maat_cmd_t* cmd=NULL;
@@ -1043,7 +1043,9 @@ int is_same_file(const char* filename1, const char* filename2)
return 0;
}
}
int g_test_foregin_read_OK=0;
int g_test_foregin_read_OK=0, g_test_foreign_del_OK=0;
char file1_to_del[256], file2_to_del[256];
void foreign_key_test_entry_cb(int table_id,const char* table_line,void* u_para)
{
int rule_id=-1, not_care=0, tag=0;
@@ -1060,10 +1062,19 @@ void foreign_key_test_entry_cb(int table_id,const char* table_line,void* u_para)
, file2_origin_name, file2_localname
, end);
EXPECT_STREQ(end, "End");
EXPECT_TRUE(is_same_file(file1_origin_name, file1_localname));
EXPECT_TRUE(is_same_file(file2_origin_name, file2_localname));
if(is_valid==1)
{
EXPECT_TRUE(is_same_file(file1_origin_name, file1_localname));
EXPECT_TRUE(is_same_file(file2_origin_name, file2_localname));
g_test_foregin_read_OK=1;
g_test_foregin_read_OK=1;
}
else
{
strcpy(file1_to_del, file1_localname);
strcpy(file2_to_del, file2_localname);
g_test_foreign_del_OK=1;
}
return;
}
@@ -1085,12 +1096,14 @@ TEST_F(MaatCmdTest, SetFile)
size_t file_size=0;
prepare_file_to_set(file1_name, &file_buff, &file_size, file1_key, sizeof(file1_key));
Maat_cmd_set_file(feather, file1_key, file_buff, file_size, MAAT_OP_ADD);
ret=Maat_cmd_set_file(feather, file1_key, file_buff, file_size, MAAT_OP_ADD);
EXPECT_EQ(ret, 1);
free(file_buff);
file_buff=NULL;
prepare_file_to_set(file2_name, &file_buff, &file_size, file2_key, sizeof(file2_key));
Maat_cmd_set_file(feather, file2_key, file_buff, file_size, MAAT_OP_ADD);
ret=Maat_cmd_set_file(feather, file2_key, file_buff, file_size, MAAT_OP_ADD);
EXPECT_EQ(ret, 1);
free(file_buff);
file_buff=NULL;
g_test_foregin_read_OK=0;
@@ -1110,6 +1123,23 @@ TEST_F(MaatCmdTest, SetFile)
EXPECT_EQ(ret, 1);
usleep(WAIT_FOR_EFFECTIVE_US);//wait for callback triggered.
EXPECT_EQ(g_test_foregin_read_OK, 1);
g_test_foreign_del_OK=0;
ret=Maat_cmd_set_file(feather, file1_key, NULL, 0, MAAT_OP_DEL);
EXPECT_EQ(ret, 1);
ret=Maat_cmd_set_file(feather, file2_key, NULL, 0, MAAT_OP_DEL);
EXPECT_EQ(ret, 1);
ret=Maat_cmd_set_line(feather, &line_rule, MAAT_OP_DEL);
EXPECT_EQ(ret, 1);
sleep(MaatCmdTest::linger_timeout+1);
struct stat file_info;
ret=stat(file1_to_del, &file_info);
EXPECT_EQ(ret, -1);
ret=stat(file2_to_del, &file_info);
EXPECT_EQ(ret, -1);
return;
}

View File

@@ -4,8 +4,8 @@ target_link_libraries(digest_gen maat_frame_shared)
add_executable(maat_redis_tool maat_redis_tool.cpp)
add_dependencies(maat_redis_tool maat_frame_shared)
target_link_libraries(maat_redis_tool maat_frame_shared)
target_link_libraries(maat_redis_tool maat_frame_static ${MAAT_DEPEND_DYN_LIB})
target_include_directories(maat_redis_tool PRIVATE ${PROJECT_SOURCE_DIR}/src/inc_internal/)
target_include_directories(maat_redis_tool PRIVATE ${PROJECT_SOURCE_DIR}/src/inc_internal/hiredis)
target_include_directories(maat_redis_tool PRIVATE hiredis-vip-static)

View File

@@ -91,6 +91,10 @@ void read_rule_from_redis(redisContext * ctx, long long desire_version, const ch
assert(update_type==CM_UPDATE_TYPE_FULL);
printf("MAAT Version: %lld, key number: %d\n", version, rule_num);
if(rule_num==0)
{
goto clean_up;
}
printf("Reading value: ");
ret=get_maat_redis_value(ctx,rule_list,rule_num,logger,1);
if(ret<0)
@@ -106,6 +110,20 @@ void read_rule_from_redis(redisContext * ctx, long long desire_version, const ch
printf("mkdir %s error\n",output_path);
}
char foreign_files_dir[256];
snprintf(foreign_files_dir, sizeof(foreign_files_dir), "%s/foreign_files/",output_path);
if((access(foreign_files_dir,F_OK)) <0)
{ if((mkdir(foreign_files_dir,S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)) < 0)
printf("mkdir %s error\n",foreign_files_dir);
}
ret=get_foreign_keys_by_prefix(ctx, rule_list, rule_num, foreign_files_dir, logger);
if(ret>0)
{
printf("%d lines has foreign content.\n", ret);
get_foreign_conts(ctx, rule_list, rule_num, 1, logger);
}
snprintf(index_path,sizeof(index_path),"%s/full_config_index.%020lld",output_path,version);
index_fp=fopen(index_path,"w");
if(index_fp==NULL)
@@ -116,6 +134,10 @@ void read_rule_from_redis(redisContext * ctx, long long desire_version, const ch
for(i=0;i<rule_num;i++)
{
if(rule_list[i].n_foreign>0)
{
rewrite_table_line_with_foreign(rule_list+i);
}
if(cur_table==NULL||0!=strcmp(cur_table,rule_list[i].table_name))
{
if(table_fp!=NULL)
@@ -125,6 +147,7 @@ void read_rule_from_redis(redisContext * ctx, long long desire_version, const ch
table_fp=NULL;
set_file_rulenum(table_path,line_count, logger);
line_count=0;
printf("Written table %s\n",table_path);
}
snprintf(table_path,sizeof(table_path),"%s/%s.%020lld",output_path,rule_list[i].table_name,version);
set_file_rulenum(table_path, 0, logger);
@@ -134,7 +157,7 @@ void read_rule_from_redis(redisContext * ctx, long long desire_version, const ch
printf("Open %s failed.\n",table_path);
goto clean_up;
}
printf("Writing %s\n",table_path);
cur_table=rule_list[i].table_name;
}
fprintf(table_fp,"%s\tkey=%d\n",rule_list[i].table_line,rule_list[i].rule_id);
@@ -145,7 +168,7 @@ void read_rule_from_redis(redisContext * ctx, long long desire_version, const ch
fprintf(index_fp,"%s\t%d\t%s\n",cur_table,line_count,table_path);
set_file_rulenum(table_path,line_count, logger);
printf("Writing complete: %s\n",index_path);
printf("Written complete: %s\n",index_path);
clean_up:
for(i=0;i<rule_num;i++)
{
@@ -223,8 +246,6 @@ int main(int argc, char * argv[])
int redis_port=6379;
int redis_db=0;
strncpy(redis_ip,"127.0.0.1",sizeof(redis_ip));
char table_info[128];
strncpy(table_info,"./table_info.conf",sizeof(table_info));
char dump_dir[128], json_file[128], tmp_iris_path[128];
strncpy(dump_dir,redis_dump_dir,sizeof(dump_dir));
redisContext * ctx=NULL;

22
vendor/CMakeLists.txt vendored
View File

@@ -2,15 +2,31 @@
include(ExternalProject)
#### GoogleTest
ExternalProject_Add(googletest PREFIX googletest
ExternalProject_Add(GoogleTest PREFIX GoogleTest
URL ${CMAKE_CURRENT_SOURCE_DIR}/googletest-release-1.8.0.tar.gz
URL_MD5 16877098823401d1bf2ed7891d7dce36
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR> -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE})
ExternalProject_Get_Property(googletest INSTALL_DIR)
ExternalProject_Get_Property(GoogleTest INSTALL_DIR)
file(MAKE_DIRECTORY ${INSTALL_DIR}/include)
add_library(gtest STATIC IMPORTED GLOBAL)
set_property(TARGET gtest PROPERTY IMPORTED_LOCATION ${INSTALL_DIR}/lib/libgtest.a)
set_property(TARGET gtest PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${INSTALL_DIR}/include)
set_property(TARGET gtest PROPERTY INTERFACE_LINK_LIBRARIES pthread)
set_property(TARGET gtest PROPERTY INTERFACE_LINK_LIBRARIES pthread)
ExternalProject_Add(hiredis-vip PREFIX hiredis-vip
URL ${CMAKE_CURRENT_SOURCE_DIR}/hiredis-vip-0.3.0.tar.gz
URL_MD5 e4d4a2928188b11f696d35ca1c52e9a4
CONFIGURE_COMMAND ""
BUILD_COMMAND make
INSTALL_COMMAND ""
BUILD_IN_SOURCE 1)
ExternalProject_Get_Property(hiredis-vip SOURCE_DIR)
set(HTTP_PARSER_INCLUDE_DIRECTORIES ${SOURCE_DIR})
file(MAKE_DIRECTORY ${HTTP_PARSER_INCLUDE_DIRECTORIES})
add_library(hiredis-vip-static STATIC IMPORTED GLOBAL)
set_property(TARGET hiredis-vip-static PROPERTY IMPORTED_LOCATION ${SOURCE_DIR}/libhiredis_vip.a)
set_property(TARGET hiredis-vip-static PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${SOURCE_DIR})

BIN
vendor/googletest-release-1.8.0.tar.gz vendored Normal file

Binary file not shown.

BIN
vendor/hiredis-vip-0.3.0.tar.gz vendored Normal file

Binary file not shown.