[cmake-developers] [RFC] golang support

Colin McCabe cmccabe at alumni.cmu.edu
Fri Aug 5 01:08:36 EDT 2011


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



More information about the cmake-developers mailing list