From 1ad92131abbed3d2992d5996969274a8e1ae9a6b Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Thu, 10 Nov 2011 19:59:35 +0000 Subject: [PATCH] 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 --- CMakeLists.txt | 2 +- Makefile | 6 +- Makefile.rules | 7 +- configure | 2 +- tools/CMakeLists.txt | 11 +- tools/Makefile | 2 +- .../BuildVariables.inc.in | 0 tools/llvm-config-2/CMakeLists.txt | 41 ++ tools/llvm-config-2/Makefile | 57 +++ .../llvm-config.cpp | 0 tools/llvm-config/CMakeLists.txt | 151 +++++- tools/llvm-config/Makefile | 92 ++-- tools/llvm-config/find-cycles.pl | 170 +++++++ tools/llvm-config/llvm-config.in.in | 466 ++++++++++++++++++ 14 files changed, 938 insertions(+), 69 deletions(-) rename tools/{llvm-config => llvm-config-2}/BuildVariables.inc.in (100%) create mode 100644 tools/llvm-config-2/CMakeLists.txt create mode 100644 tools/llvm-config-2/Makefile rename tools/{llvm-config => llvm-config-2}/llvm-config.cpp (100%) create mode 100755 tools/llvm-config/find-cycles.pl create mode 100644 tools/llvm-config/llvm-config.in.in diff --git a/CMakeLists.txt b/CMakeLists.txt index 6dd8169ebcb..5d36f5fc103 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 3590d5c6cf7..dae41cf56aa 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 b2132f11cb2..78d1f97e146 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 46182ff624e..ae6be9d535e 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 46d08a4b173..28b36dcdfd1 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 2da39177815..278546bc162 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 similarity index 100% rename from tools/llvm-config/BuildVariables.inc.in rename to 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 00000000000..3c7169d382e --- /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 00000000000..08e084429db --- /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 similarity index 100% rename from tools/llvm-config/llvm-config.cpp rename to tools/llvm-config-2/llvm-config.cpp diff --git a/tools/llvm-config/CMakeLists.txt b/tools/llvm-config/CMakeLists.txt index ed26ba95553..53f00846b79 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 a7a2a63f99b..184919ea971 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 00000000000..5cbf5b4b277 --- /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 00000000000..d811e59abb5 --- /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 specified, default to 'all'. +if (@components == 0) { + push @components, 'all'; +} + +# Force component names to lower case. +@components = map lc, @components; + +# Handle any arguments which require building our dependency graph. +if ($want_libs || $want_libnames || $want_libfiles) { + my @libs = expand_dependencies(@components); + print join(' ', fix_library_names(@libs)), "\n" if ($want_libs); + print join(' ', @libs), "\n" if ($want_libnames); + print join(' ', fix_library_files(@libs)), "\n" if ($want_libfiles); +} + +exit 0; + +#========================================================================== +# Support Routines +#========================================================================== + +sub usage { + print STDERR <<__EOD__; +Usage: llvm-config