include(ExternalProject) include(ProcessorCount) # Provide a config.h which exposes build system information. configure_file( cmd/gllgo/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/cmd/gllgo/config.h) include_directories(${CMAKE_CURRENT_BINARY_DIR}/cmd/gllgo) list(APPEND LLVM_GO_PACKAGES "llvm.org/llgo=${CMAKE_CURRENT_SOURCE_DIR}") llvm_add_go_executable(llgo llvm.org/llgo/cmd/gllgo ALL DEPENDS build/context.go cmd/gllgo/gllgo.go debug/debug.go driver/parser.go irgen/annotations.go irgen/attribute.go irgen/builtins.go irgen/cabi.go irgen/call.go irgen/channels.go irgen/closures.go irgen/compiler.go irgen/errors.go irgen/indirect.go irgen/interfaces.go irgen/maps.go irgen/predicates.go irgen/println.go irgen/runtime.go irgen/slice.go irgen/ssa.go irgen/strings.go irgen/switches.go irgen/targets.go irgen/typemap.go irgen/types.go irgen/utils.go irgen/value.go irgen/version.go ssaopt/esc.go ) string(REGEX MATCH "[0-9]+\\.[0-9]+(\\.[0-9]+)?" LLGO_VERSION ${PACKAGE_VERSION}) configure_file( cmd/go/zdefaultcc.go.in ${CMAKE_CURRENT_BINARY_DIR}/cmd/go/zdefaultcc.go) set(LLGO_GO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/build.go ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/clean.go ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/context.go ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/discovery.go ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/doc.go ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/env.go ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/fix.go ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/fmt.go ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/generate.go ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/get.go ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/go11.go ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/help.go ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/http.go ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/list.go ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/main.go ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/note.go ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/pkg.go ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/run.go ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/signal.go ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/signal_unix.go ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/testflag.go ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/test.go ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/tool.go ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/vcs.go ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/version.go ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/vet.go ${CMAKE_CURRENT_BINARY_DIR}/cmd/go/zdefaultcc.go ) add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/bin/llgo-go${CMAKE_EXECUTABLE_SUFFIX} COMMAND ${CMAKE_BINARY_DIR}/bin/llgo -static-libgo -I ${CMAKE_CURRENT_BINARY_DIR}/libgo -o ${CMAKE_BINARY_DIR}/bin/llgo-go${CMAKE_EXECUTABLE_SUFFIX} ${LLGO_GO_SOURCES} ${CMAKE_CURRENT_BINARY_DIR}/libgo/zstdpkglist.go DEPENDS llgo libgo ${LLGO_GO_SOURCES} COMMENT "Building Go executable llgo-go" VERBATIM) add_custom_target(llgo-go ALL DEPENDS ${CMAKE_BINARY_DIR}/bin/llgo-go${CMAKE_EXECUTABLE_SUFFIX}) set(LLGO_CGO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/cgo/ast.go ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/cgo/doc.go ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/cgo/gcc.go ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/cgo/godefs.go ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/cgo/main.go ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/cgo/out.go ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/cgo/util.go ${CMAKE_CURRENT_SOURCE_DIR}/cmd/cgo/zdefaultcc.go ) add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/lib/go/llgo-${LLGO_VERSION}/cgo COMMAND ${CMAKE_BINARY_DIR}/bin/llgo -static-libgo -o ${CMAKE_BINARY_DIR}/lib/go/llgo-${LLGO_VERSION}/cgo ${LLGO_CGO_SOURCES} DEPENDS llgo libgo ${LLGO_CGO_SOURCES} COMMENT "Building Go executable cgo" VERBATIM) add_custom_target(cgo ALL DEPENDS ${CMAKE_BINARY_DIR}/lib/go/llgo-${LLGO_VERSION}/cgo) llvm_add_go_executable(llgo-stage2 llvm.org/llgo/cmd/gllgo DEPENDS libgo ${CMAKE_BINARY_DIR}/bin/llgo${CMAKE_EXECUTABLE_SUFFIX} ${CMAKE_BINARY_DIR}/lib/go/llgo-${LLGO_VERSION}/cgo ${CMAKE_BINARY_DIR}/bin/llgo-go${CMAKE_EXECUTABLE_SUFFIX} GOFLAGS "cc=${CMAKE_BINARY_DIR}/bin/clang" "cxx=${CMAKE_BINARY_DIR}/bin/clang++" "go=${CMAKE_BINARY_DIR}/bin/llgo-go" ) llvm_add_go_executable(llgo-stage3 llvm.org/llgo/cmd/gllgo DEPENDS libgo ${CMAKE_BINARY_DIR}/bin/llgo-stage2${CMAKE_EXECUTABLE_SUFFIX} GOFLAGS "cc=${CMAKE_BINARY_DIR}/bin/clang" "cxx=${CMAKE_BINARY_DIR}/bin/clang++" "go=${CMAKE_BINARY_DIR}/bin/llgo-go" "llgo=${CMAKE_BINARY_DIR}/bin/llgo-stage2${CMAKE_EXECUTABLE_SUFFIX}" ) llvm_add_go_executable(cc-wrapper llvm.org/llgo/cmd/cc-wrapper DEPENDS cmd/cc-wrapper/main.go ) llvm_add_go_executable(llgoi llvm.org/llgo/cmd/llgoi ALL DEPENDS libgo ${CMAKE_BINARY_DIR}/bin/llgo${CMAKE_EXECUTABLE_SUFFIX} ${CMAKE_BINARY_DIR}/lib/go/llgo-${LLGO_VERSION}/cgo ${CMAKE_BINARY_DIR}/bin/llgo-go${CMAKE_EXECUTABLE_SUFFIX} cmd/llgoi/llgoi.go GOFLAGS "cc=${CMAKE_BINARY_DIR}/bin/clang" "cxx=${CMAKE_BINARY_DIR}/bin/clang++" "go=${CMAKE_BINARY_DIR}/bin/llgo-go" ) install(FILES ${CMAKE_BINARY_DIR}/bin/llgo${CMAKE_EXECUTABLE_SUFFIX} ${CMAKE_BINARY_DIR}/bin/llgoi${CMAKE_EXECUTABLE_SUFFIX} ${CMAKE_BINARY_DIR}/bin/llgo-go${CMAKE_EXECUTABLE_SUFFIX} DESTINATION bin PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) function(add_clobber_steps name) ExternalProject_Add_Step(${name} force-reconfigure DEPENDERS configure ALWAYS 1 ) ExternalProject_Add_Step(${name} clobber COMMAND ${CMAKE_COMMAND} -E remove_directory COMMAND ${CMAKE_COMMAND} -E make_directory COMMENT "Clobbering ${name} build directory..." DEPENDERS configure DEPENDS ${ARGN} ) endfunction() processorcount(PROCESSOR_COUNT) function(add_libgo_variant suffix cflags gocflags deps exclude_from_all) externalproject_add(libbacktrace${suffix} DEPENDS clang ${deps} SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libbacktrace BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${suffix}/libbacktrace CONFIGURE_COMMAND /configure --disable-multilib --enable-host-shared "CC=${CMAKE_BINARY_DIR}/bin/clang ${cflags}" BUILD_COMMAND make -j${PROCESSOR_COUNT} INSTALL_COMMAND "" LOG_CONFIGURE 1 LOG_BUILD 1 ) set_property(TARGET libbacktrace${suffix} PROPERTY EXCLUDE_FROM_ALL ${exclude_from_all}) add_clobber_steps(libbacktrace${suffix} clang ${deps}) externalproject_add(libffi${suffix} DEPENDS clang ${deps} SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libffi BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${suffix}/libffi CONFIGURE_COMMAND /configure --disable-multilib "CC=${CMAKE_BINARY_DIR}/bin/clang ${cflags}" BUILD_COMMAND make -j${PROCESSOR_COUNT} INSTALL_COMMAND "" LOG_CONFIGURE 1 LOG_BUILD 1 ) set_property(TARGET libffi${suffix} PROPERTY EXCLUDE_FROM_ALL ${exclude_from_all}) add_clobber_steps(libffi${suffix} clang ${deps}) externalproject_add(libgo${suffix} DEPENDS clang llgo cc-wrapper libbacktrace${suffix} libffi${suffix} ${deps} SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${suffix}/libgo INSTALL_DIR ${CMAKE_BINARY_DIR} CONFIGURE_COMMAND /configure --disable-multilib --without-libatomic --prefix= "CC=env REAL_CC=${CMAKE_BINARY_DIR}/bin/clang@SPACE@${cflags} ${CMAKE_BINARY_DIR}/bin/cc-wrapper" "GOC=${CMAKE_BINARY_DIR}/bin/llgo -no-prefix -fcompilerrt-prefix=${CMAKE_BINARY_DIR} ${gocflags}" BUILD_COMMAND make -j${PROCESSOR_COUNT} LOG_CONFIGURE 1 LOG_BUILD 1 LOG_INSTALL 1 ) set_property(TARGET libgo${suffix} PROPERTY EXCLUDE_FROM_ALL ${exclude_from_all}) add_clobber_steps(libgo${suffix} clang ${CMAKE_BINARY_DIR}/bin/llgo${CMAKE_EXECUTABLE_SUFFIX} ${CMAKE_BINARY_DIR}/bin/cc-wrapper${CMAKE_EXECUTABLE_SUFFIX}) endfunction() add_libgo_variant("" "" "" "" FALSE) if(TARGET asan) add_libgo_variant("_asan" "-fsanitize=address" "-fsanitize=address" asan TRUE) endif() if(TARGET tsan) add_libgo_variant("_tsan" "-fsanitize=thread" "-fsanitize=thread" tsan TRUE) endif() if(TARGET msan) add_libgo_variant("_msan" "-fsanitize=memory" "-fsanitize=memory" msan TRUE) endif() if(TARGET dfsan) add_libgo_variant("_dfsan" "-fsanitize=dataflow" "-fsanitize=dataflow" dfsan TRUE) endif() set(LLGO_LIBRARY_DIR ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX}) install(FILES ${LLGO_LIBRARY_DIR}/libgo-llgo.a ${LLGO_LIBRARY_DIR}/libgo-llgo.so ${LLGO_LIBRARY_DIR}/libgo-llgo.so.8 ${LLGO_LIBRARY_DIR}/libgo-llgo.so.8.0.0 ${LLGO_LIBRARY_DIR}/libgobegin-llgo.a DESTINATION lib${LLVM_LIBDIR_SUFFIX}) install(DIRECTORY ${LLGO_LIBRARY_DIR}/go DESTINATION lib${LLVM_LIBDIR_SUFFIX}) add_custom_target(check-libgo COMMAND make -C ${CMAKE_CURRENT_BINARY_DIR}/libgo -j${PROCESSOR_COUNT} check DEPENDS libgo ${cmake_3_2_USES_TERMINAL} COMMENT "Running libgo tests") add_custom_target(check-llgo-bootstrap COMMAND strip -R .note.gnu.build-id -o ${CMAKE_CURRENT_BINARY_DIR}/llgo-stage2.stripped ${CMAKE_BINARY_DIR}/bin/llgo-stage2${CMAKE_EXECUTABLE_SUFFIX} COMMAND strip -R .note.gnu.build-id -o ${CMAKE_CURRENT_BINARY_DIR}/llgo-stage3.stripped ${CMAKE_BINARY_DIR}/bin/llgo-stage3${CMAKE_EXECUTABLE_SUFFIX} COMMAND cmp ${CMAKE_CURRENT_BINARY_DIR}/llgo-stage2.stripped ${CMAKE_CURRENT_BINARY_DIR}/llgo-stage3.stripped DEPENDS llgo-stage2 llgo-stage3 COMMENT "Checking llgo bootstrap") add_subdirectory(test)