Skip to content

Commit

Permalink
build: add golang to cmake
Browse files Browse the repository at this point in the history
Problem: the new cmake build system needs to compile go tests for bindings
Solution: use add_custom_command to do a build of the test.
  • Loading branch information
vsoch committed Sep 29, 2023
1 parent 0e69f8c commit 95ee296
Show file tree
Hide file tree
Showing 7 changed files with 83 additions and 0 deletions.
5 changes: 5 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,11 @@ if(ENABLE_COVERAGE)
SET( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${COVERAGE_FLAGS}" )
endif()

if(DEFINED ENV{WITH_GO})
message(STATUS "WITH_GO detected in main CMakeLists.txt to build go bindings")
include(GolangSimple)
endif()

include_directories(.)
add_subdirectory( etc )
add_subdirectory( src )
Expand Down
24 changes: 24 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,30 @@ make check
make install
```

To build go bindings, you will need go (tested with 1.19.10) available, and then:

```bash
export WITH_GO=yes
./configure
make
```

To run just one test, you can cd into t

```bash
$ ./t9001-golang-basic.t
ok 1 - match allocate 1 slot: 1 socket: 1 core (pol=default)
ok 2 - match allocate 2 slots: 2 sockets: 5 cores 1 gpu 6 memory
# passed all 2 test(s)
1..2
```

To run full tests (more robust and mimics what happens in CI) you can do:

```bash
make check
```

##### Flux Instance

The examples below walk through exercising functioning flux-sched modules (i.e.,
Expand Down
30 changes: 30 additions & 0 deletions cmake/GolangSimple.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
set(CUSTOM_GO_PATH "${CMAKE_SOURCE_DIR}/resource/reapi/bindings/go")
set(GOPATH "${CMAKE_CURRENT_BINARY_DIR}/go")

# This probably isn't necessary, although if we could build fluxcli into it maybe
file(MAKE_DIRECTORY ${GOPATH})

# ADD_GO_INSTALLABLE_PROGRAM builds a custom go program (primarily for testing)
function(BUILD_GO_PROGRAM NAME MAIN_SRC CGO_CFLAGS CGO_LIBRARY_FLAGS)
message(STATUS "GOPATH: ${GOPATH}")
message(STATUS "CGO_LDFLAGS: ${CGO_LIBRARY_FLAGS}")
get_filename_component(MAIN_SRC_ABS ${MAIN_SRC} ABSOLUTE)
add_custom_target(${NAME})

# IMPORTANT: the trick to getting *spaces* to render in COMMAND is to convert them to ";"
# string(REPLACE <match-string> <replace-string> <out-var> <input>...)
STRING(REPLACE " " ";" CGO_LIBRARY_FLAGS ${CGO_LIBRARY_FLAGS})
add_custom_command(TARGET ${NAME}
COMMAND GOPATH=${GOPATH}:${CUSTOM_GO_PATH} GOOS=linux G0111MODULE=off CGO_CFLAGS="${CGO_CFLAGS}" CGO_LDFLAGS='${CGO_LIBRARY_FLAGS}' go build -ldflags '-w'
-o "${CMAKE_CURRENT_SOURCE_DIR}/${NAME}"
${CMAKE_GO_FLAGS} ${MAIN_SRC}
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
DEPENDS ${MAIN_SRC_ABS}
COMMENT "Building Go library")
foreach(DEP ${ARGN})
add_dependencies(${NAME} ${DEP})
endforeach()

add_custom_target(${NAME}_all ALL DEPENDS ${NAME})
install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${NAME} DESTINATION bin)
endfunction(BUILD_GO_PROGRAM)
5 changes: 5 additions & 0 deletions resource/reapi/bindings/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,8 @@ add_library ( reapi_module STATIC
target_link_libraries(reapi_module PRIVATE
flux::core
)

if(DEFINED ENV{WITH_GO})
message(STATUS "WITH_GO is set to build go bindings")
add_subdirectory( go )
endif()
1 change: 1 addition & 0 deletions resource/reapi/bindings/go/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
add_subdirectory( src )
1 change: 1 addition & 0 deletions resource/reapi/bindings/go/src/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
add_subdirectory( test )
17 changes: 17 additions & 0 deletions resource/reapi/bindings/go/src/test/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
set(TARGET main)
set(SRCS main.go)
set(CGO_CFLAGS "-I${CMAKE_BINARY_DIR}/resource/reapi/bindings/c")

# This is currently passed but not used because when passed into add_custom_command the spaces are escaped
set(CGO_LIBRARY_FLAGS "-Wl,-R ${CMAKE_BINARY_DIR}/resource -L${CMAKE_BINARY_DIR}/resource/reapi/bindings -L${CMAKE_BINARY_DIR}/resource/libjobspec -ljobspec_conv -lreapi_cli -L${CMAKE_BINARY_DIR}/resource -lresource -lflux-idset -lstdc++ -lczmq -ljansson -lhwloc -lboost_system -lflux-hostlist -lboost_graph -lyaml-cpp")

# This ensures the main binary is cleaned up
set_directory_properties(
PROPERTIES
ADDITIONAL_CLEAN_FILES "${CMAKE_CURRENT_BINARY_DIR}/main"
)

# GO_GET(go_redis github.com/hoisie/redis)
# main main.go
# We add the dependencies at the end so the build can run in parallel and we don't try to build this before they are ready!
BUILD_GO_PROGRAM(${TARGET} ${SRCS} "${CGO_CFLAGS}" "${CGO_LIBRARY_FLAGS}" jobspec_conv reapi_module reapi_cli resource flux::core)

0 comments on commit 95ee296

Please sign in to comment.