Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
Paddle
提交
41780aef
P
Paddle
项目概览
PaddlePaddle
/
Paddle
1 年多 前同步成功
通知
2302
Star
20931
Fork
5422
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1423
列表
看板
标记
里程碑
合并请求
543
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
Paddle
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1,423
Issue
1,423
列表
看板
标记
里程碑
合并请求
543
合并请求
543
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
41780aef
编写于
5月 16, 2017
作者:
H
Helin Wang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
implment pserver client lib cgo part, and temporary cmake solution
上级
47643038
变更
13
隐藏空白更改
内联
并排
Showing
13 changed file
with
480 addition
and
0 deletion
+480
-0
paddle/go/pserver/client.go
paddle/go/pserver/client.go
+61
-0
paddle/go/pserver/lib/CMakeLists.txt
paddle/go/pserver/lib/CMakeLists.txt
+33
-0
paddle/go/pserver/lib/client/.gitignore
paddle/go/pserver/lib/client/.gitignore
+2
-0
paddle/go/pserver/lib/client/CMakeLists.txt
paddle/go/pserver/lib/client/CMakeLists.txt
+5
-0
paddle/go/pserver/lib/client/main.go
paddle/go/pserver/lib/client/main.go
+212
-0
paddle/go/pserver/lib/client/test/CMakeLists.txt
paddle/go/pserver/lib/client/test/CMakeLists.txt
+8
-0
paddle/go/pserver/lib/client/test/main.c
paddle/go/pserver/lib/client/test/main.c
+8
-0
paddle/go/pserver/lib/cmake/CMakeDetermineGoCompiler.cmake
paddle/go/pserver/lib/cmake/CMakeDetermineGoCompiler.cmake
+44
-0
paddle/go/pserver/lib/cmake/CMakeGoCompiler.cmake.in
paddle/go/pserver/lib/cmake/CMakeGoCompiler.cmake.in
+8
-0
paddle/go/pserver/lib/cmake/CMakeGoInformation.cmake
paddle/go/pserver/lib/cmake/CMakeGoInformation.cmake
+7
-0
paddle/go/pserver/lib/cmake/CMakeTestGoCompiler.cmake
paddle/go/pserver/lib/cmake/CMakeTestGoCompiler.cmake
+1
-0
paddle/go/pserver/lib/cmake/flags.cmake
paddle/go/pserver/lib/cmake/flags.cmake
+45
-0
paddle/go/pserver/lib/cmake/golang.cmake
paddle/go/pserver/lib/cmake/golang.cmake
+46
-0
未找到文件。
paddle/go/pserver/client.go
0 → 100644
浏览文件 @
41780aef
package
pserver
// ElementType is the type of elements of a Parameter.
type
ElementType
int
// Supported element types
const
(
Int32
ElementType
=
iota
UInt32
Int64
UInt64
Float32
Float64
)
type
Parameter
struct
{
Name
string
ElementType
ElementType
Content
[]
byte
}
type
ParameterWithConfig
struct
{
Param
Parameter
Config
[]
byte
}
type
Gradient
Parameter
type
Client
struct
{
}
func
NewClient
(
addr
string
)
*
Client
{
return
&
Client
{}
}
func
(
c
*
Client
)
BeginInitParams
(
pserverConfigProto
[]
byte
)
(
bool
,
error
)
{
return
true
,
nil
}
func
(
c
*
Client
)
InitParam
(
paramWithConfigs
ParameterWithConfig
)
error
{
return
nil
}
func
(
c
*
Client
)
FinishInitParams
()
error
{
return
nil
}
func
(
c
*
Client
)
SendGrads
(
grads
[]
Gradient
)
error
{
return
nil
}
func
(
c
*
Client
)
GetParams
(
names
[]
string
)
([]
Parameter
,
error
)
{
return
nil
,
nil
}
func
(
c
*
Client
)
SaveModel
(
path
string
)
error
{
return
nil
}
func
(
c
*
Client
)
Cleanup
()
{
}
paddle/go/pserver/lib/CMakeLists.txt
0 → 100644
浏览文件 @
41780aef
cmake_minimum_required
(
VERSION 3.0
)
if
(
GTEST_INCLUDE_DIR AND GTEST_LIBRARIES
)
message
(
"-- Found gtest (include:
${
GTEST_INCLUDE_DIR
}
, library:
${
GTEST_LIBRARIES
}
)"
)
else
()
# find #include <majel/xx.h>
get_filename_component
(
PARENT_DIR
${
CMAKE_CURRENT_SOURCE_DIR
}
DIRECTORY
)
include_directories
(
${
PARENT_DIR
}
)
# find cmake directory modules
get_filename_component
(
PARENT_DIR
${
PARENT_DIR
}
DIRECTORY
)
get_filename_component
(
PARENT_DIR
${
PARENT_DIR
}
DIRECTORY
)
get_filename_component
(
PARENT_DIR
${
PARENT_DIR
}
DIRECTORY
)
set
(
CMAKE_MODULE_PATH
${
CMAKE_MODULE_PATH
}
"
${
PARENT_DIR
}
/cmake"
)
# enable c++11
set
(
CMAKE_CXX_FLAGS
"
${
CMAKE_CXX_FLAGS
}
-std=c++11"
)
# enable gtest
set
(
THIRD_PARTY_PATH ./third_party
)
set
(
WITH_TESTING ON
)
include
(
external/gtest
)
endif
()
set
(
CMAKE_MODULE_PATH
${
CMAKE_MODULE_PATH
}
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/cmake"
)
project
(
cxx_go CXX C Go
)
include
(
cmake/golang.cmake
)
include
(
cmake/flags.cmake
)
add_subdirectory
(
client
)
paddle/go/pserver/lib/client/.gitignore
0 → 100644
浏览文件 @
41780aef
client.h
client.a
paddle/go/pserver/lib/client/CMakeLists.txt
0 → 100644
浏览文件 @
41780aef
cmake_minimum_required
(
VERSION 3.0
)
ExternalGoProject_Add
(
pserver github.com/PaddlePaddle/Paddle/paddle/go/pserver
)
add_go_library
(
client STATIC pserver
)
add_subdirectory
(
test
)
paddle/go/pserver/lib/client/main.go
0 → 100644
浏览文件 @
41780aef
package
main
/*
#include <stdlib.h>
#include <string.h>
typedef enum {
PADDLE_ELEMENT_TYPE_INT32 = 0,
PADDLE_ELEMENT_TYPE_UINT32 = 1,
PADDLE_ELEMENT_TYPE_INT64 = 2,
PADDLE_ELEMENT_TYPE_UINT64 = 3,
PADDLE_ELEMENT_TYPE_FLOAT32 = 4,
PADDLE_ELEMENT_TYPE_FLOAT64 = 5,
} paddle_element_type;
typedef struct {
char* name;
paddle_element_type element_type;
void* content;
int content_len;
} paddle_parameter, paddle_gradient;
typedef int client;
*/
import
"C"
import
(
"log"
"sync"
"unsafe"
"github.com/PaddlePaddle/Paddle/paddle/go/pserver"
)
const
(
ptrSize
=
unsafe
.
Sizeof
(
uintptr
(
0
))
)
var
mu
sync
.
Mutex
var
handleMap
=
make
(
map
[
C
.
client
]
*
pserver
.
Client
)
var
curHandle
C
.
client
func
add
(
c
*
pserver
.
Client
)
C
.
client
{
mu
.
Lock
()
defer
mu
.
Unlock
()
client
:=
curHandle
curHandle
++
handleMap
[
client
]
=
c
return
client
}
func
get
(
client
C
.
client
)
*
pserver
.
Client
{
mu
.
Lock
()
defer
mu
.
Unlock
()
return
handleMap
[
client
]
}
func
remove
(
client
C
.
client
)
*
pserver
.
Client
{
mu
.
Lock
()
defer
mu
.
Unlock
()
h
:=
handleMap
[
client
]
delete
(
handleMap
,
client
)
return
h
}
func
cArrayToSlice
(
p
unsafe
.
Pointer
,
len
int
)
[]
byte
{
// create a Go clice backed by a C array,
// reference: https://github.com/golang/go/wiki/cgo#turning-c-arrays-into-go-slices
return
(
*
[
1
<<
30
]
byte
)(
p
)[
:
len
:
len
]
}
//export paddle_new_pserver_client
func
paddle_new_pserver_client
(
addr
*
C
.
char
)
C
.
client
{
c
:=
pserver
.
NewClient
(
C
.
GoString
(
addr
))
return
add
(
c
)
}
//export paddle_pserver_client_release
func
paddle_pserver_client_release
(
client
C
.
client
)
{
c
:=
remove
(
client
)
c
.
Cleanup
()
}
//export paddle_begin_init_params
func
paddle_begin_init_params
(
client
C
.
client
,
pserver_config
unsafe
.
Pointer
,
config_len
C
.
int
)
C
.
int
{
c
:=
get
(
client
)
b
:=
cArrayToSlice
(
pserver_config
,
int
(
config_len
))
selected
,
err
:=
c
.
BeginInitParams
(
b
)
if
err
!=
nil
{
log
.
Println
(
err
)
return
-
1
}
if
selected
{
return
1
}
return
0
}
//export paddle_init_param
func
paddle_init_param
(
client
C
.
client
,
param
C
.
paddle_parameter
,
param_config
unsafe
.
Pointer
,
config_len
C
.
int
)
C
.
int
{
et
:=
pserver
.
ElementType
(
param
.
element_type
)
name
:=
C
.
GoString
(
param
.
name
)
content
:=
cArrayToSlice
(
unsafe
.
Pointer
(
param
.
content
),
int
(
param
.
content_len
))
pc
:=
pserver
.
ParameterWithConfig
{
Param
:
pserver
.
Parameter
{
Name
:
name
,
ElementType
:
et
,
Content
:
content
},
Config
:
cArrayToSlice
(
param_config
,
int
(
config_len
)),
}
c
:=
get
(
client
)
err
:=
c
.
InitParam
(
pc
)
if
err
!=
nil
{
log
.
Println
(
err
)
return
-
1
}
return
0
}
//export paddle_finish_init_params
func
paddle_finish_init_params
(
client
C
.
client
)
C
.
int
{
c
:=
get
(
client
)
err
:=
c
.
FinishInitParams
()
if
err
!=
nil
{
log
.
Println
(
err
)
return
-
1
}
return
0
}
//export paddle_send_grads
func
paddle_send_grads
(
client
C
.
client
,
grads
*
C
.
paddle_gradient
,
total
C
.
int
)
C
.
int
{
var
gs
[]
pserver
.
Gradient
for
i
:=
0
;
i
<
int
(
total
);
i
++
{
grad
:=
(
*
C
.
paddle_gradient
)(
unsafe
.
Pointer
((
uintptr
(
unsafe
.
Pointer
(
grads
))
+
uintptr
(
i
)
*
ptrSize
)))
et
:=
pserver
.
ElementType
(
grad
.
element_type
)
name
:=
C
.
GoString
(
grad
.
name
)
content
:=
cArrayToSlice
(
unsafe
.
Pointer
(
grad
.
content
),
int
(
grad
.
content_len
))
gs
=
append
(
gs
,
pserver
.
Gradient
{
Name
:
name
,
ElementType
:
et
,
Content
:
content
})
}
c
:=
get
(
client
)
err
:=
c
.
SendGrads
(
gs
)
if
err
!=
nil
{
log
.
Println
(
err
)
return
-
1
}
return
0
}
//export paddle_get_params
func
paddle_get_params
(
client
C
.
client
,
names
**
C
.
char
,
dst
*
C
.
paddle_parameter
,
total
C
.
int
)
C
.
int
{
var
ns
[]
string
for
i
:=
0
;
i
<
int
(
total
);
i
++
{
name
:=
*
(
**
C
.
char
)(
unsafe
.
Pointer
((
uintptr
(
unsafe
.
Pointer
(
names
))
+
uintptr
(
i
)
*
ptrSize
)))
ns
=
append
(
ns
,
C
.
GoString
(
name
))
}
c
:=
get
(
client
)
ps
,
err
:=
c
.
GetParams
(
ns
)
if
err
!=
nil
{
log
.
Println
(
err
)
return
-
1
}
for
i
:=
0
;
i
<
int
(
total
);
i
++
{
if
i
>=
len
(
ps
)
{
break
}
p
:=
ps
[
i
]
name
:=
C
.
CString
(
p
.
Name
)
param
:=
(
*
C
.
paddle_parameter
)(
unsafe
.
Pointer
((
uintptr
(
unsafe
.
Pointer
(
dst
))
+
uintptr
(
i
)
*
ptrSize
)))
if
unsafe
.
Pointer
(
param
.
name
)
!=
unsafe
.
Pointer
(
uintptr
(
0
))
{
C
.
free
(
unsafe
.
Pointer
(
param
.
name
))
}
param
.
name
=
name
memReady
:=
false
if
param
.
content
!=
unsafe
.
Pointer
(
uintptr
(
0
))
{
if
int
(
param
.
content_len
)
==
len
(
p
.
Content
)
{
memReady
=
true
}
else
{
C
.
free
(
param
.
content
)
}
}
if
!
memReady
{
param
.
content
=
C
.
malloc
(
C
.
size_t
(
len
(
p
.
Content
)))
}
C
.
memcpy
(
param
.
content
,
unsafe
.
Pointer
(
&
p
.
Content
[
0
]),
C
.
size_t
(
len
(
p
.
Content
)))
param
.
content_len
=
C
.
int
(
len
(
p
.
Content
))
param
.
element_type
=
C
.
paddle_element_type
(
p
.
ElementType
)
}
return
0
}
//export paddle_save_model
func
paddle_save_model
(
client
C
.
client
,
path
*
C
.
char
)
C
.
int
{
p
:=
C
.
GoString
(
path
)
c
:=
get
(
client
)
err
:=
c
.
SaveModel
(
p
)
if
err
!=
nil
{
log
.
Println
(
err
)
return
-
1
}
return
0
}
func
main
()
{}
// Required but ignored
paddle/go/pserver/lib/client/test/CMakeLists.txt
0 → 100644
浏览文件 @
41780aef
cmake_minimum_required
(
VERSION 3.0
)
include_directories
(
/env/gopath/src/github.com/PaddlePaddle/Paddle/paddle/go/pserver/lib/build/client
)
add_executable
(
main main.c
)
add_dependencies
(
main client
)
set
(
CMAKE_EXE_LINKER_FLAGS
"-pthread"
)
target_link_libraries
(
main /env/gopath/src/github.com/PaddlePaddle/Paddle/paddle/go/pserver/lib/build/client/libclient.a
${
GTEST_LIBRARIES
}
)
paddle/go/pserver/lib/client/test/main.c
0 → 100644
浏览文件 @
41780aef
#include "libclient.h"
#include "gtest/gtest.h"
int
main
()
{
client
c
=
paddle_new_pserver_client
(
NULL
);
return
0
;
}
paddle/go/pserver/lib/cmake/CMakeDetermineGoCompiler.cmake
0 → 100644
浏览文件 @
41780aef
if
(
NOT CMAKE_Go_COMPILER
)
if
(
NOT $ENV{GO_COMPILER} STREQUAL
""
)
get_filename_component
(
CMAKE_Go_COMPILER_INIT $ENV{GO_COMPILER} PROGRAM PROGRAM_ARGS CMAKE_Go_FLAGS_ENV_INIT
)
if
(
CMAKE_Go_FLAGS_ENV_INIT
)
set
(
CMAKE_Go_COMPILER_ARG1
"
${
CMAKE_Go_FLAGS_ENV_INIT
}
"
CACHE STRING
"First argument to Go compiler"
)
endif
()
if
(
NOT EXISTS
${
CMAKE_Go_COMPILER_INIT
}
)
message
(
SEND_ERROR
"Could not find compiler set in environment variable GO_COMPILER:
\n
$ENV{GO_COMPILER}."
)
endif
()
endif
()
set
(
Go_BIN_PATH
$ENV{GOPATH}
$ENV{GOROOT}
$ENV{GOROOT}/../bin
$ENV{GO_COMPILER}
/usr/bin
/usr/local/bin
)
if
(
CMAKE_Go_COMPILER_INIT
)
set
(
CMAKE_Go_COMPILER
${
CMAKE_Go_COMPILER_INIT
}
CACHE PATH
"Go Compiler"
)
else
()
find_program
(
CMAKE_Go_COMPILER
NAMES go
PATHS
${
Go_BIN_PATH
}
)
EXEC_PROGRAM
(
${
CMAKE_Go_COMPILER
}
ARGS version OUTPUT_VARIABLE GOLANG_VERSION
)
STRING
(
REGEX MATCH
"go[0-9]+.[0-9]+.[0-9]+[ /A-Za-z0-9]*"
VERSION
"
${
GOLANG_VERSION
}
"
)
message
(
"-- The Golang compiler identification is
${
VERSION
}
"
)
message
(
"-- Check for working Golang compiler:
${
CMAKE_Go_COMPILER
}
"
)
endif
()
endif
()
mark_as_advanced
(
CMAKE_Go_COMPILER
)
configure_file
(
${
CMAKE_CURRENT_SOURCE_DIR
}
/cmake/CMakeGoCompiler.cmake.in
${
CMAKE_PLATFORM_INFO_DIR
}
/CMakeGoCompiler.cmake @ONLY
)
set
(
CMAKE_Go_COMPILER_ENV_VAR
"GO_COMPILER"
)
paddle/go/pserver/lib/cmake/CMakeGoCompiler.cmake.in
0 → 100644
浏览文件 @
41780aef
set(CMAKE_Go_COMPILER "@CMAKE_Go_COMPILER@")
set(CMAKE_Go_COMPILER_LOADED 1)
set(CMAKE_Go_SOURCE_FILE_EXTENSIONS go)
set(CMAKE_Go_LINKER_PREFERENCE 40)
set(CMAKE_Go_OUTPUT_EXTENSION .o)
set(CMAKE_Go_OUTPUT_EXTENSION_REPLACE 1)
set(CMAKE_Go_COMPILER_ENV_VAR "GO_COMPILER")
paddle/go/pserver/lib/cmake/CMakeGoInformation.cmake
0 → 100644
浏览文件 @
41780aef
if
(
NOT CMAKE_Go_COMPILE_OBJECT
)
set
(
CMAKE_Go_COMPILE_OBJECT
"go tool compile -l -N -o <OBJECT> <SOURCE> "
)
endif
()
if
(
NOT CMAKE_Go_LINK_EXECUTABLE
)
set
(
CMAKE_Go_LINK_EXECUTABLE
"go tool link -o <TARGET> <OBJECTS> "
)
endif
()
paddle/go/pserver/lib/cmake/CMakeTestGoCompiler.cmake
0 → 100644
浏览文件 @
41780aef
set
(
CMAKE_Go_COMPILER_WORKS 1 CACHE INTERNAL
""
)
paddle/go/pserver/lib/cmake/flags.cmake
0 → 100644
浏览文件 @
41780aef
# Setting Paddle Compile Flags
include
(
CheckCXXCompilerFlag
)
include
(
CheckCCompilerFlag
)
include
(
CheckCXXSymbolExists
)
include
(
CheckTypeSize
)
function
(
CheckCompilerCXX11Flag
)
if
(
CMAKE_CXX_COMPILER_ID STREQUAL
"GNU"
)
if
(
${
CMAKE_CXX_COMPILER_VERSION
}
VERSION_LESS 4.8
)
message
(
FATAL_ERROR
"Unsupported GCC version. GCC >= 4.8 required."
)
endif
()
elseif
(
CMAKE_CXX_COMPILER_ID STREQUAL
"AppleClang"
OR CMAKE_CXX_COMPILER_ID STREQUAL
"Clang"
)
# cmake >= 3.0 compiler id "AppleClang" on Mac OS X, otherwise "Clang"
# Apple Clang is a different compiler than upstream Clang which havs different version numbers.
# https://gist.github.com/yamaya/2924292
if
(
APPLE
)
# cmake < 3.0 compiler id "Clang" on Mac OS X
if
(
${
CMAKE_CXX_COMPILER_VERSION
}
VERSION_LESS 5.1
)
message
(
FATAL_ERROR
"Unsupported AppleClang version. AppleClang >= 5.1 required."
)
endif
()
else
()
if
(
${
CMAKE_CXX_COMPILER_VERSION
}
VERSION_LESS 3.3
)
message
(
FATAL_ERROR
"Unsupported Clang version. Clang >= 3.3 required."
)
endif
()
endif
()
endif
()
endfunction
()
CheckCompilerCXX11Flag
()
set
(
CMAKE_CXX_FLAGS
"
${
CMAKE_CXX_FLAGS
}
-std=c++11"
)
# Common gpu architectures: Kepler, Maxwell
foreach
(
capability 30 35 50
)
list
(
APPEND __arch_flags
" -gencode arch=compute_
${
capability
}
,code=sm_
${
capability
}
"
)
endforeach
()
if
(
CUDA_VERSION VERSION_GREATER
"7.0"
OR CUDA_VERSION VERSION_EQUAL
"7.0"
)
list
(
APPEND __arch_flags
" -gencode arch=compute_52,code=sm_52"
)
endif
()
# Modern gpu architectures: Pascal
if
(
CUDA_VERSION VERSION_GREATER
"8.0"
OR CUDA_VERSION VERSION_EQUAL
"8.0"
)
list
(
APPEND __arch_flags
" -gencode arch=compute_60,code=sm_60"
)
endif
()
set
(
CUDA_NVCC_FLAGS
${
__arch_flags
}
${
CUDA_NVCC_FLAGS
}
)
\ No newline at end of file
paddle/go/pserver/lib/cmake/golang.cmake
0 → 100644
浏览文件 @
41780aef
set
(
GOPATH
"
${
CMAKE_CURRENT_BINARY_DIR
}
/go"
)
file
(
MAKE_DIRECTORY
${
GOPATH
}
)
function
(
ExternalGoProject_Add TARG
)
add_custom_target
(
${
TARG
}
env GOPATH=
${
GOPATH
}
${
CMAKE_Go_COMPILER
}
get
${
ARGN
}
)
endfunction
(
ExternalGoProject_Add
)
function
(
add_go_executable NAME
)
file
(
GLOB GO_SOURCE RELATIVE
"
${
CMAKE_CURRENT_SOURCE_DIR
}
"
"*.go"
)
add_custom_command
(
OUTPUT
${
OUTPUT_DIR
}
/.timestamp
COMMAND env GOPATH=
${
GOPATH
}
${
CMAKE_Go_COMPILER
}
build
-o
"
${
CMAKE_CURRENT_BINARY_DIR
}
/
${
NAME
}
"
${
CMAKE_GO_FLAGS
}
${
GO_SOURCE
}
WORKING_DIRECTORY
${
CMAKE_CURRENT_LIST_DIR
}
)
add_custom_target
(
${
NAME
}
ALL DEPENDS
${
OUTPUT_DIR
}
/.timestamp
${
ARGN
}
)
install
(
PROGRAMS
${
CMAKE_CURRENT_BINARY_DIR
}
/
${
NAME
}
DESTINATION bin
)
endfunction
(
add_go_executable
)
function
(
ADD_GO_LIBRARY NAME BUILD_TYPE
)
if
(
BUILD_TYPE STREQUAL
"STATIC"
)
set
(
BUILD_MODE -buildmode=c-archive
)
set
(
LIB_NAME
"lib
${
NAME
}
.a"
)
else
()
set
(
BUILD_MODE -buildmode=c-shared
)
if
(
APPLE
)
set
(
LIB_NAME
"lib
${
NAME
}
.dylib"
)
else
()
set
(
LIB_NAME
"lib
${
NAME
}
.so"
)
endif
()
endif
()
file
(
GLOB GO_SOURCE RELATIVE
"
${
CMAKE_CURRENT_SOURCE_DIR
}
"
"*.go"
)
add_custom_command
(
OUTPUT
${
OUTPUT_DIR
}
/.timestamp
COMMAND env GOPATH=
${
GOPATH
}
${
CMAKE_Go_COMPILER
}
build
${
BUILD_MODE
}
-o
"
${
CMAKE_CURRENT_BINARY_DIR
}
/
${
LIB_NAME
}
"
${
CMAKE_GO_FLAGS
}
${
GO_SOURCE
}
WORKING_DIRECTORY
${
CMAKE_CURRENT_LIST_DIR
}
)
add_custom_target
(
${
NAME
}
ALL DEPENDS
${
OUTPUT_DIR
}
/.timestamp
${
ARGN
}
)
if
(
NOT BUILD_TYPE STREQUAL
"STATIC"
)
install
(
PROGRAMS
${
CMAKE_CURRENT_BINARY_DIR
}
/
${
LIB_NAME
}
DESTINATION bin
)
endif
()
endfunction
(
ADD_GO_LIBRARY
)
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录