diff --git a/flang/cmake/modules/AddFlang.cmake b/flang/cmake/modules/AddFlang.cmake --- a/flang/cmake/modules/AddFlang.cmake +++ b/flang/cmake/modules/AddFlang.cmake @@ -17,7 +17,7 @@ macro(add_flang_library name) cmake_parse_arguments(ARG - "SHARED" + "SHARED;STATIC" "" "ADDITIONAL_HEADERS" ${ARGN}) @@ -52,7 +52,7 @@ else() # llvm_add_library ignores BUILD_SHARED_LIBS if STATIC is explicitly set, # so we need to handle it here. - if (BUILD_SHARED_LIBS) + if (BUILD_SHARED_LIBS AND NOT ARG_STATIC) set(LIBTYPE SHARED OBJECT) else() set(LIBTYPE STATIC OBJECT) diff --git a/flang/runtime/CMakeLists.txt b/flang/runtime/CMakeLists.txt --- a/flang/runtime/CMakeLists.txt +++ b/flang/runtime/CMakeLists.txt @@ -1,15 +1,9 @@ -#===-- runtime/CMakeLists.txt ----------------------------------------------===# -# -# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -# See https://llvm.org/LICENSE.txt for license information. -# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -# -#===------------------------------------------------------------------------===# include(CheckCXXSymbolExists) include(CheckCXXSourceCompiles) check_cxx_symbol_exists(strerror string.h HAVE_STRERROR) check_cxx_symbol_exists(strerror_r string.h HAVE_STRERROR_R) + # Can't use symbol exists here as the function is overloaded in C++ check_cxx_source_compiles( "#include @@ -30,7 +24,7 @@ # with different names include_directories(AFTER ${CMAKE_CURRENT_BINARY_DIR}) -add_flang_library(FortranRuntime +add_flang_library(FortranRuntime PARTIAL_SOURCES_INTENDED ISO_Fortran_binding.cpp allocatable.cpp assign.cpp @@ -82,3 +76,7 @@ LINK_LIBS FortranDecimal ) + +add_flang_library(Fortran_main STATIC PARTIAL_SOURCES_INTENDED + Fortran_main.c +) diff --git a/flang/runtime/Fortran_main.c b/flang/runtime/Fortran_main.c new file mode 100644 --- /dev/null +++ b/flang/runtime/Fortran_main.c @@ -0,0 +1,14 @@ +#include "flang/Runtime/main.h" +#include "flang/Runtime/stop.h" + +/* main entry into PROGRAM */ +void _QQmain(); + +/* C main stub */ +int main(int argc, const char *argv[], const char *envp[]) +{ + RTNAME(ProgramStart)(argc, argv, envp); + _QQmain(); + RTNAME(ProgramEndStatement)(); + return 0; +}