llvm-config-2: Implement build system support for getting the variables we only
authorDaniel Dunbar <daniel@zuster.org>
Thu, 3 Nov 2011 21:01:36 +0000 (21:01 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Thu, 3 Nov 2011 21:01:36 +0000 (21:01 +0000)
know at build time.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@143649 91177308-0d34-0410-b5e6-96231b3b80d8

tools/CMakeLists.txt
tools/llvm-config-2/BuildVariables.inc.in [new file with mode: 0644]
tools/llvm-config-2/CMakeLists.txt
tools/llvm-config-2/Makefile
tools/llvm-config-2/llvm-config.cpp

index 4269ae842be8e279eff98e003c11c324d6c8c9b5..28b36dcdfd1aba53d232b8dad151f1effe77c2be 100644 (file)
@@ -17,9 +17,12 @@ if( NOT WIN32 OR MSYS OR CYGWIN )
   # 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(llvm-config-2)
 add_subdirectory(opt)
 add_subdirectory(llvm-as)
 add_subdirectory(llvm-dis)
diff --git a/tools/llvm-config-2/BuildVariables.inc.in b/tools/llvm-config-2/BuildVariables.inc.in
new file mode 100644 (file)
index 0000000..5969772
--- /dev/null
@@ -0,0 +1,26 @@
+//===-- BuildVariables.inc.in - llvm-config build variables -*- C++ -*-----===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file is configured by the build system to define the variables
+// llvm-config wants to report to the user, but which can only be determined at
+// build time.
+//
+// The non .in variant of this file has been autogenerated by the LLVM build. Do
+// not edit!
+//
+//===----------------------------------------------------------------------===//
+
+#define LLVM_SRC_ROOT "@LLVM_SRC_ROOT@"
+#define LLVM_OBJ_ROOT "@LLVM_OBJ_ROOT@"
+#define LLVM_CPPFLAGS "@LLVM_CPPFLAGS@"
+#define LLVM_CFLAGS "@LLVM_CFLAGS@"
+#define LLVM_LDFLAGS "@LLVM_LDFLAGS@"
+#define LLVM_CXXFLAGS "@LLVM_CXXFLAGS@"
+#define LLVM_BUILDMODE "@LLVM_BUILDMODE@"
+#define LLVM_SYSTEM_LIBS "@LLVM_SYSTEM_LIBS@"
index a1e083df08a2be940b38bea386a7eeda86fa1c68..3c7169d382ef75b8bc54712f5fe00eeebee147cf 100644 (file)
@@ -1,5 +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})
index e0036a406226268109d494b4cffeb195b1a62769..b7233e5c5d055947d8183df96d4c55452a389bb5 100644 (file)
@@ -11,7 +11,47 @@ LEVEL := ../..
 TOOLNAME := llvm-config-2
 LINK_COMPONENTS := support
 
+# 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
index 0d726d258de48feeba34f88093018a35c64243cb..597b80fb4fb8abc6c09375f798125a8abf1d88bc 100644 (file)
 
 using namespace llvm;
 
-// FIXME: Need to get various bits of build time information.
-const char LLVM_SRC_ROOT[] = "FIXME";
-const char LLVM_OBJ_ROOT[] = "FIXME";
-const char LLVM_CPPFLAGS[] = "FIXME";
-const char LLVM_CFLAGS[] = "FIXME";
-const char LLVM_LDFLAGS[] = "FIXME";
-const char LLVM_CXXFLAGS[] = "FIXME";
-const char LLVM_BUILDMODE[] = "FIXME";
-const char LLVM_SYSTEM_LIBS[] = "FIXME";
+// Include the build time variables we can report to the user. This is generated
+// at build time from the BuildVariables.inc.in file by the build system.
+#include "BuildVariables.inc"
 
 // Include the component table. This creates an array of struct
 // AvailableComponent entries, which record the component name, library name,