[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