-
Notifications
You must be signed in to change notification settings - Fork 5.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
add go_xxx to simplify cmake #2182
Changes from all commits
c9cdc98
4dcb9f1
e254c7a
4d5417b
4471452
af06519
00441a9
a7edafc
589cea1
071c65f
4f837b9
5b32283
50d0e26
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
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} | ||
) | ||
if(CMAKE_Go_COMPILER) | ||
EXEC_PROGRAM(${CMAKE_Go_COMPILER} ARGS version OUTPUT_VARIABLE GOLANG_VERSION) | ||
STRING(REGEX MATCH "go[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() | ||
|
||
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") |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
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") |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
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() |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
set(CMAKE_Go_COMPILER_WORKS 1 CACHE INTERNAL "") |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -27,6 +27,7 @@ | |
# | ||
# cmake_parse_arguments can help us to achieve this goal. | ||
# https://cmake.org/cmake/help/v3.0/module/CMakeParseArguments.html | ||
# | ||
|
||
# cc_library parses tensor.cc and figures out that target also depend on tensor.h. | ||
# cc_library(tensor | ||
|
@@ -139,3 +140,78 @@ function(nv_test TARGET_NAME) | |
endif() | ||
add_test(${TARGET_NAME} ${TARGET_NAME}) | ||
endfunction(nv_test) | ||
|
||
set(GOPATH "${CMAKE_CURRENT_BINARY_DIR}/go") | ||
file(MAKE_DIRECTORY ${GOPATH}) | ||
|
||
# Because api.go defines a GO wrapper to ops and tensor, it depends on | ||
# both. This implies that if any of tensor.{h,cc}, ops.{h,cu}, or | ||
# api.go is changed, api need to be re-built. | ||
# go_library(api | ||
# SRCS | ||
# api.go | ||
# DEPS | ||
# tensor # Because ops depend on tensor, this line is optional. | ||
# ops) | ||
function(go_library TARGET_NAME) | ||
set(options OPTIONAL) | ||
set(oneValueArgs "") | ||
set(multiValueArgs SRCS DEPS) | ||
cmake_parse_arguments(go_library "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) | ||
if (${go_library_OPTIONAL} STREQUAL "SHARED") | ||
set(BUILD_MODE "-buildmode=c-shared") | ||
if(APPLE) | ||
set(LIB_NAME "lib${TARGET_NAME}.dylib") | ||
else() | ||
set(LIB_NAME "lib${TARGET_NAME}.so") | ||
endif() | ||
else() | ||
set(BUILD_MODE "-buildmode=c-archive") | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think we might have to support more types of work in addition to There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @wangkuiyi Good question! You mean how to specify Go dependencies when using export GOPATH=./build/go
go get .path_to_go_binary_project/... in this way, There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What I was talking about is that
|
||
set(LIB_NAME "lib${TARGET_NAME}.a") | ||
endif() | ||
add_custom_command(OUTPUT ${TARGET_NAME}_timestamp | ||
COMMAND env GOPATH=${GOPATH} ${CMAKE_Go_COMPILER} build ${BUILD_MODE} | ||
-o "${CMAKE_CURRENT_BINARY_DIR}/${LIB_NAME}" | ||
${go_library_SRCS} | ||
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}) | ||
add_custom_target(${TARGET_NAME}_lib ALL DEPENDS ${TARGET_NAME}_timestamp ${go_library_DEPS}) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Have not found where |
||
add_library(${TARGET_NAME} STATIC IMPORTED) | ||
set_property(TARGET ${TARGET_NAME} PROPERTY | ||
IMPORTED_LOCATION "${CMAKE_CURRENT_BINARY_DIR}/${LIB_NAME}") | ||
add_dependencies(${TARGET_NAME} ${TARGET_NAME}_lib) | ||
endfunction(go_library) | ||
|
||
function(go_binary TARGET_NAME) | ||
set(options OPTIONAL) | ||
set(oneValueArgs "") | ||
set(multiValueArgs SRCS DEPS) | ||
cmake_parse_arguments(go_binary "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) | ||
add_custom_command(OUTPUT ${TARGET_NAME}_timestamp | ||
COMMAND env GOPATH=${GOPATH} ${CMAKE_Go_COMPILER} build | ||
-o "${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}" | ||
${go_library_SRCS} | ||
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}) | ||
add_custom_target(${TARGET_NAME} ALL DEPENDS ${TARGET_NAME}_timestamp ${go_binary_DEPS}) | ||
install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME} DESTINATION bin) | ||
endfunction(go_binary) | ||
|
||
function(go_test TARGET_NAME) | ||
set(options OPTIONAL) | ||
set(oneValueArgs "") | ||
set(multiValueArgs SRCS DEPS) | ||
cmake_parse_arguments(go_test "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) | ||
add_custom_command(OUTPUT ${TARGET_NAME}_timestamp | ||
COMMAND env GOPATH=${GOPATH} ${CMAKE_Go_COMPILER} test | ||
-c -o "${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}" | ||
${go_test_SRCS} | ||
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}) | ||
add_custom_target(${TARGET_NAME} ALL DEPENDS ${TARGET_NAME}_timestamp ${go_test_DEPS}) | ||
add_test(${TARGET_NAME} ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}) | ||
endfunction(go_test) | ||
|
||
# go_extern will download extern go project. | ||
# go_extern(target_name extern_source) | ||
# go_extern(go_redis github.com/hoisie/redis) | ||
function(go_extern TARGET_NAME) | ||
add_custom_target(${TARGET_NAME} env GOPATH=${GOPATH} ${CMAKE_Go_COMPILER} get ${ARGN}) | ||
endfunction(go_extern) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
include_directories(${CMAKE_CURRENT_BINARY_DIR}) | ||
|
||
go_library(adder SRCS adder.go) | ||
|
||
cc_test(cgo_test | ||
SRCS | ||
cgo_test.cc | ||
DEPS | ||
adder) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
package main | ||
|
||
import "C" | ||
|
||
//export GoAdder | ||
func GoAdder(x, y int) int { | ||
return x + y | ||
} | ||
|
||
func main() {} // Required but ignored |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
#include <iostream> | ||
#include "gtest/gtest.h" | ||
#include "libadder.h" | ||
|
||
TEST(Cgo, Invoke) { EXPECT_EQ(GoAdder(30, 12), 42); } | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. For the linking of this file's executable to work, we will need There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. done |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
go bin path 一般在$ENV{GOROOT}/bin
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done