include(LLVMProcessSources)
include(LLVM-Config)
+function(llvm_update_compile_flags name)
+ get_property(sources TARGET ${name} PROPERTY SOURCES)
+ if("${sources}" MATCHES "\\.c(;|$)")
+ set(update_src_props ON)
+ endif()
+
+ if(LLVM_REQUIRES_EH)
+ set(LLVM_REQUIRES_RTTI ON)
+ else()
+ if(LLVM_COMPILER_IS_GCC_COMPATIBLE)
+ list(APPEND LLVM_COMPILE_FLAGS "-fno-exceptions")
+ elseif(MSVC)
+ list(APPEND LLVM_COMPILE_DEFINITIONS _HAS_EXCEPTIONS=0)
+ list(APPEND LLVM_COMPILE_FLAGS "/EHs-c-")
+ endif()
+ endif()
+
+ if(NOT LLVM_REQUIRES_RTTI)
+ list(APPEND LLVM_COMPILE_DEFINITIONS GTEST_HAS_RTTI=0)
+ if (LLVM_COMPILER_IS_GCC_COMPATIBLE)
+ list(APPEND LLVM_COMPILE_FLAGS "-fno-rtti")
+ elseif (MSVC)
+ list(APPEND LLVM_COMPILE_FLAGS "/GR-")
+ endif ()
+ endif()
+
+ # Assume that;
+ # - LLVM_COMPILE_FLAGS is list.
+ # - PROPERTY COMPILE_FLAGS is string.
+ string(REPLACE ";" " " target_compile_flags "${LLVM_COMPILE_FLAGS}")
+
+ if(update_src_props)
+ foreach(fn ${sources})
+ get_filename_component(suf ${fn} EXT)
+ if("${suf}" STREQUAL ".cpp")
+ set_property(SOURCE ${fn} APPEND_STRING PROPERTY
+ COMPILE_FLAGS "${target_compile_flags}")
+ endif()
+ endforeach()
+ else()
+ # Update target props, since all sources are C++.
+ set_property(TARGET ${name} APPEND_STRING PROPERTY
+ COMPILE_FLAGS "${target_compile_flags}")
+ endif()
+
+ set_property(TARGET ${name} APPEND PROPERTY COMPILE_DEFINITIONS ${LLVM_COMPILE_DEFINITIONS})
+endfunction()
+
function(add_llvm_symbol_exports target_name export_file)
if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
set(native_export_file "${target_name}.exports")
endif()
add_custom_target(${target_name}_exports DEPENDS ${native_export_file})
+ set_target_properties(${target_name}_exports PROPERTIES FOLDER "Misc")
get_property(srcs TARGET ${target_name} PROPERTY SOURCES)
foreach(src ${srcs})
# Force re-linking when the exports file changes. Actually, it
# forces recompilation of the source file. The LINK_DEPENDS target
# property only works for makefile-based generators.
- set_property(SOURCE ${first_source_file} APPEND PROPERTY
- OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${native_export_file})
+ # FIXME: This is not safe because this will create the same target
+ # ${native_export_file} in several different file:
+ # - One where we emitted ${target_name}_exports
+ # - One where we emitted the build command for the following object.
+ # set_property(SOURCE ${first_source_file} APPEND PROPERTY
+ # OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${native_export_file})
set_property(DIRECTORY APPEND
PROPERTY ADDITIONAL_MAKE_CLEAN_FILES ${native_export_file})
endfunction(add_llvm_symbol_exports)
function(add_dead_strip target_name)
- if(NOT CYGWIN AND NOT MINGW AND NOT MSVC)
- if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
- SET(CMAKE_CXX_FLAGS
- "${CMAKE_CXX_FLAGS} -ffunction-sections -fdata-sections"
- PARENT_SCOPE)
- endif()
- endif()
if(NOT LLVM_NO_DEAD_STRIP)
if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
set_property(TARGET ${target_name} APPEND_STRING PROPERTY
LINK_FLAGS " -Wl,-dead_strip")
elseif(NOT WIN32)
+ # Object files are compiled with -ffunction-data-sections.
set_property(TARGET ${target_name} APPEND_STRING PROPERTY
LINK_FLAGS " -Wl,--gc-sections")
endif()
endif()
endfunction()
-macro(add_llvm_library name)
- llvm_process_sources( ALL_FILES ${ARGN} )
- add_library( ${name} ${ALL_FILES} )
+# llvm_add_library(name sources...
+# MODULE;SHARED;STATIC
+# STATIC by default w/o BUILD_SHARED_LIBS.
+# SHARED by default w/ BUILD_SHARED_LIBS.
+# OUTPUT_NAME name
+# Corresponds to OUTPUT_NAME in target properties.
+# DEPENDS targets...
+# Same semantics as add_dependencies().
+# LINK_COMPONENTS components...
+# Same as the variable LLVM_LINK_COMPONENTS.
+# LINK_LIBS lib_targets...
+# Same semantics as target_link_libraries().
+# ADDITIONAL_HEADERS (implemented in LLVMProcessSources)
+# May specify header files for IDE generators.
+# )
+function(llvm_add_library name)
+ cmake_parse_arguments(ARG
+ "MODULE;SHARED;STATIC"
+ "OUTPUT_NAME"
+ "DEPENDS;LINK_COMPONENTS;LINK_LIBS"
+ ${ARGN})
+ list(APPEND LLVM_COMMON_DEPENDS ${ARG_DEPENDS})
+ llvm_process_sources(ALL_FILES ${ARG_UNPARSED_ARGUMENTS})
+
+ if(ARG_MODULE)
+ if(ARG_SHARED OR ARG_STATIC)
+ message(WARNING "MODULE with SHARED|STATIC doesn't make sense.")
+ endif()
+ else()
+ if(BUILD_SHARED_LIBS AND NOT ARG_STATIC)
+ set(ARG_SHARED TRUE)
+ endif()
+ if(NOT ARG_SHARED)
+ set(ARG_STATIC TRUE)
+ endif()
+ endif()
+
+ if(ARG_MODULE)
+ add_library(${name} MODULE ${ALL_FILES})
+ elseif(ARG_SHARED)
+ add_library(${name} SHARED ${ALL_FILES})
+ else()
+ add_library(${name} STATIC ${ALL_FILES})
+ endif()
set_output_directory(${name} ${LLVM_RUNTIME_OUTPUT_INTDIR} ${LLVM_LIBRARY_OUTPUT_INTDIR})
- set_property( GLOBAL APPEND PROPERTY LLVM_LIBS ${name} )
+ llvm_update_compile_flags(${name})
add_dead_strip( ${name} )
- if( LLVM_COMMON_DEPENDS )
- add_dependencies( ${name} ${LLVM_COMMON_DEPENDS} )
- endif( LLVM_COMMON_DEPENDS )
+ if(ARG_OUTPUT_NAME)
+ set_target_properties(${name}
+ PROPERTIES
+ OUTPUT_NAME ${ARG_OUTPUT_NAME}
+ )
+ endif()
- if( BUILD_SHARED_LIBS )
- llvm_config( ${name} ${LLVM_LINK_COMPONENTS} )
+ if(ARG_MODULE)
+ set_property(TARGET ${name} PROPERTY SUFFIX ${LLVM_PLUGIN_EXT})
+ endif()
+
+ if(ARG_SHARED)
if (MSVC)
set_target_properties(${name}
PROPERTIES
IMPORT_SUFFIX ".imp")
endif ()
+ endif()
+ if(ARG_MODULE OR ARG_SHARED)
if (LLVM_EXPORTED_SYMBOL_FILE)
add_llvm_symbol_exports( ${name} ${LLVM_EXPORTED_SYMBOL_FILE} )
endif()
endif()
+ target_link_libraries(${name} ${ARG_LINK_LIBS})
+
+ llvm_config(${name} ${ARG_LINK_COMPONENTS} ${LLVM_LINK_COMPONENTS})
+
# Ensure that the system libraries always comes last on the
# list. Without this, linking the unit tests on MinGW fails.
link_system_libs( ${name} )
+ if(LLVM_COMMON_DEPENDS)
+ add_dependencies(${name} ${LLVM_COMMON_DEPENDS})
+ endif()
+endfunction()
+
+macro(add_llvm_library name)
+ if( BUILD_SHARED_LIBS )
+ llvm_add_library(${name} SHARED ${ARGN})
+ else()
+ llvm_add_library(${name} ${ARGN})
+ endif()
+ set_property( GLOBAL APPEND PROPERTY LLVM_LIBS ${name} )
+
if( EXCLUDE_FROM_ALL )
set_target_properties( ${name} PROPERTIES EXCLUDE_FROM_ALL ON)
else()
if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY OR ${name} STREQUAL "LTO")
install(TARGETS ${name}
+ EXPORT LLVMExports
LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX}
ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX})
endif()
+ set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name})
endif()
set_target_properties(${name} PROPERTIES FOLDER "Libraries")
# Add empty "phony" target
add_custom_target(${name})
else()
- llvm_process_sources( ALL_FILES ${ARGN} )
- if (MODULE)
- set(libkind MODULE)
- else()
- set(libkind SHARED)
- endif()
-
- add_library( ${name} ${libkind} ${ALL_FILES} )
+ llvm_add_library(${name} MODULE ${ARGN})
set_target_properties( ${name} PROPERTIES PREFIX "" )
- add_dead_strip( ${name} )
-
- if (LLVM_EXPORTED_SYMBOL_FILE)
- add_llvm_symbol_exports( ${name} ${LLVM_EXPORTED_SYMBOL_FILE} )
- endif(LLVM_EXPORTED_SYMBOL_FILE)
-
- llvm_config( ${name} ${LLVM_LINK_COMPONENTS} )
- link_system_libs( ${name} )
if (APPLE)
# Darwin-specific linker flags for loadable modules.
else()
if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
install(TARGETS ${name}
+ EXPORT LLVMExports
LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX}
ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX})
endif()
+ set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name})
endif()
endif()
else()
add_executable(${name} ${ALL_FILES})
endif()
+ llvm_update_compile_flags(${name})
add_dead_strip( ${name} )
if (LLVM_EXPORTED_SYMBOL_FILE)
)
macro(add_llvm_tool name)
- set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LLVM_TOOLS_BINARY_DIR})
if( NOT LLVM_BUILD_TOOLS )
set(EXCLUDE_FROM_ALL ON)
endif()
list(FIND LLVM_TOOLCHAIN_TOOLS ${name} LLVM_IS_${name}_TOOLCHAIN_TOOL)
if (LLVM_IS_${name}_TOOLCHAIN_TOOL GREATER -1 OR NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
if( LLVM_BUILD_TOOLS )
- install(TARGETS ${name} RUNTIME DESTINATION bin)
+ install(TARGETS ${name}
+ EXPORT LLVMExports
+ RUNTIME DESTINATION bin)
endif()
endif()
+ if( LLVM_BUILD_TOOLS )
+ set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name})
+ endif()
set_target_properties(${name} PROPERTIES FOLDER "Tools")
endmacro(add_llvm_tool name)
macro(add_llvm_example name)
-# set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LLVM_EXAMPLES_BINARY_DIR})
if( NOT LLVM_BUILD_EXAMPLES )
set(EXCLUDE_FROM_ALL ON)
endif()
set(EXCLUDE_FROM_ALL ON)
endif()
+ # Visual Studio 2012 only supports up to 8 template parameters in
+ # std::tr1::tuple by default, but gtest requires 10
+ if (MSVC AND MSVC_VERSION EQUAL 1700)
+ list(APPEND LLVM_COMPILE_DEFINITIONS _VARIADIC_MAX=10)
+ endif ()
+
+ include_directories(${LLVM_MAIN_SRC_DIR}/utils/unittest/googletest/include)
+ if (NOT LLVM_ENABLE_THREADS)
+ list(APPEND LLVM_COMPILE_DEFINITIONS GTEST_HAS_PTHREAD=0)
+ endif ()
+
+ if (SUPPORTS_NO_VARIADIC_MACROS_FLAG)
+ list(APPEND LLVM_COMPILE_FLAGS "-Wno-variadic-macros")
+ endif ()
+
+ set(LLVM_REQUIRES_RTTI OFF)
+
add_llvm_executable(${test_name} ${ARGN})
set(outdir ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR})
set_output_directory(${test_name} ${outdir} ${outdir})
if (NOT ${test_suite_folder} STREQUAL "NOTFOUND")
set_property(TARGET ${test_name} PROPERTY FOLDER "${test_suite_folder}")
endif ()
-
- # Visual Studio 2012 only supports up to 8 template parameters in
- # std::tr1::tuple by default, but gtest requires 10
- if (MSVC AND MSVC_VERSION EQUAL 1700)
- set_property(TARGET ${test_name} APPEND PROPERTY COMPILE_DEFINITIONS _VARIADIC_MAX=10)
- endif ()
-
- include_directories(${LLVM_MAIN_SRC_DIR}/utils/unittest/googletest/include)
- set_property(TARGET ${test_name} APPEND PROPERTY COMPILE_DEFINITIONS GTEST_HAS_RTTI=0)
- if (NOT LLVM_ENABLE_THREADS)
- set_property(TARGET ${test_name} APPEND PROPERTY COMPILE_DEFINITIONS GTEST_HAS_PTHREAD=0)
- endif ()
-
- get_property(target_compile_flags TARGET ${test_name} PROPERTY COMPILE_FLAGS)
- if (LLVM_COMPILER_IS_GCC_COMPATIBLE)
- set(target_compile_flags "${target_compile_flags} -fno-rtti")
- elseif (MSVC)
- llvm_replace_compiler_option(target_compile_flags "/GR" "/GR-")
- endif ()
-
- if (SUPPORTS_NO_VARIADIC_MACROS_FLAG)
- set(target_compile_flags "${target_compile_flags} -Wno-variadic-macros")
- endif ()
- set_property(TARGET ${test_name} PROPERTY COMPILE_FLAGS "${target_compile_flags}")
endfunction()
# This function provides an automatic way to 'configure'-like generate a file
set(TARGETS_TO_BUILD ${TARGETS_BUILT})
set(SHLIBEXT "${LTDL_SHLIB_EXT}")
- set(SHLIBDIR "${LLVM_LIBRARY_OUTPUT_INTDIR}")
if(BUILD_SHARED_LIBS)
set(LLVM_SHARED_LIBS_ENABLED "1")
set(LLVM_BUILD_MODE "%(build_mode)s")
endif ()
+ # They below might not be the build tree but provided binary tree.
set(LLVM_SOURCE_DIR ${LLVM_MAIN_SRC_DIR})
set(LLVM_BINARY_DIR ${LLVM_BINARY_DIR})
- string(REPLACE ${CMAKE_CFG_INTDIR} ${LLVM_BUILD_MODE} LLVM_TOOLS_DIR ${LLVM_RUNTIME_OUTPUT_INTDIR})
- string(REPLACE ${CMAKE_CFG_INTDIR} ${LLVM_BUILD_MODE} LLVM_LIBS_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR})
+ string(REPLACE ${CMAKE_CFG_INTDIR} ${LLVM_BUILD_MODE} LLVM_TOOLS_DIR ${LLVM_TOOLS_BINARY_DIR})
+ string(REPLACE ${CMAKE_CFG_INTDIR} ${LLVM_BUILD_MODE} LLVM_LIBS_DIR ${LLVM_LIBRARY_DIR})
+
+ # SHLIBDIR points the build tree.
+ string(REPLACE ${CMAKE_CFG_INTDIR} ${LLVM_BUILD_MODE} SHLIBDIR ${LLVM_LIBRARY_OUTPUT_INTDIR})
+
set(PYTHON_EXECUTABLE ${PYTHON_EXECUTABLE})
set(ENABLE_SHARED ${LLVM_SHARED_LIBS_ENABLED})
set(SHLIBPATH_VAR ${SHLIBPATH_VAR})