aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2011-11-10 19:59:35 +0000
committerDaniel Dunbar <daniel@zuster.org>2011-11-10 19:59:35 +0000
commit1ad92131abbed3d2992d5996969274a8e1ae9a6b (patch)
tree773ce7f5c949f85879d65bb5f26620ba6e9ed587
parent0ad62be9aa54c4e4670af758c37c2d0673bc67e4 (diff)
Revert r144300 "llvm-config: Replace with C++ version (was llvm-config-2).",
which didn't appear ready for prime time. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@144309 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--CMakeLists.txt2
-rw-r--r--Makefile6
-rw-r--r--Makefile.rules7
-rwxr-xr-xconfigure2
-rw-r--r--tools/CMakeLists.txt11
-rw-r--r--tools/Makefile2
-rw-r--r--tools/llvm-config-2/BuildVariables.inc.in (renamed from tools/llvm-config/BuildVariables.inc.in)0
-rw-r--r--tools/llvm-config-2/CMakeLists.txt41
-rw-r--r--tools/llvm-config-2/Makefile57
-rw-r--r--tools/llvm-config-2/llvm-config.cpp (renamed from tools/llvm-config/llvm-config.cpp)0
-rw-r--r--tools/llvm-config/CMakeLists.txt151
-rw-r--r--tools/llvm-config/Makefile92
-rwxr-xr-xtools/llvm-config/find-cycles.pl170
-rw-r--r--tools/llvm-config/llvm-config.in.in466
14 files changed, 938 insertions, 69 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 6dd8169ebc..5d36f5fc10 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -230,7 +230,7 @@ endif()
set(LLVMBUILDTOOL "${LLVM_MAIN_SRC_DIR}/utils/llvm-build/llvm-build")
set(LLVMCONFIGLIBRARYDEPENDENCIESINC
- "${LLVM_BINARY_DIR}/tools/llvm-config/LibraryDependencies.inc")
+ "${LLVM_BINARY_DIR}/tools/llvm-config-2/LibraryDependencies.inc")
set(LLVMBUILDCMAKEFRAG
"${LLVM_BINARY_DIR}/LLVMBuild.cmake")
message(STATUS "Constructing LLVMBuild project information")
diff --git a/Makefile b/Makefile
index 3590d5c6cf..dae41cf56a 100644
--- a/Makefile
+++ b/Makefile
@@ -10,12 +10,12 @@
LEVEL := .
# Top-Level LLVM Build Stages:
-# 0. Execute llvm-build, to construct llvm-config library dependencies.
# 1. Build lib/Support and lib/TableGen, which are used by utils (tblgen).
# 2. Build utils, which is used by VMCore.
# 3. Build VMCore, which builds the Intrinsics.inc file used by libs.
-# 4. Build llvm-config, which determines inter-lib dependencies for tools.
-# 5. Build tools, runtime, docs.
+# 4. Build libs, which are needed by llvm-config.
+# 5. Build llvm-config, which determines inter-lib dependencies for tools.
+# 6. Build tools, runtime, docs.
#
# When cross-compiling, there are some things (tablegen) that need to
# be build for the build system first.
diff --git a/Makefile.rules b/Makefile.rules
index b2132f11cb..78d1f97e14 100644
--- a/Makefile.rules
+++ b/Makefile.rules
@@ -79,7 +79,7 @@ LLVMBuildTool := $(PROJ_SRC_ROOT)/utils/llvm-build/llvm-build
# The files we are going to generate using llvm-build.
LLVMBuildMakeFrag := $(PROJ_OBJ_ROOT)/Makefile.llvmbuild
LLVMConfigLibraryDependenciesInc := \
- $(PROJ_OBJ_ROOT)/tools/llvm-config/LibraryDependencies.inc
+ $(PROJ_OBJ_ROOT)/tools/llvm-config-2/LibraryDependencies.inc
# The rule to create the LLVMBuild Makefile fragment as well as the llvm-config
# library table.
@@ -1006,16 +1006,11 @@ ifdef LINK_COMPONENTS
# If LLVM_CONFIG doesn't exist, build it. This can happen if you do a make
# clean in tools, then do a make in tools (instead of at the top level).
-#
-# We don't want these targets when actually building the LLVM_CONFIG tool
-# itself, of course.
-ifneq ($(TOOLNAME),llvm-config)
$(LLVM_CONFIG):
@echo "*** llvm-config doesn't exist - rebuilding it."
@$(MAKE) -C $(PROJ_OBJ_ROOT)/tools/llvm-config
$(ToolDir)/$(strip $(TOOLNAME))$(EXEEXT): $(LLVM_CONFIG)
-endif
ifeq ($(ENABLE_SHARED), 1)
# We can take the "auto-import" feature to get rid of using dllimport.
diff --git a/configure b/configure
index 46182ff624..ae6be9d535 100755
--- a/configure
+++ b/configure
@@ -21065,7 +21065,7 @@ if test -f ${srcdir}/tools/clang/README.txt; then
fi
-
+ac_config_files="$ac_config_files tools/llvm-config/llvm-config.in"
ac_config_files="$ac_config_files bindings/ocaml/llvm/META.llvm"
diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt
index 46d08a4b17..28b36dcdfd 100644
--- a/tools/CMakeLists.txt
+++ b/tools/CMakeLists.txt
@@ -11,9 +11,16 @@ if( EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/polly/CMakeLists.txt )
endif( EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/polly/CMakeLists.txt )
if( NOT WIN32 OR MSYS OR CYGWIN )
- # We currently require 'sed' to build llvm-config, so don't try to build it on
- # pure Win32.
+ # It is useful to build llvm-config before the other tools, so we
+ # have a fresh LibDeps.txt for regenerating the hard-coded library
+ # dependencies. llvm-config/CMakeLists.txt takes care of this but we
+ # must keep llvm-config as the first entry on the list of tools to
+ # be built.
add_subdirectory(llvm-config)
+
+ # We currently require 'sed' to build llvm-config-2, so don't try to build it
+ # on pure Win32.
+ add_subdirectory(llvm-config-2)
endif()
add_subdirectory(opt)
diff --git a/tools/Makefile b/tools/Makefile
index 2da3917781..278546bc16 100644
--- a/tools/Makefile
+++ b/tools/Makefile
@@ -34,7 +34,7 @@ PARALLEL_DIRS := opt llvm-as llvm-dis \
bugpoint llvm-bcanalyzer llvm-stub \
llvm-diff macho-dump llvm-objdump \
llvm-rtdyld llvm-dwarfdump llvm-cov \
- llvm-size
+ llvm-size llvm-config-2
# Let users override the set of tools to build from the command line.
ifdef ONLY_TOOLS
diff --git a/tools/llvm-config/BuildVariables.inc.in b/tools/llvm-config-2/BuildVariables.inc.in
index 5969772c9d..5969772c9d 100644
--- a/tools/llvm-config/BuildVariables.inc.in
+++ b/tools/llvm-config-2/BuildVariables.inc.in
diff --git a/tools/llvm-config-2/CMakeLists.txt b/tools/llvm-config-2/CMakeLists.txt
new file mode 100644
index 0000000000..3c7169d382
--- /dev/null
+++ b/tools/llvm-config-2/CMakeLists.txt
@@ -0,0 +1,41 @@
+set(LLVM_LINK_COMPONENTS support)
+
+# We need to generate the BuildVariables.inc file containing values which are
+# only defined when under certain build modes. Unfortunately, that precludes
+# doing this inside CMake so we have to shell out to sed. For now, that means we
+# can't expect to build llvm-config on Window.s
+set(BUILDVARIABLES_SRCPATH ${CMAKE_CURRENT_SOURCE_DIR}/BuildVariables.inc.in)
+set(BUILDVARIABLES_OBJPATH ${CMAKE_CURRENT_BINARY_DIR}/BuildVariables.inc)
+set(SEDSCRIPT_OBJPATH ${CMAKE_CURRENT_BINARY_DIR}/BuildVariables.configure.sed)
+
+# Compute the substitution values for various items.
+get_system_libs(LLVM_SYSTEM_LIBS_LIST)
+foreach(l ${LLVM_SYSTEM_LIBS_LIST})
+ set(SYSTEM_LIBS ${SYSTEM_LIBS} "-l${l}")
+endforeach()
+set(C_FLGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${uppercase_CMAKE_BUILD_TYPE}} ${LLVM_DEFINITIONS}")
+set(CXX_FLGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${uppercase_CMAKE_BUILD_TYPE}} ${LLVM_DEFINITIONS}")
+set(CPP_FLGS "${CMAKE_CPP_FLAGS} ${CMAKE_CPP_FLAGS_${uppercase_CMAKE_BUILD_TYPE}} ${LLVM_DEFINITIONS}")
+
+add_custom_command(OUTPUT ${BUILDVARIABLES_OBJPATH}
+ COMMAND echo s!@LLVM_SRC_ROOT@!${LLVM_MAIN_SRC_DIR}! > ${SEDSCRIPT_OBJPATH}
+ COMMAND echo s!@LLVM_OBJ_ROOT@!${LLVM_BINARY_DIR}! >> ${SEDSCRIPT_OBJPATH}
+ COMMAND echo s!@LLVM_CPPFLAGS@!${CPP_FLGS}! >> ${SEDSCRIPT_OBJPATH}
+ COMMAND echo s!@LLVM_CFLAGS@!${C_FLGS}! >> ${SEDSCRIPT_OBJPATH}
+ COMMAND echo s!@LLVM_CXXFLAGS@!${CXX_FLGS}! >> ${SEDSCRIPT_OBJPATH}
+ # TODO: Use general flags for linking! not just for shared libs:
+ COMMAND echo s!@LLVM_LDFLAGS@!${CMAKE_SHARED_LINKER_FLAGS}! >> ${SEDSCRIPT_OBJPATH}
+ COMMAND echo s!@LLVM_BUILDMODE@!${CMAKE_BUILD_TYPE}! >> ${SEDSCRIPT_OBJPATH}
+ COMMAND echo s!@LLVM_SYSTEM_LIBS@!${SYSTEM_LIBS}! >> ${SEDSCRIPT_OBJPATH}
+ COMMAND sed -f ${SEDSCRIPT_OBJPATH} < ${BUILDVARIABLES_SRCPATH} > ${BUILDVARIABLES_OBJPATH}
+ VERBATIM
+ COMMENT "Building BuildVariables.inc include."
+ )
+
+# Add the llvm-config tool.
+add_llvm_tool(llvm-config-2
+ llvm-config.cpp
+ )
+
+# Add the dependency on the generation step.
+add_file_dependencies(${CMAKE_CURRENT_SOURCE_DIR}/llvm-config.cpp ${BUILDVARIABLES_OBJPATH})
diff --git a/tools/llvm-config-2/Makefile b/tools/llvm-config-2/Makefile
new file mode 100644
index 0000000000..08e084429d
--- /dev/null
+++ b/tools/llvm-config-2/Makefile
@@ -0,0 +1,57 @@
+##===- tools/llvm-config/Makefile---------------------------*- Makefile -*-===##
+#
+# The LLVM Compiler Infrastructure
+#
+# This file is distributed under the University of Illinois Open Source
+# License. See LICENSE.TXT for details.
+#
+##===----------------------------------------------------------------------===##
+
+LEVEL := ../..
+TOOLNAME := llvm-config-2
+USEDLIBS := LLVMSupport.a
+
+# We generate sources in the build directory, make sure it is in the include
+# paths.
+INCLUDE_BUILD_DIR := 1
+
+# This tool has no plugins, optimize startup time.
+TOOL_NO_EXPORTS := 1
+
+# Note that we have to use lazy expansion here.
+BUILDVARIABLES_SRCPATH = $(PROJ_SRC_ROOT)/tools/$(TOOLNAME)/BuildVariables.inc.in
+BUILDVARIABLES_OBJPATH = $(ObjDir)/BuildVariables.inc
+BUILT_SOURCES = $(BUILDVARIABLES_OBJPATH)
+
+include $(LEVEL)/Makefile.common
+
+# Combine preprocessor flags (except for -I) and CXX flags.
+SUB_CPPFLAGS := ${CPP.BaseFlags}
+SUB_CFLAGS := ${CPP.BaseFlags} ${C.Flags}
+SUB_CXXFLAGS := ${CPP.BaseFlags} ${CXX.Flags}
+
+# This is blank for now. We need to be careful about adding stuff here:
+# LDFLAGS tend not to be portable, and we don't currently require the
+# user to use libtool when linking against LLVM.
+SUB_LDFLAGS :=
+
+$(ObjDir)/BuildVariables.inc: $(BUILDVARIABLES_SRCPATH) Makefile $(ObjDir)/.dir
+ $(Echo) "Building llvm-config BuildVariables.inc file."
+ $(Verb) $(ECHO) 's/@LLVM_SRC_ROOT@/$(subst /,\/,$(LLVM_SRC_ROOT))/' \
+ > temp.sed
+ $(Verb) $(ECHO) 's/@LLVM_OBJ_ROOT@/$(subst /,\/,$(LLVM_OBJ_ROOT))/' \
+ >> temp.sed
+ $(Verb) $(ECHO) 's/@LLVM_CPPFLAGS@/$(subst /,\/,$(SUB_CPPFLAGS))/' \
+ >> temp.sed
+ $(Verb) $(ECHO) 's/@LLVM_CFLAGS@/$(subst /,\/,$(SUB_CFLAGS))/' \
+ >> temp.sed
+ $(Verb) $(ECHO) 's/@LLVM_CXXFLAGS@/$(subst /,\/,$(SUB_CXXFLAGS))/' \
+ >> temp.sed
+ $(Verb) $(ECHO) 's/@LLVM_LDFLAGS@/$(subst /,\/,$(SUB_LDFLAGS))/' \
+ >> temp.sed
+ $(Verb) $(ECHO) 's/@LLVM_BUILDMODE@/$(subst /,\/,$(BuildMode))/' \
+ >> temp.sed
+ $(Verb) $(ECHO) 's/@LLVM_SYSTEM_LIBS@/$(subst /,\/,$(LIBS))/' \
+ >> temp.sed
+ $(Verb) $(SED) -f temp.sed < $< > $@
+ $(Verb) $(RM) temp.sed
diff --git a/tools/llvm-config/llvm-config.cpp b/tools/llvm-config-2/llvm-config.cpp
index 30ace56f4c..30ace56f4c 100644
--- a/tools/llvm-config/llvm-config.cpp
+++ b/tools/llvm-config-2/llvm-config.cpp
diff --git a/tools/llvm-config/CMakeLists.txt b/tools/llvm-config/CMakeLists.txt
index ed26ba9555..53f00846b7 100644
--- a/tools/llvm-config/CMakeLists.txt
+++ b/tools/llvm-config/CMakeLists.txt
@@ -1,41 +1,138 @@
-set(LLVM_LINK_COMPONENTS support)
+include(TestBigEndian)
-# We need to generate the BuildVariables.inc file containing values which are
-# only defined when under certain build modes. Unfortunately, that precludes
-# doing this inside CMake so we have to shell out to sed. For now, that means we
-# can't expect to build llvm-config on Window.s
-set(BUILDVARIABLES_SRCPATH ${CMAKE_CURRENT_SOURCE_DIR}/BuildVariables.inc.in)
-set(BUILDVARIABLES_OBJPATH ${CMAKE_CURRENT_BINARY_DIR}/BuildVariables.inc)
-set(SEDSCRIPT_OBJPATH ${CMAKE_CURRENT_BINARY_DIR}/BuildVariables.configure.sed)
+include(FindPerl)
+if( NOT PERL_FOUND )
+ message(FATAL_ERROR "Perl required but not found!")
+endif( NOT PERL_FOUND )
+
+set(PERL ${PERL_EXECUTABLE})
+set(VERSION PACKAGE_VERSION)
+set(PREFIX ${CMAKE_INSTALL_PREFIX})
+set(abs_top_srcdir ${LLVM_MAIN_SRC_DIR})
+set(abs_top_builddir ${LLVM_BINARY_DIR})
+execute_process(COMMAND date
+ OUTPUT_VARIABLE LLVM_CONFIGTIME
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+# LLVM_ON_UNIX and LLVM_ON_WIN32 already set.
+# those are set to blank by `autoconf' on MinGW, so it seems they are not required:
+#set(LLVMGCCDIR "")
+#set(LLVMGCC "")
+#set(LLVMGXX "")
+test_big_endian(IS_BIG_ENDIAN)
+if( IS_BIG_ENDIAN )
+ set(ENDIAN "big")
+else( IS_BIG_ENDIAN )
+ set(ENDIAN "little")
+endif( IS_BIG_ENDIAN )
+set(SHLIBEXT ${LTDL_SHLIB_EXT})
+#EXEEXT already set.
+set(OS "${CMAKE_SYSTEM}")
+set(target "${TARGET_TRIPLE}")
+set(ARCH "${LLVM_NATIVE_ARCH}")
-# Compute the substitution values for various items.
get_system_libs(LLVM_SYSTEM_LIBS_LIST)
foreach(l ${LLVM_SYSTEM_LIBS_LIST})
- set(SYSTEM_LIBS ${SYSTEM_LIBS} "-l${l}")
+ set(LLVM_SYSTEM_LIBS ${LLVM_SYSTEM_LIBS} "-l${l}")
endforeach()
+
+foreach(c ${LLVM_TARGETS_TO_BUILD})
+ set(TARGETS_BUILT "${TARGETS_BUILT} ${c}")
+endforeach(c)
+set(TARGETS_TO_BUILD ${TARGETS_BUILT})
+set(TARGET_HAS_JIT "1") # TODO
+
+# Avoids replacement at config-time:
+set(LLVM_CPPFLAGS "@LLVM_CPPFLAGS@")
+set(LLVM_CFLAGS "@LLVM_CFLAGS@")
+set(LLVM_CXXFLAGS "@LLVM_CXXFLAGS@")
+set(LLVM_LDFLAGS "@LLVM_LDFLAGS@")
+set(LIBS "@LIBS@")
+set(LLVM_BUILDMODE "@LLVM_BUILDMODE@")
+set(LLVM_OBJ_SUFFIX "@LLVM_OBJ_SUFFIX@")
+
+configure_file(
+ ${CMAKE_CURRENT_SOURCE_DIR}/llvm-config.in.in
+ ${CMAKE_CURRENT_BINARY_DIR}/llvm-config.in
+ @ONLY
+)
+
+set(LIBDEPS LibDeps.txt)
+set(LIBDEPS_TMP LibDeps.txt.tmp)
+set(FINAL_LIBDEPS FinalLibDeps.txt)
+set(LLVM_CONFIG ${LLVM_TOOLS_BINARY_DIR}/llvm-config)
+set(LLVM_CONFIG_IN ${CMAKE_CURRENT_BINARY_DIR}/llvm-config.in)
+
+if( CMAKE_CROSSCOMPILING )
+ set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY)
+endif()
+
+find_program(NM_PATH nm PATH_SUFFIXES /bin)
+
+if( NOT NM_PATH )
+ message(FATAL_ERROR "`nm' not found")
+endif()
+
+get_property(llvm_libs GLOBAL PROPERTY LLVM_LIBS)
+
+add_custom_command(OUTPUT ${LIBDEPS_TMP}
+ COMMAND ${PERL_EXECUTABLE} ${LLVM_MAIN_SRC_DIR}/utils/GenLibDeps.pl -flat ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/${CMAKE_CFG_INTDIR} ${NM_PATH} > ${LIBDEPS_TMP}
+ DEPENDS ${llvm_libs}
+ COMMENT "Regenerating ${LIBDEPS_TMP}")
+
+add_custom_command(OUTPUT ${LIBDEPS}
+ COMMAND ${CMAKE_COMMAND} -E copy_if_different ${LIBDEPS_TMP} ${LIBDEPS}
+ DEPENDS ${LIBDEPS_TMP}
+ COMMENT "Updating ${LIBDEPS} if necessary...")
+
+# This must stop the build if find-cycles.pl returns error:
+add_custom_command(OUTPUT ${FINAL_LIBDEPS}
+ COMMAND ${CMAKE_COMMAND} -E remove -f ${FINAL_LIBDEPS} ${FINAL_LIBDEPS}.tmp
+ COMMAND ${PERL_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/find-cycles.pl < ${LIBDEPS} > ${FINAL_LIBDEPS}.tmp
+ COMMAND ${CMAKE_COMMAND} -E copy ${FINAL_LIBDEPS}.tmp ${FINAL_LIBDEPS}
+ DEPENDS ${LIBDEPS}
+ COMMENT "Checking for cyclic dependencies between LLVM libraries.")
+
set(C_FLGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${uppercase_CMAKE_BUILD_TYPE}} ${LLVM_DEFINITIONS}")
set(CXX_FLGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${uppercase_CMAKE_BUILD_TYPE}} ${LLVM_DEFINITIONS}")
set(CPP_FLGS "${CMAKE_CPP_FLAGS} ${CMAKE_CPP_FLAGS_${uppercase_CMAKE_BUILD_TYPE}} ${LLVM_DEFINITIONS}")
-add_custom_command(OUTPUT ${BUILDVARIABLES_OBJPATH}
- COMMAND echo s!@LLVM_SRC_ROOT@!${LLVM_MAIN_SRC_DIR}! > ${SEDSCRIPT_OBJPATH}
- COMMAND echo s!@LLVM_OBJ_ROOT@!${LLVM_BINARY_DIR}! >> ${SEDSCRIPT_OBJPATH}
- COMMAND echo s!@LLVM_CPPFLAGS@!${CPP_FLGS}! >> ${SEDSCRIPT_OBJPATH}
- COMMAND echo s!@LLVM_CFLAGS@!${C_FLGS}! >> ${SEDSCRIPT_OBJPATH}
- COMMAND echo s!@LLVM_CXXFLAGS@!${CXX_FLGS}! >> ${SEDSCRIPT_OBJPATH}
+# We don't want certain flags on the output of
+# llvm-config --cflags --cxxflags
+macro(remove_option_from_llvm_config option)
+ llvm_replace_compiler_option(C_FLGS "${option}" "")
+ llvm_replace_compiler_option(CXX_FLGS "${option}" "")
+ llvm_replace_compiler_option(CPP_FLGS "${option}" "")
+endmacro(remove_option_from_llvm_config)
+remove_option_from_llvm_config("-pedantic")
+remove_option_from_llvm_config("-Wall")
+remove_option_from_llvm_config("-W")
+
+add_custom_command(OUTPUT ${LLVM_CONFIG}
+ COMMAND echo s!@LLVM_CPPFLAGS@!${CPP_FLGS}! > temp.sed
+ COMMAND echo s!@LLVM_CFLAGS@!${C_FLGS}! >> temp.sed
+ COMMAND echo s!@LLVM_CXXFLAGS@!${CXX_FLGS}! >> temp.sed
# TODO: Use general flags for linking! not just for shared libs:
- COMMAND echo s!@LLVM_LDFLAGS@!${CMAKE_SHARED_LINKER_FLAGS}! >> ${SEDSCRIPT_OBJPATH}
- COMMAND echo s!@LLVM_BUILDMODE@!${CMAKE_BUILD_TYPE}! >> ${SEDSCRIPT_OBJPATH}
- COMMAND echo s!@LLVM_SYSTEM_LIBS@!${SYSTEM_LIBS}! >> ${SEDSCRIPT_OBJPATH}
- COMMAND sed -f ${SEDSCRIPT_OBJPATH} < ${BUILDVARIABLES_SRCPATH} > ${BUILDVARIABLES_OBJPATH}
+ COMMAND echo s!@LLVM_LDFLAGS@!${CMAKE_SHARED_LINKER_FLAGS}! >> temp.sed
+ COMMAND echo s!@LIBS@!${LLVM_SYSTEM_LIBS}! >> temp.sed
+ COMMAND echo s!@LLVM_BUILDMODE@!${CMAKE_BUILD_TYPE}! >> temp.sed
+ COMMAND echo s!@LLVM_OBJ_SUFFIX@!! >> temp.sed
+ COMMAND sed -f temp.sed < ${LLVM_CONFIG_IN} > ${LLVM_CONFIG}
+ COMMAND ${CMAKE_COMMAND} -E remove -f temp.sed
+ COMMAND cat ${FINAL_LIBDEPS} >> ${LLVM_CONFIG}
+ COMMAND chmod +x ${LLVM_CONFIG}
VERBATIM
- COMMENT "Building BuildVariables.inc include."
+ DEPENDS ${FINAL_LIBDEPS} ${LLVM_CONFIG_IN}
+ COMMENT "Building llvm-config script."
)
-# Add the llvm-config tool.
-add_llvm_tool(llvm-config
- llvm-config.cpp
- )
+add_custom_target(llvm-config.target ALL
+ DEPENDS ${LLVM_CONFIG})
+
+# Ensure we build llvm-config after we build all of the libraries so that we
+# have their full dependencies.
+add_dependencies(llvm-config.target ${llvm_libs})
-# Add the dependency on the generation step.
-add_file_dependencies(${CMAKE_CURRENT_SOURCE_DIR}/llvm-config.cpp ${BUILDVARIABLES_OBJPATH})
+install(FILES ${LLVM_CONFIG}
+ PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE
+ WORLD_READ WORLD_EXECUTE
+ DESTINATION bin)
diff --git a/tools/llvm-config/Makefile b/tools/llvm-config/Makefile
index a7a2a63f99..184919ea97 100644
--- a/tools/llvm-config/Makefile
+++ b/tools/llvm-config/Makefile
@@ -1,5 +1,5 @@
-##===- tools/llvm-config/Makefile---------------------------*- Makefile -*-===##
-#
+##===- tools/llvm-config/Makefile --------------------------*- Makefile -*-===##
+#
# The LLVM Compiler Infrastructure
#
# This file is distributed under the University of Illinois Open Source
@@ -7,42 +7,57 @@
#
##===----------------------------------------------------------------------===##
-LEVEL := ../..
-TOOLNAME := llvm-config
-USEDLIBS := LLVMSupport.a
-
-# We generate sources in the build directory, make sure it is in the include
-# paths.
-INCLUDE_BUILD_DIR := 1
+LEVEL = ../..
-# This tool has no plugins, optimize startup time.
-TOOL_NO_EXPORTS := 1
-
-# Note that we have to use lazy expansion here.
-BUILDVARIABLES_SRCPATH = $(PROJ_SRC_ROOT)/tools/$(TOOLNAME)/BuildVariables.inc.in
-BUILDVARIABLES_OBJPATH = $(ObjDir)/BuildVariables.inc
-BUILT_SOURCES = $(BUILDVARIABLES_OBJPATH)
+EXTRA_DIST = LibDeps.txt FinalLibDeps.txt llvm-config.in.in find-cycles.pl
include $(LEVEL)/Makefile.common
+# If we don't have Perl, we can't generate the library dependencies upon which
+# llvm-config depends. Therefore, only if we detect perl will we do anything
+# useful.
+ifeq ($(HAVE_PERL),1)
+
# Combine preprocessor flags (except for -I) and CXX flags.
-SUB_CPPFLAGS := ${CPP.BaseFlags}
-SUB_CFLAGS := ${CPP.BaseFlags} ${C.Flags}
-SUB_CXXFLAGS := ${CPP.BaseFlags} ${CXX.Flags}
+SUB_CPPFLAGS = ${CPP.BaseFlags}
+SUB_CFLAGS = ${CPP.BaseFlags} ${C.Flags}
+SUB_CXXFLAGS = ${CPP.BaseFlags} ${CXX.Flags}
# This is blank for now. We need to be careful about adding stuff here:
# LDFLAGS tend not to be portable, and we don't currently require the
# user to use libtool when linking against LLVM.
-SUB_LDFLAGS :=
+SUB_LDFLAGS =
-$(ObjDir)/BuildVariables.inc: $(BUILDVARIABLES_SRCPATH) Makefile $(ObjDir)/.dir
- $(Echo) "Building llvm-config BuildVariables.inc file."
- $(Verb) $(ECHO) 's/@LLVM_SRC_ROOT@/$(subst /,\/,$(LLVM_SRC_ROOT))/' \
- > temp.sed
- $(Verb) $(ECHO) 's/@LLVM_OBJ_ROOT@/$(subst /,\/,$(LLVM_OBJ_ROOT))/' \
- >> temp.sed
+FinalLibDeps = $(PROJ_OBJ_DIR)/FinalLibDeps.txt
+LibDeps = $(PROJ_OBJ_DIR)/LibDeps.txt
+LibDepsTemp = $(PROJ_OBJ_DIR)/LibDeps.txt.tmp
+GenLibDeps = $(PROJ_SRC_ROOT)/utils/GenLibDeps.pl
+
+$(LibDepsTemp): $(GenLibDeps) $(LibDir) $(wildcard $(LibDir)/*.a $(LibDir)/*.o)
+ $(Echo) "Regenerating LibDeps.txt.tmp"
+ $(Verb) $(PERL) $(GenLibDeps) -flat $(LibDir) "$(NM_PATH)" > $(LibDepsTemp)
+
+$(LibDeps): $(LibDepsTemp)
+ $(Verb) $(CMP) -s $@ $< || ( $(CP) $< $@ && \
+ $(EchoCmd) Updated LibDeps.txt because dependencies changed )
+
+# Find all the cyclic dependencies between various LLVM libraries, so we
+# don't have to process them at runtime.
+$(FinalLibDeps): find-cycles.pl $(LibDeps)
+ $(Echo) "Checking for cyclic dependencies between LLVM libraries."
+ $(Verb) $(PERL) $< < $(LibDeps) > $@ || rm -f $@
+
+# Rerun our configure substitutions as needed.
+ConfigInIn = $(PROJ_SRC_DIR)/llvm-config.in.in
+llvm-config.in: $(ConfigInIn) $(ConfigStatusScript)
+ $(Verb) cd $(PROJ_OBJ_ROOT) ; \
+ $(ConfigStatusScript) tools/llvm-config/llvm-config.in
+
+# Build our final script.
+$(ToolDir)/llvm-config: llvm-config.in $(FinalLibDeps)
+ $(Echo) "Building llvm-config script."
$(Verb) $(ECHO) 's/@LLVM_CPPFLAGS@/$(subst /,\/,$(SUB_CPPFLAGS))/' \
- >> temp.sed
+ > temp.sed
$(Verb) $(ECHO) 's/@LLVM_CFLAGS@/$(subst /,\/,$(SUB_CFLAGS))/' \
>> temp.sed
$(Verb) $(ECHO) 's/@LLVM_CXXFLAGS@/$(subst /,\/,$(SUB_CXXFLAGS))/' \
@@ -51,7 +66,28 @@ $(ObjDir)/BuildVariables.inc: $(BUILDVARIABLES_SRCPATH) Makefile $(ObjDir)/.dir
>> temp.sed
$(Verb) $(ECHO) 's/@LLVM_BUILDMODE@/$(subst /,\/,$(BuildMode))/' \
>> temp.sed
- $(Verb) $(ECHO) 's/@LLVM_SYSTEM_LIBS@/$(subst /,\/,$(LIBS))/' \
+ $(Verb) $(ECHO) 's/@LLVM_OBJ_SUFFIX@/$(subst /,\/,/$(BuildMode))/' \
>> temp.sed
$(Verb) $(SED) -f temp.sed < $< > $@
$(Verb) $(RM) temp.sed
+ $(Verb) cat $(FinalLibDeps) >> $@
+ $(Verb) chmod +x $@
+
+else
+# We don't have perl, just generate a dummy llvm-config
+$(ToolDir)/llvm-config:
+ $(Echo) "Building place holder llvm-config script."
+ $(Verb) $(ECHO) 'echo llvm-config: Perl not found so llvm-config could not be generated' >> $@
+ $(Verb) chmod +x $@
+
+endif
+# Hook into the standard Makefile rules.
+all-local:: $(ToolDir)/llvm-config
+clean-local::
+ $(Verb) $(RM) -f $(ToolDir)/llvm-config llvm-config.in $(FinalLibDeps) \
+ $(LibDeps) GenLibDeps.out
+install-local:: all-local
+ $(Echo) Installing llvm-config
+ $(Verb) $(MKDIR) $(DESTDIR)$(PROJ_bindir)
+ $(Verb) $(ScriptInstall) $(ToolDir)/llvm-config $(DESTDIR)$(PROJ_bindir)
+
diff --git a/tools/llvm-config/find-cycles.pl b/tools/llvm-config/find-cycles.pl
new file mode 100755
index 0000000000..5cbf5b4b27
--- /dev/null
+++ b/tools/llvm-config/find-cycles.pl
@@ -0,0 +1,170 @@
+#!/usr/bin/perl
+#
+# Program: find-cycles.pl
+#
+# Synopsis: Given a list of possibly cyclic dependencies, merge all the
+# cycles. This makes it possible to topologically sort the
+# dependencies between different parts of LLVM.
+#
+# Syntax: find-cycles.pl < LibDeps.txt > FinalLibDeps.txt
+#
+# Input: cycmem1: cycmem2 dep1 dep2
+# cycmem2: cycmem1 dep3 dep4
+# boring: dep4
+#
+# Output: cycmem1 cycmem2: dep1 dep2 dep3 dep4
+# boring: dep4
+#
+# This file was written by Eric Kidd, and is placed into the public domain.
+#
+
+use 5.006;
+use strict;
+use warnings;
+
+my %DEPS;
+my @CYCLES;
+sub find_all_cycles;
+
+# Read our dependency information.
+while (<>) {
+ chomp;
+ my ($module, $dependency_str) = /^\s*([^:]+):\s*(.*)\s*$/;
+ die "Malformed data: $_" unless defined $dependency_str;
+ my @dependencies = split(/ /, $dependency_str);
+ $DEPS{$module} = \@dependencies;
+}
+
+# Partition our raw dependencies into sets of cyclically-connected nodes.
+find_all_cycles();
+
+# Print out the finished cycles, with their dependencies.
+my @output;
+my $cycles_found = 0;
+foreach my $cycle (@CYCLES) {
+ my @modules = sort keys %{$cycle};
+
+ # Merge the dependencies of all modules in this cycle.
+ my %dependencies;
+ foreach my $module (@modules) {
+ @dependencies{@{$DEPS{$module}}} = 1;
+ }
+
+ # Prune the known cyclic dependencies.
+ foreach my $module (@modules) {
+ delete $dependencies{$module};
+ }
+
+ # Warn about possible linker problems.
+ my @archives = grep(/\.a$/, @modules);
+ if (@archives > 1) {
+ $cycles_found = $cycles_found + 1;
+ print STDERR "find-cycles.pl: Circular dependency between *.a files:\n";
+ print STDERR "find-cycles.pl: ", join(' ', @archives), "\n";
+ push @modules, @archives; # WORKAROUND: Duplicate *.a files. Ick.
+ } elsif (@modules > 1) {
+ $cycles_found = $cycles_found + 1;
+ print STDERR "find-cycles.pl: Circular dependency between *.o files:\n";
+ print STDERR "find-cycles.pl: ", join(' ', @modules), "\n";
+ push @modules, @modules; # WORKAROUND: Duplicate *.o files. Ick.
+ }
+
+ # Add to our output. (@modules is already as sorted as we need it to be.)
+ push @output, (join(' ', @modules) . ': ' .
+ join(' ', sort keys %dependencies) . "\n");
+}
+print sort @output;
+
+exit $cycles_found;
+
+#==========================================================================
+# Depedency Cycle Support
+#==========================================================================
+# For now, we have cycles in our dependency graph. Ideally, each cycle
+# would be collapsed down to a single *.a file, saving us all this work.
+#
+# To understand this code, you'll need a working knowledge of Perl 5,
+# and possibly some quality time with 'man perlref'.
+
+my %SEEN;
+my %CYCLES;
+sub find_cycles ($@);
+sub found_cycles ($@);
+
+sub find_all_cycles {
+ # Find all multi-item cycles.
+ my @modules = sort keys %DEPS;
+ foreach my $module (@modules) { find_cycles($module); }
+
+ # Build fake one-item "cycles" for the remaining modules, so we can
+ # treat them uniformly.
+ foreach my $module (@modules) {
+ unless (defined $CYCLES{$module}) {
+ my %cycle = ($module, 1);
+ $CYCLES{$module} = \%cycle;
+ }
+ }
+
+ # Find all our unique cycles. We have to do this the hard way because
+ # we apparently can't store hash references as hash keys without making
+ # 'strict refs' sad.
+ my %seen;
+ foreach my $cycle (values %CYCLES) {
+ unless ($seen{$cycle}) {
+ $seen{$cycle} = 1;
+ push @CYCLES, $cycle;
+ }
+ }
+}
+
+# Walk through our graph depth-first (keeping a trail in @path), and report
+# any cycles we find.
+sub find_cycles ($@) {
+ my ($module, @path) = @_;
+ if (str_in_list($module, @path)) {
+ found_cycle($module, @path);
+ } else {
+ return if defined $SEEN{$module};
+ $SEEN{$module} = 1;
+ foreach my $dep (@{$DEPS{$module}}) {
+ find_cycles($dep, @path, $module);
+ }
+ }
+}
+
+# Give a cycle, attempt to merge it with pre-existing cycle data.
+sub found_cycle ($@) {
+ my ($module, @path) = @_;
+
+ # Pop any modules which aren't part of our cycle.
+ while ($path[0] ne $module) { shift @path; }
+ #print join("->", @path, $module) . "\n";
+
+ # Collect the modules in our cycle into a hash.
+ my %cycle;
+ foreach my $item (@path) {
+ $cycle{$item} = 1;
+ if (defined $CYCLES{$item}) {
+ # Looks like we intersect with an existing cycle, so merge
+ # all those in, too.
+ foreach my $old_item (keys %{$CYCLES{$item}}) {
+ $cycle{$old_item} = 1;
+ }
+ }
+ }
+
+ # Update our global cycle table.
+ my $cycle_ref = \%cycle;
+ foreach my $item (keys %cycle) {
+ $CYCLES{$item} = $cycle_ref;
+ }
+ #print join(":", sort keys %cycle) . "\n";
+}
+
+sub str_in_list ($@) {
+ my ($str, @list) = @_;
+ foreach my $item (@list) {
+ return 1 if ($item eq $str);
+ }
+ return 0;
+}
diff --git a/tools/llvm-config/llvm-config.in.in b/tools/llvm-config/llvm-config.in.in
new file mode 100644
index 0000000000..d811e59abb
--- /dev/null
+++ b/tools/llvm-config/llvm-config.in.in
@@ -0,0 +1,466 @@
+#!@PERL@
+##===- tools/llvm-config ---------------------------------------*- perl -*-===##
+#
+# The LLVM Compiler Infrastructure
+#
+# This file is distributed under the University of Illinois Open Source
+# License. See LICENSE.TXT for details.
+#
+##===----------------------------------------------------------------------===##
+#
+# Synopsis: Prints out compiler options needed to build against an installed
+# copy of LLVM.
+#
+# Syntax: llvm-config OPTIONS... [COMPONENTS...]
+#
+##===----------------------------------------------------------------------===##
+
+use 5.006;
+use strict;
+use warnings;
+use Cwd 'abs_path';
+
+#---- begin autoconf values ----
+my $PACKAGE_NAME = q{@PACKAGE_NAME@};
+my $VERSION = q{@PACKAGE_VERSION@};
+my $PREFIX = q{@LLVM_PREFIX@};
+my $LLVM_CONFIGTIME = q{@LLVM_CONFIGTIME@};
+my $LLVM_SRC_ROOT = q{@abs_top_srcdir@};
+my $LLVM_OBJ_ROOT = q{@abs_top_builddir@};
+my $ARCH = lc(q{@ARCH@});
+my $TARGET_TRIPLE = q{@target@};
+my $TARGETS_TO_BUILD = q{@TARGETS_TO_BUILD@};
+my $TARGET_HAS_JIT = q{@TARGET_HAS_JIT@};
+my @TARGETS_BUILT = map { lc($_) } qw{@TARGETS_TO_BUILD@};
+#---- end autoconf values ----
+
+# Must pretend x86_64 architecture is really x86, otherwise the native backend
+# won't get linked in.
+$ARCH = "x86" if $ARCH eq "x86_64";
+
+#---- begin Makefile values ----
+my $CPPFLAGS = q{@LLVM_CPPFLAGS@};
+my $CFLAGS = q{@LLVM_CFLAGS@};
+my $CXXFLAGS = q{@LLVM_CXXFLAGS@};
+my $LDFLAGS = q{@LLVM_LDFLAGS@};
+my $SYSTEM_LIBS = q{@LIBS@};
+my $LLVM_BUILDMODE = q{@LLVM_BUILDMODE@};
+my $LLVM_OBJ_SUFFIX = q{@LLVM_OBJ_SUFFIX@};
+#---- end Makefile values ----
+
+# Figure out where llvm-config is being run from. Primarily, we care if it has
+# been installed, or is running from the build directory, which changes the
+# locations of some files.
+
+# Convert the current executable name into its directory (e.g. ".").
+my ($RUN_DIR) = ($0 =~ /^(.*)\/.*$/);
+
+# Turn the directory into an absolute directory on the file system, also pop up
+# from "bin" into the build or prefix dir.
+my $ABS_RUN_DIR = abs_path("$RUN_DIR/..");
+chomp($ABS_RUN_DIR);
+
+# Compute the absolute object directory build, e.g. "foo/llvm/Debug".
+my $ABS_OBJ_ROOT = "$LLVM_OBJ_ROOT$LLVM_OBJ_SUFFIX";
+$ABS_OBJ_ROOT = abs_path("$ABS_OBJ_ROOT") if (-d $ABS_OBJ_ROOT);
+chomp($ABS_OBJ_ROOT);
+
+my $INCLUDEDIR = "$ABS_RUN_DIR/include";
+my $INCLUDEOPTION = "-I$INCLUDEDIR";
+my $LIBDIR = "$ABS_RUN_DIR/lib";
+my $BINDIR = "$ABS_RUN_DIR/bin";
+if ($ABS_RUN_DIR eq $ABS_OBJ_ROOT) {
+ # If we are running out of the build directory, the include dir is in the
+ # srcdir.
+ $INCLUDEDIR = "$LLVM_SRC_ROOT/include";
+ # We need include files from both the srcdir and objdir.
+ $INCLUDEOPTION = "-I$INCLUDEDIR -I$LLVM_OBJ_ROOT/include"
+} else {
+ # If installed, ignore the prefix the tree was configured with, use the
+ # current prefix.
+ $PREFIX = $ABS_RUN_DIR;
+}
+
+sub usage;
+sub fix_library_names (@);
+sub fix_library_files (@);
+sub expand_dependencies (@);
+sub name_map_entries;
+
+# Parse our command-line arguments.
+usage if @ARGV == 0;
+my @components;
+my $has_opt = 0;
+my $want_libs = 0;
+my $want_libnames = 0;
+my $want_libfiles = 0;
+my $want_components = 0;
+foreach my $arg (@ARGV) {
+ if ($arg =~ /^-/) {
+ if ($arg eq "--version") {
+ $has_opt = 1; print "$VERSION\n";
+ } elsif ($arg eq "--prefix") {
+ $has_opt = 1; print "$PREFIX\n";
+ } elsif ($arg eq "--bindir") {
+ $has_opt = 1; print "$BINDIR\n";
+ } elsif ($arg eq "--includedir") {
+ $has_opt = 1; print "$INCLUDEDIR\n";
+ } elsif ($arg eq "--libdir") {
+ $has_opt = 1; print "$LIBDIR\n";
+ } elsif ($arg eq "--cppflags") {
+ $has_opt = 1; print "$INCLUDEOPTION $CPPFLAGS\n";
+ } elsif ($arg eq "--cflags") {
+ $has_opt = 1; print "$INCLUDEOPTION $CFLAGS\n";
+ } elsif ($arg eq "--cxxflags") {
+ $has_opt = 1; print "$INCLUDEOPTION $CXXFLAGS\n";
+ } elsif ($arg eq "--ldflags") {
+ $has_opt = 1; print "-L$LIBDIR $LDFLAGS $SYSTEM_LIBS\n";
+ } elsif ($arg eq "--libs") {
+ $has_opt = 1; $want_libs = 1;
+ } elsif ($arg eq "--libnames") {
+ $has_opt = 1; $want_libnames = 1;
+ } elsif ($arg eq "--libfiles") {
+ $has_opt = 1; $want_libfiles = 1;
+ } elsif ($arg eq "--components") {
+ $has_opt = 1; print join(' ', name_map_entries), "\n";
+ } elsif ($arg eq "--targets-built") {
+ $has_opt = 1; print join(' ', @TARGETS_BUILT), "\n";
+ } elsif ($arg eq "--host-target") {
+ $has_opt = 1; print "$TARGET_TRIPLE\n";
+ } elsif ($arg eq "--build-mode") {
+ $has_opt = 1; print "$LLVM_BUILDMODE\n";
+ } elsif ($arg eq "--obj-root") {
+ $has_opt = 1; print abs_path("$LLVM_OBJ_ROOT/");
+ } elsif ($arg eq "--src-root") {
+ $has_opt = 1; print abs_path("$LLVM_SRC_ROOT/");
+ } else {
+ usage();
+ }
+ } else {
+ push @components, $arg;
+ }
+}
+
+# If no options were specified, fail.
+usage unless $has_opt;
+
+# If no components were specifie