github.com/llvm-mirror/llgo@v0.0.0-20190322182713-bf6f0a60fce1/CMakeLists.txt (about)

     1  include(ExternalProject)
     2  include(ProcessorCount)
     3  
     4  # Provide a config.h which exposes build system information.
     5  configure_file(
     6    cmd/gllgo/config.h.cmake
     7    ${CMAKE_CURRENT_BINARY_DIR}/cmd/gllgo/config.h)
     8  include_directories(${CMAKE_CURRENT_BINARY_DIR}/cmd/gllgo)
     9  
    10  list(APPEND LLVM_GO_PACKAGES "llvm.org/llgo=${CMAKE_CURRENT_SOURCE_DIR}")
    11  
    12  llvm_add_go_executable(llgo llvm.org/llgo/cmd/gllgo ALL DEPENDS
    13    build/context.go
    14    cmd/gllgo/gllgo.go
    15    debug/debug.go
    16    driver/parser.go
    17    irgen/annotations.go
    18    irgen/attribute.go
    19    irgen/builtins.go
    20    irgen/cabi.go
    21    irgen/call.go
    22    irgen/channels.go
    23    irgen/closures.go
    24    irgen/compiler.go
    25    irgen/errors.go
    26    irgen/indirect.go
    27    irgen/interfaces.go
    28    irgen/maps.go
    29    irgen/predicates.go
    30    irgen/println.go
    31    irgen/runtime.go
    32    irgen/slice.go
    33    irgen/ssa.go
    34    irgen/strings.go
    35    irgen/switches.go
    36    irgen/targets.go
    37    irgen/typemap.go
    38    irgen/types.go
    39    irgen/utils.go
    40    irgen/value.go
    41    irgen/version.go
    42    ssaopt/esc.go
    43  )
    44  
    45  string(REGEX MATCH "[0-9]+\\.[0-9]+(\\.[0-9]+)?" LLGO_VERSION
    46    ${PACKAGE_VERSION})
    47  
    48  configure_file(
    49    cmd/go/zdefaultcc.go.in
    50    ${CMAKE_CURRENT_BINARY_DIR}/cmd/go/zdefaultcc.go)
    51  
    52  set(LLGO_GO_SOURCES
    53    ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/build.go
    54    ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/clean.go
    55    ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/context.go
    56    ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/discovery.go
    57    ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/doc.go
    58    ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/env.go
    59    ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/fix.go
    60    ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/fmt.go
    61    ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/generate.go
    62    ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/get.go
    63    ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/go11.go
    64    ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/help.go
    65    ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/http.go
    66    ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/list.go
    67    ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/main.go
    68    ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/note.go
    69    ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/pkg.go
    70    ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/run.go
    71    ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/signal.go
    72    ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/signal_unix.go
    73    ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/testflag.go
    74    ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/test.go
    75    ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/tool.go
    76    ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/vcs.go
    77    ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/version.go
    78    ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/vet.go
    79    ${CMAKE_CURRENT_BINARY_DIR}/cmd/go/zdefaultcc.go
    80  )
    81  
    82  add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/bin/llgo-go${CMAKE_EXECUTABLE_SUFFIX}
    83    COMMAND ${CMAKE_BINARY_DIR}/bin/llgo -static-libgo
    84            -I ${CMAKE_CURRENT_BINARY_DIR}/libgo
    85            -o ${CMAKE_BINARY_DIR}/bin/llgo-go${CMAKE_EXECUTABLE_SUFFIX}
    86            ${LLGO_GO_SOURCES}
    87            ${CMAKE_CURRENT_BINARY_DIR}/libgo/zstdpkglist.go
    88    DEPENDS llgo libgo ${LLGO_GO_SOURCES}
    89    COMMENT "Building Go executable llgo-go"
    90    VERBATIM)
    91  add_custom_target(llgo-go ALL DEPENDS ${CMAKE_BINARY_DIR}/bin/llgo-go${CMAKE_EXECUTABLE_SUFFIX})
    92  
    93  set(LLGO_CGO_SOURCES
    94    ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/cgo/ast.go
    95    ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/cgo/doc.go
    96    ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/cgo/gcc.go
    97    ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/cgo/godefs.go
    98    ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/cgo/main.go
    99    ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/cgo/out.go
   100    ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/cgo/util.go
   101    ${CMAKE_CURRENT_SOURCE_DIR}/cmd/cgo/zdefaultcc.go
   102  )
   103  
   104  add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/lib/go/llgo-${LLGO_VERSION}/cgo
   105    COMMAND ${CMAKE_BINARY_DIR}/bin/llgo -static-libgo
   106            -o ${CMAKE_BINARY_DIR}/lib/go/llgo-${LLGO_VERSION}/cgo
   107            ${LLGO_CGO_SOURCES}
   108    DEPENDS llgo libgo ${LLGO_CGO_SOURCES}
   109    COMMENT "Building Go executable cgo"
   110    VERBATIM)
   111  add_custom_target(cgo ALL DEPENDS ${CMAKE_BINARY_DIR}/lib/go/llgo-${LLGO_VERSION}/cgo)
   112  
   113  llvm_add_go_executable(llgo-stage2 llvm.org/llgo/cmd/gllgo
   114    DEPENDS libgo ${CMAKE_BINARY_DIR}/bin/llgo${CMAKE_EXECUTABLE_SUFFIX}
   115            ${CMAKE_BINARY_DIR}/lib/go/llgo-${LLGO_VERSION}/cgo
   116            ${CMAKE_BINARY_DIR}/bin/llgo-go${CMAKE_EXECUTABLE_SUFFIX}
   117    GOFLAGS "cc=${CMAKE_BINARY_DIR}/bin/clang"
   118            "cxx=${CMAKE_BINARY_DIR}/bin/clang++"
   119            "go=${CMAKE_BINARY_DIR}/bin/llgo-go"
   120  )
   121  
   122  llvm_add_go_executable(llgo-stage3 llvm.org/llgo/cmd/gllgo
   123    DEPENDS libgo ${CMAKE_BINARY_DIR}/bin/llgo-stage2${CMAKE_EXECUTABLE_SUFFIX}
   124    GOFLAGS "cc=${CMAKE_BINARY_DIR}/bin/clang"
   125            "cxx=${CMAKE_BINARY_DIR}/bin/clang++"
   126            "go=${CMAKE_BINARY_DIR}/bin/llgo-go"
   127            "llgo=${CMAKE_BINARY_DIR}/bin/llgo-stage2${CMAKE_EXECUTABLE_SUFFIX}"
   128  )
   129  
   130  llvm_add_go_executable(cc-wrapper llvm.org/llgo/cmd/cc-wrapper DEPENDS
   131    cmd/cc-wrapper/main.go
   132  )
   133  
   134  llvm_add_go_executable(llgoi llvm.org/llgo/cmd/llgoi ALL
   135    DEPENDS libgo ${CMAKE_BINARY_DIR}/bin/llgo${CMAKE_EXECUTABLE_SUFFIX}
   136            ${CMAKE_BINARY_DIR}/lib/go/llgo-${LLGO_VERSION}/cgo
   137            ${CMAKE_BINARY_DIR}/bin/llgo-go${CMAKE_EXECUTABLE_SUFFIX}
   138            cmd/llgoi/llgoi.go
   139    GOFLAGS "cc=${CMAKE_BINARY_DIR}/bin/clang"
   140            "cxx=${CMAKE_BINARY_DIR}/bin/clang++"
   141            "go=${CMAKE_BINARY_DIR}/bin/llgo-go"
   142  )
   143  
   144  install(FILES ${CMAKE_BINARY_DIR}/bin/llgo${CMAKE_EXECUTABLE_SUFFIX}
   145                ${CMAKE_BINARY_DIR}/bin/llgoi${CMAKE_EXECUTABLE_SUFFIX}
   146                ${CMAKE_BINARY_DIR}/bin/llgo-go${CMAKE_EXECUTABLE_SUFFIX}
   147          DESTINATION bin
   148          PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE
   149                      GROUP_READ GROUP_EXECUTE
   150                      WORLD_READ WORLD_EXECUTE)
   151  
   152  function(add_clobber_steps name)
   153    ExternalProject_Add_Step(${name} force-reconfigure
   154      DEPENDERS configure
   155      ALWAYS 1
   156      )
   157  
   158    ExternalProject_Add_Step(${name} clobber
   159      COMMAND ${CMAKE_COMMAND} -E remove_directory <BINARY_DIR>
   160      COMMAND ${CMAKE_COMMAND} -E make_directory <BINARY_DIR>
   161      COMMENT "Clobbering ${name} build directory..."
   162      DEPENDERS configure
   163      DEPENDS ${ARGN}
   164      )
   165  endfunction()
   166  
   167  processorcount(PROCESSOR_COUNT)
   168  
   169  function(add_libgo_variant suffix cflags gocflags deps exclude_from_all)
   170    externalproject_add(libbacktrace${suffix}
   171      DEPENDS clang ${deps}
   172      SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libbacktrace
   173      BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${suffix}/libbacktrace
   174      CONFIGURE_COMMAND <SOURCE_DIR>/configure --disable-multilib --enable-host-shared "CC=${CMAKE_BINARY_DIR}/bin/clang ${cflags}"
   175      BUILD_COMMAND make -j${PROCESSOR_COUNT}
   176      INSTALL_COMMAND ""
   177      LOG_CONFIGURE 1
   178      LOG_BUILD 1
   179    )
   180    set_property(TARGET libbacktrace${suffix}
   181                 PROPERTY EXCLUDE_FROM_ALL ${exclude_from_all})
   182  
   183    add_clobber_steps(libbacktrace${suffix} clang ${deps})
   184  
   185    externalproject_add(libffi${suffix}
   186      DEPENDS clang ${deps}
   187      SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libffi
   188      BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${suffix}/libffi
   189      CONFIGURE_COMMAND <SOURCE_DIR>/configure --disable-multilib "CC=${CMAKE_BINARY_DIR}/bin/clang ${cflags}"
   190      BUILD_COMMAND make -j${PROCESSOR_COUNT}
   191      INSTALL_COMMAND ""
   192      LOG_CONFIGURE 1
   193      LOG_BUILD 1
   194    )
   195    set_property(TARGET libffi${suffix}
   196                 PROPERTY EXCLUDE_FROM_ALL ${exclude_from_all})
   197  
   198    add_clobber_steps(libffi${suffix} clang ${deps})
   199  
   200    externalproject_add(libgo${suffix}
   201      DEPENDS clang llgo cc-wrapper libbacktrace${suffix} libffi${suffix} ${deps}
   202      SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo
   203      BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${suffix}/libgo
   204      INSTALL_DIR ${CMAKE_BINARY_DIR}
   205      CONFIGURE_COMMAND <SOURCE_DIR>/configure --disable-multilib --without-libatomic --prefix=<INSTALL_DIR> "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}"
   206      BUILD_COMMAND make -j${PROCESSOR_COUNT}
   207      LOG_CONFIGURE 1
   208      LOG_BUILD 1
   209      LOG_INSTALL 1
   210    )
   211    set_property(TARGET libgo${suffix}
   212                 PROPERTY EXCLUDE_FROM_ALL ${exclude_from_all})
   213  
   214    add_clobber_steps(libgo${suffix} clang
   215      ${CMAKE_BINARY_DIR}/bin/llgo${CMAKE_EXECUTABLE_SUFFIX}
   216      ${CMAKE_BINARY_DIR}/bin/cc-wrapper${CMAKE_EXECUTABLE_SUFFIX})
   217  endfunction()
   218  
   219  add_libgo_variant("" "" "" "" FALSE)
   220  
   221  if(TARGET asan)
   222    add_libgo_variant("_asan" "-fsanitize=address" "-fsanitize=address" asan TRUE)
   223  endif()
   224  
   225  if(TARGET tsan)
   226    add_libgo_variant("_tsan" "-fsanitize=thread" "-fsanitize=thread" tsan TRUE)
   227  endif()
   228  
   229  if(TARGET msan)
   230    add_libgo_variant("_msan" "-fsanitize=memory" "-fsanitize=memory" msan TRUE)
   231  endif()
   232  
   233  if(TARGET dfsan)
   234    add_libgo_variant("_dfsan" "-fsanitize=dataflow" "-fsanitize=dataflow" dfsan TRUE)
   235  endif()
   236  
   237  set(LLGO_LIBRARY_DIR ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX})
   238  
   239  install(FILES ${LLGO_LIBRARY_DIR}/libgo-llgo.a
   240                ${LLGO_LIBRARY_DIR}/libgo-llgo.so
   241                ${LLGO_LIBRARY_DIR}/libgo-llgo.so.8
   242                ${LLGO_LIBRARY_DIR}/libgo-llgo.so.8.0.0
   243                ${LLGO_LIBRARY_DIR}/libgobegin-llgo.a
   244          DESTINATION lib${LLVM_LIBDIR_SUFFIX})
   245  
   246  install(DIRECTORY ${LLGO_LIBRARY_DIR}/go
   247          DESTINATION lib${LLVM_LIBDIR_SUFFIX})
   248  
   249  add_custom_target(check-libgo
   250    COMMAND make -C ${CMAKE_CURRENT_BINARY_DIR}/libgo -j${PROCESSOR_COUNT} check
   251    DEPENDS libgo
   252    ${cmake_3_2_USES_TERMINAL}
   253    COMMENT "Running libgo tests")
   254  
   255  add_custom_target(check-llgo-bootstrap
   256    COMMAND strip -R .note.gnu.build-id -o ${CMAKE_CURRENT_BINARY_DIR}/llgo-stage2.stripped
   257            ${CMAKE_BINARY_DIR}/bin/llgo-stage2${CMAKE_EXECUTABLE_SUFFIX}
   258    COMMAND strip -R .note.gnu.build-id -o ${CMAKE_CURRENT_BINARY_DIR}/llgo-stage3.stripped
   259            ${CMAKE_BINARY_DIR}/bin/llgo-stage3${CMAKE_EXECUTABLE_SUFFIX}
   260    COMMAND cmp ${CMAKE_CURRENT_BINARY_DIR}/llgo-stage2.stripped
   261            ${CMAKE_CURRENT_BINARY_DIR}/llgo-stage3.stripped
   262    DEPENDS llgo-stage2 llgo-stage3
   263    COMMENT "Checking llgo bootstrap")
   264  
   265  add_subdirectory(test)