[cmake-developers] [RFC] golang support

Michael Wild themiwi at gmail.com
Fri Aug 5 03:46:59 EDT 2011


The problem is that add_dependencies() adds only dependencies between
top-level targets, there's nothing that tells CMake to relink the
executable when the library changes. It only ensures that the library is
build *before* the executable. You would need to pass the library output
files to the DEPENDS option of the linking command.

A few more comments:

- Don't use macros unless you have to. Functions have much nicer properties.

- You can simplify finding of the programs to

find_program(GO_COMPILER NAMES 8g 6g 5g
  PATHS ENV GOROOT PATH_SUFFIXES bin
  NO_DEFAULT_PATH)

- There's no 7g, you probably meant 5g.

- You should only search for the "correct" compiler by determining the
architecture you are compiling for first.

- You should probably check the directory properties INCLUDE_DIRECTORIES
and LINK_DIRECTORIES and add them with the -I and -L flags.

- Don't hardcode the .exe suffix. Use ${CMAKE_EXECUTABLE_SUFFIX}
instead. I don't know how it works with the libraries on Windows with
Go, but consider using ${CMAKE_STATIC_LIBRARY_PREFIX} and
${CMAKE_STATIC_LIBRARY_SUFFIX}.

- add_dependencies() accepts multiple dependees, so the loop is unnecessary.

- You might want to take a look at my (unfinished) Vala module for some
inspiration:
http://wildcodes.com/git/CMake/commit/?h=patches/AddValaSupport It is
still a bit buggy (typos, doesn't get all the dependencies right), and I
had a much improved version, but lost it due to a disk failure before I
pushed the changes to the repository...


HTH

Michael

On 08/05/2011 07:08 AM, Colin McCabe wrote:
> Hi all,
> 
> Google Go is a fun language that I've been playing around with.
> http://en.wikipedia.org/wiki/Go_(programming_language)
> 
> I wrote a little cmake file to help me compile Google Go (golang)
> source files using CMake.
> 
> However, it's currently not working as expected. The go executables
> are not rebuilt when the go libraries change.
> 
> ======================================================
> FIND_PROGRAM(GO_COMPILER
>     bin/6g.exe
>     bin/7g.exe
>     bin/8g.exe
>     bin/6g
>     bin/7g
>     bin/8g
>     PATHS
>     $ENV{GOROOT}
>     NO_DEFAULT_PATH
> )
> IF(NOT GO_COMPILER)
>     MESSAGE(FATAL_ERROR "Could not find the go compiler")
> ENDIF(NOT GO_COMPILER)
> 
> FIND_PROGRAM(GO_ARCHIVER
>     bin/gopack.exe
>     bin/gopack
>     PATHS
>     $ENV{GOROOT}
>     NO_DEFAULT_PATH
> )
> IF(NOT GO_ARCHIVER)
>     MESSAGE(FATAL_ERROR "Could not find the go packer")
> ENDIF(NOT GO_ARCHIVER)
> 
> FIND_PROGRAM(GO_LINKER
>     bin/6l.exe
>     bin/7l.exe
>     bin/8l.exe
>     bin/6l
>     bin/7l
>     bin/8l
>     PATHS
>     $ENV{GOROOT}
>     NO_DEFAULT_PATH
> )
> IF(NOT GO_LINKER)
>     MESSAGE(FATAL_ERROR "Could not find the go linker")
> ENDIF(NOT GO_LINKER)
> 
> MACRO(add_go_exe exefile)
>     SET(OBJ_FILE ${CMAKE_CURRENT_BINARY_DIR}/${exefile}.8)
>     SET(EXE_FILE ${CMAKE_CURRENT_BINARY_DIR}/${exefile})
>     ADD_CUSTOM_COMMAND(OUTPUT ${OBJ_FILE}
>         COMMAND ${GO_COMPILER}
>         ARGS -I ${CMAKE_CURRENT_BINARY_DIR} -I ${PROJECT_BINARY_DIR}
> -o ${OBJ_FILE} ${ARGN}
>         MAIN_DEPENDENCY ${ARGN}
>         WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
>     )
>     ADD_CUSTOM_COMMAND(OUTPUT ${EXE_FILE}
>         COMMAND ${GO_LINKER}
>         ARGS -L ${PROJECT_BINARY_DIR} -L ${CMAKE_CURRENT_BINARY_DIR}
> -o ${EXE_FILE} ${OBJ_FILE}
>         MAIN_DEPENDENCY ${OBJ_FILE}
>         WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
>     )
>     ADD_CUSTOM_TARGET(${exefile}.exe ALL DEPENDS ${EXE_FILE})
> ENDMACRO (add_go_exe)
> 
> MACRO(add_go_lib libfile)
>     ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${libfile}.8
>         COMMAND ${GO_COMPILER}
>         ARGS -I ${CMAKE_CURRENT_BINARY_DIR} -I ${PROJECT_BINARY_DIR}
> -o ${CMAKE_CURRENT_BINARY_DIR}/${libfile}.8 ${ARGN}
>         MAIN_DEPENDENCY ${ARGN}
>         WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
>     )
>     ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_BINARY_DIR}/${libfile}.a
>         COMMAND ${GO_ARCHIVER}
>         ARGS crg ${PROJECT_BINARY_DIR}/${libfile}.a
> ${CMAKE_CURRENT_BINARY_DIR}/${libfile}.8
>         MAIN_DEPENDENCY ${CMAKE_CURRENT_BINARY_DIR}/${libfile}.8
>         WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
>     )
>     ADD_CUSTOM_TARGET(${libfile} ALL DEPENDS
> ${CMAKE_CURRENT_BINARY_DIR}/${libfile}.8
> ${PROJECT_BINARY_DIR}/${libfile}.a)
> ENDMACRO (add_go_lib)
> 
> MACRO(target_link_go_libs exefile)
>     FOREACH(libfile ${ARGN})
>         ADD_DEPENDENCIES(${exefile}.exe ${libfile})
>     ENDFOREACH(libfile)
> ENDMACRO(target_link_go_libs)
> ======================================================
> 
> I'm curious if anyone has any ideas about the best way to fix this.
> Alternately, how difficult would it be to add native support to golang
> in CMake, the same way Fortran, Ada, and D have?
> 
> thanks,
> Colin McCabe
> _______________________________________________
> cmake-developers mailing list
> cmake-developers at cmake.org
> http://public.kitware.com/cgi-bin/mailman/listinfo/cmake-developers




More information about the cmake-developers mailing list