Fix argdumper build in cmake (OS X) after r228636

Previos version of this patch (see r229148) contained two errors:
* make_symlink_darwin_debug passes 2 arguments into make_symlink, but it required 4 arguments (was fixed by r229159)
* make_symlink doesn't work on OS X

As a quick fix, the r229148 and the r229159 were reverted. Now these errors are fixed.

Summary:
This patch fixes the following tests on OS X:

```
  FAIL: test_with_dsym (TestLaunchWithGlob.LaunchWithGlobTestCase)
  ----------------------------------------------------------------------
  Traceback (most recent call last):
    File "/Users/testuser/build/workspace/LLDB_master_release_OSX/llvm_master/tools/lldb/test/lldbtest.py", line 456, in wrapper
      return func(self, *args, **kwargs)
    File "/Users/testuser/build/workspace/LLDB_master_release_OSX/llvm_master/tools/lldb/test/functionalities/launch_with_glob/TestLaunchWithGlob.py", line 21, in test_with_dsym
      self.do_test ()
    File "/Users/testuser/build/workspace/LLDB_master_release_OSX/llvm_master/tools/lldb/test/functionalities/launch_with_glob/TestLaunchWithGlob.py", line 42, in do_test
      self.runCmd("process launch -G true -w %s -- fi*.tx?" % (os.getcwd()))
    File "/Users/testuser/build/workspace/LLDB_master_release_OSX/llvm_master/tools/lldb/test/lldbtest.py", line 1953, in runCmd
      msg if msg else CMD_MSG(cmd))
  AssertionError: False is not True : Command 'process launch -G true -w /Users/testuser/build/workspace/LLDB_master_release_OSX/llvm_master/tools/lldb/test/functionalities/launch_with_glob -- fi*.tx?' returns successfully
  Config=x86_64-clang
  ======================================================================
  FAIL: test_with_dwarf (TestLaunchWithGlob.LaunchWithGlobTestCase)
  ----------------------------------------------------------------------
  Traceback (most recent call last):
    File "/Users/testuser/build/workspace/LLDB_master_release_OSX/llvm_master/tools/lldb/test/lldbtest.py", line 473, in wrapper
      return func(self, *args, **kwargs)
    File "/Users/testuser/build/workspace/LLDB_master_release_OSX/llvm_master/tools/lldb/test/functionalities/launch_with_glob/TestLaunchWithGlob.py", line 28, in test_with_dwarf
      self.do_test ()
    File "/Users/testuser/build/workspace/LLDB_master_release_OSX/llvm_master/tools/lldb/test/functionalities/launch_with_glob/TestLaunchWithGlob.py", line 42, in do_test
      self.runCmd("process launch -G true -w %s -- fi*.tx?" % (os.getcwd()))
    File "/Users/testuser/build/workspace/LLDB_master_release_OSX/llvm_master/tools/lldb/test/lldbtest.py", line 1953, in runCmd
      msg if msg else CMD_MSG(cmd))
  AssertionError: False is not True : Command 'process launch -G true -w /Users/testuser/build/workspace/LLDB_master_release_OSX/llvm_master/tools/lldb/test/functionalities/launch_with_glob -- fi*.tx?' returns successfully
```

Reviewers: epertoso, emaste, abidh, clayborg, zturner

Reviewed By: clayborg

Subscribers: abidh, lldb-commits, emaste, epertoso, zturner, clayborg

Differential Revision: http://reviews.llvm.org/D7550

llvm-svn: 229517
This commit is contained in:
Ilia K 2015-02-17 18:25:27 +00:00
parent 51f96eeb24
commit bb0d5aba8e
5 changed files with 224 additions and 133 deletions

View File

@ -167,6 +167,7 @@ else
fi
fi
# Make symlink for darwin-debug on Darwin
if [ ${OS_NAME} = "Darwin" ] && [ $MakefileCalled -ne 0 ]
then
# We are being built by CMake on Darwin
@ -187,6 +188,27 @@ then
fi
fi
# Make symlink for argdumper on any platform
if [ $MakefileCalled -ne 0 ]
then
# We are being built by CMake
if [ ! -L "${framework_python_dir}/argdumper" ]
then
if [ $Debug -eq 1 ]
then
echo "Creating symlink for argdumper"
fi
cd "${framework_python_dir}"
ln -s "../../../../bin/argdumper" argdumper
else
if [ $Debug -eq 1 ]
then
echo "${framework_python_dir}/argdumper already exists."
fi
fi
fi
create_python_package () {
package_dir="${framework_python_dir}$1"
package_files="$2"

View File

@ -70,8 +70,8 @@ strMsgPyFileLocatedHere = "Python file will be put in '%s'";
strMsgFrameWkPyExists = "Python output folder '%s' already exists";
strMsgFrameWkPyMkDir = "Python output folder '%s' will be created";
strErrMsgCreateFrmWkPyDirFailed = "Unable to create directory '%s' error: %s";
strMsglldbsoExists = "Symlink '%s' already exists";
strMsglldbsoMk = "Creating symlink for _lldb.so (%s -> %s)";
strMsgSymlinkExists = "Symlink for '%s' already exists";
strMsgSymlinkMk = "Creating symlink for %s (%s -> %s)";
strErrMsgCpLldbpy = "copying lldb to lldb package directory";
strErrMsgCreatePyPkgMissingSlash = "Parameter 3 fn create_py_pkg() missing slash";
strErrMsgMkLinkExecute = "Command mklink failed: %s";
@ -218,120 +218,169 @@ def copy_lldbpy_file_to_lldb_pkg_dir( vDictArgs, vstrFrameworkPythonDir, vstrCfg
strMsg = strErrMsgUnexpected % sys.exec_info()[ 0 ];
return (bOk, strMsg);
#++---------------------------------------------------------------------------
# Details: Make the symbolic that the script bridge for Python will need in
# the Python framework directory. Code for specific to Windows.
# Args: vDictArgs - (R) Program input parameters.
# vstrFrameworkPythonDir - (R) Python framework directory.
# vstrDllName - (R) File name for _lldb.dll.
# Details: Make the symbolic link on a Windows platform.
# Args: vstrSrcFile - (R) Source file name.
# vstrTargetFile - (R) Destination file name.
# Returns: Bool - True = function success, False = failure.
# Str - Error description on task failure.
# Throws: None.
#--
def make_symlink_windows( vDictArgs, vstrFrameworkPythonDir, vstrDllName ):
def make_symlink_windows( vstrSrcPath, vstrTargetPath ):
print "Making symlink from %s to %s" % (vstrSrcPath, vstrTargetPath);
dbg = utilsDebug.CDebugFnVerbose( "Python script make_symlink_windows()" );
bOk = True;
strMsg = "";
strErrMsg = "";
bDbg = vDictArgs.has_key( "-d" );
strTarget = vstrDllName;
# When importing an extension module using a debug version of python, you
# write, for example, "import foo", but the interpreter searches for
# "foo_d.pyd"
if vDictArgs["--buildConfig"].lower() == "debug":
strTarget += "_d";
strTarget += ".pyd";
strDLLPath = "%s\\%s" % (vstrFrameworkPythonDir, strTarget);
strTarget = os.path.normcase( strDLLPath );
strSrc = "";
os.chdir( vstrFrameworkPythonDir );
bMakeFileCalled = vDictArgs.has_key( "-m" );
if not bMakeFileCalled:
strSrc = os.path.normcase( "../../../LLDB" );
else:
strLibFileExtn = ".dll";
strSrc = os.path.normcase( "../../../bin/liblldb%s" % strLibFileExtn );
if os.path.isfile( strTarget ):
if bDbg:
print strMsglldbsoExists % strTarget;
return (bOk, strMsg);
if bDbg:
print strMsglldbsoMk % (os.path.abspath(strSrc), os.path.abspath(strTarget));
try:
csl = ctypes.windll.kernel32.CreateHardLinkW
csl.argtypes = (ctypes.c_wchar_p, ctypes.c_wchar_p, ctypes.c_uint32)
csl.restype = ctypes.c_ubyte
if csl(strTarget, strSrc, 0) == 0:
if csl(vstrTargetPath, vstrSrcPath, 0) == 0:
raise ctypes.WinError()
except Exception as e:
bOk = False;
strMsg = "WinError( %d ): %s %s" % (e.errno, e.strerror, strErrMsgMakeSymlink);
strMsg += " Src:'%s' Target:'%s'" % (strSrc, strTarget);
if e.errno != 17:
bOk = False;
strErrMsg = "WinError( %d ): %s %s" % (e.errno, e.strerror, strErrMsgMakeSymlink);
strErrMsg += " Src:'%s' Target:'%s'" % (vstrSrcPath, vstrTargetPath);
return (bOk, strErrMsg);
return (bOk, strMsg);
#++---------------------------------------------------------------------------
# Details: Make the symbolic link that the script bridge for Python will need in
# the Python framework directory. Code for all platforms apart from
# Windows.
# Args: vDictArgs - (R) Program input parameters.
# vstrFrameworkPythonDir - (R) Python framework directory.
# vstrSoName - (R) File name for _lldb.so.
# Details: Make the symbolic link on a UNIX style platform.
# Args: vstrSrcFile - (R) Source file name.
# vstrTargetFile - (R) Destination file name.
# Returns: Bool - True = function success, False = failure.
# Str - Error description on task failure.
# Throws: None.
#--
def make_symlink_other_platforms( vDictArgs, vstrFrameworkPythonDir, vstrSoPath ):
def make_symlink_other_platforms( vstrSrcPath, vstrTargetPath ):
dbg = utilsDebug.CDebugFnVerbose( "Python script make_symlink_other_platforms()" );
bOk = True;
strMsg = "";
bDbg = vDictArgs.has_key( "-d" );
strTarget = vstrSoPath + ".so";
strSoPath = "%s/%s" % (vstrFrameworkPythonDir, strTarget);
strTarget = os.path.normcase( strSoPath );
strSrc = "";
os.chdir( vstrFrameworkPythonDir );
bMakeFileCalled = vDictArgs.has_key( "-m" );
if not bMakeFileCalled:
strSrc = os.path.normcase( "../../../LLDB" );
else:
strLibFileExtn = "";
eOSType = utilsOsType.determine_os_type();
if eOSType == utilsOsType.EnumOsType.Linux:
strLibFileExtn = ".so";
elif eOSType == utilsOsType.EnumOsType.Darwin:
strLibFileExtn = ".dylib";
strSrc = os.path.normcase( "../../../liblldb%s" % strLibFileExtn );
strErrMsg = "";
if os.path.islink( strTarget ):
if bDbg:
print strMsglldbsoExists % strTarget;
return (bOk, strMsg);
if bDbg:
print strMsglldbsoMk;
try:
os.symlink( strSrc, strTarget );
os.symlink( vstrSrcPath, vstrTargetPath );
except OSError as e:
bOk = False;
strMsg = "OSError( %d ): %s %s" % (e.errno, e.strerror, strErrMsgMakeSymlink);
strMsg += " Src:'%s' Target:'%s'" % (strSrc, strTarget);
strErrMsg = "OSError( %d ): %s %s" % (e.errno, e.strerror, strErrMsgMakeSymlink);
strErrMsg += " Src:'%s' Target:'%s'" % (vstrSrcPath, vstrTargetPath);
except:
bOk = False;
strMsg = strErrMsgUnexpected % sys.exec_info()[ 0 ];
return (bOk, strMsg);
strErrMsg = strErrMsgUnexpected % sys.exec_info()[ 0 ];
return (bOk, strErrMsg);
#++---------------------------------------------------------------------------
# Details: Make the symbolic link to the darwin-debug. Code for all platforms
# apart from Windows.
# Details: Make the symbolic link.
# Args: vDictArgs - (R) Program input parameters.
# vstrFrameworkPythonDir - (R) Python framework directory.
# vstrSrcFile - (R) Source file name.
# vstrTargetFile - (R) Destination file name.
# Returns: Bool - True = function success, False = failure.
# Str - Error description on task failure.
# Throws: None.
#--
def make_symlink( vDictArgs, vstrFrameworkPythonDir, vstrSrcFile, vstrTargetFile ):
dbg = utilsDebug.CDebugFnVerbose( "Python script make_symlink()" );
bOk = True;
strErrMsg = "";
bDbg = vDictArgs.has_key( "-d" );
strTarget = "%s/%s" % (vstrFrameworkPythonDir, vstrTargetFile);
strTarget = os.path.normcase( strTarget );
strSrc = "";
os.chdir( vstrFrameworkPythonDir );
bMakeFileCalled = vDictArgs.has_key( "-m" );
eOSType = utilsOsType.determine_os_type();
if not bMakeFileCalled:
return (bOk, strErrMsg);
else:
# Resolve vstrSrcFile path relatively the build directory
stdBuildDir = "";
if eOSType == utilsOsType.EnumOsType.Windows:
# On a Windows platform the vstrFrameworkPythonDir looks like:
# llvm\\build\\Lib\\site-packages\\lldb
strBuildDir = "../../..";
else:
# On a UNIX style platform the vstrFrameworkPythonDir looks like:
# llvm/build/lib/python2.7/site-packages/lldb
strBuildDir = "../../../..";
strSrc = os.path.normcase( "%s/%s" % (strBuildDir, vstrSrcFile) );
if eOSType == utilsOsType.EnumOsType.Unknown:
bOk = False;
strErrMsg = strErrMsgOsTypeUnknown;
elif eOSType == utilsOsType.EnumOsType.Windows:
if os.path.isfile( strTarget ):
if bDbg:
print strMsgSymlinkExists % vstrTargetFile;
if bDbg:
print strMsgSymlinkMk % (vstrTargetFile, strSrc, strTarget);
bOk, strErrMsg = make_symlink_windows( strSrc,
strTarget );
else:
if os.path.islink( strTarget ):
if bDbg:
print strMsgSymlinkExists % vstrTargetFile;
if bDbg:
print strMsgSymlinkMk % (vstrTargetFile, strSrc, strTarget);
return (bOk, strErrMsg);
bOk, strErrMsg = make_symlink_other_platforms( strSrc,
strTarget );
return (bOk, strErrMsg);
#++---------------------------------------------------------------------------
# Details: Make the symbolic that the script bridge for Python will need in
# the Python framework directory.
# Args: vDictArgs - (R) Program input parameters.
# vstrFrameworkPythonDir - (R) Python framework directory.
# vstrLiblldbName - (R) File name for _lldb library.
# Returns: Bool - True = function success, False = failure.
# Str - Error description on task failure.
# Throws: None.
#--
def make_symlink_liblldb( vDictArgs, vstrFrameworkPythonDir, vstrLiblldbFileName ):
dbg = utilsDebug.CDebugFnVerbose( "Python script make_symlink_liblldb()" );
bOk = True;
strErrMsg = "";
strTarget = vstrLiblldbFileName;
strSrc = "";
eOSType = utilsOsType.determine_os_type();
if eOSType == utilsOsType.EnumOsType.Windows:
# When importing an extension module using a debug version of python, you
# write, for example, "import foo", but the interpreter searches for
# "foo_d.pyd"
if vDictArgs["--buildConfig"].lower() == "debug":
strTarget += "_d";
strTarget += ".pyd";
else:
strTarget += ".so";
bMakeFileCalled = vDictArgs.has_key( "-m" );
if not bMakeFileCalled:
strSrc = "lib/LLDB";
else:
strLibFileExtn = "";
if eOSType == utilsOsType.EnumOsType.Windows:
strLibFileExtn = ".dll";
strSrc = "bin/liblldb%s" % strLibFileExtn;
else:
if eOSType == utilsOsType.EnumOsType.Linux:
strLibFileExtn = ".so";
elif eOSType == utilsOsType.EnumOsType.Darwin:
strLibFileExtn = ".dylib";
strSrc = "lib/liblldb%s" % strLibFileExtn;
bOk, strErrMsg = make_symlink( vDictArgs, vstrFrameworkPythonDir, strSrc, strTarget );
return (bOk, strErrMsg);
#++---------------------------------------------------------------------------
# Details: Make the symbolic link to the darwin-debug.
# Args: vDictArgs - (R) Program input parameters.
# vstrFrameworkPythonDir - (R) Python framework directory.
# vstrDarwinDebugFileName - (R) File name for darwin-debug.
@ -340,41 +389,54 @@ def make_symlink_other_platforms( vDictArgs, vstrFrameworkPythonDir, vstrSoPath
# Throws: None.
#--
def make_symlink_darwin_debug( vDictArgs, vstrFrameworkPythonDir, vstrDarwinDebugFileName ):
dbg = utilsDebug.CDebugFnVerbose( "Python script make_symlink_other_platforms()" );
dbg = utilsDebug.CDebugFnVerbose( "Python script make_symlink_darwin_debug()" );
bOk = True;
strMsg = "";
bDbg = vDictArgs.has_key( "-d" );
strTarget = vstrDarwinDebugFileName
strDarwinDebugPath = "%s/%s" % (vstrFrameworkPythonDir, strTarget);
strTarget = os.path.normcase( strDarwinDebugPath );
strErrMsg = "";
strTarget = vstrDarwinDebugFileName;
strSrc = "";
os.chdir( vstrFrameworkPythonDir );
bMakeFileCalled = vDictArgs.has_key( "-m" );
if not bMakeFileCalled:
return (bOk, strMsg);
return (bOk, strErrMsg);
else:
strSrc = os.path.normcase( "../../../../bin/lldb-launcher" );
strSrc = "bin/lldb-launcher";
if os.path.islink( strTarget ):
if bDbg:
print strMsglldbsoExists % strTarget;
return (bOk, strMsg);
if bDbg:
print strMsglldbsoMk;
try:
os.symlink( strSrc, strTarget );
except OSError as e:
bOk = False;
strMsg = "OSError( %d ): %s %s" % (e.errno, e.strerror, strErrMsgMakeSymlink);
strMsg += " Src:'%s' Target:'%s'" % (strSrc, strTarget);
except:
bOk = False;
strMsg = strErrMsgUnexpected % sys.exec_info()[ 0 ];
return (bOk, strMsg);
bOk, strErrMsg = make_symlink( vDictArgs, vstrFrameworkPythonDir, strSrc, strTarget );
return (bOk, strErrMsg);
#++---------------------------------------------------------------------------
# Details: Make the symbolic link to the argdumper.
# Args: vDictArgs - (R) Program input parameters.
# vstrFrameworkPythonDir - (R) Python framework directory.
# vstrArgdumperFileName - (R) File name for argdumper.
# Returns: Bool - True = function success, False = failure.
# Str - Error description on task failure.
# Throws: None.
#--
def make_symlink_argdumper( vDictArgs, vstrFrameworkPythonDir, vstrArgdumperFileName ):
dbg = utilsDebug.CDebugFnVerbose( "Python script make_symlink_argdumper()" );
bOk = True;
strErrMsg = "";
strTarget = vstrArgdumperFileName;
strSrc = "";
eOSType = utilsOsType.determine_os_type();
if eOSType == utilsOsType.EnumOsType.Windows:
strTarget += ".exe";
bMakeFileCalled = vDictArgs.has_key( "-m" );
if not bMakeFileCalled:
return (bOk, strErrMsg);
else:
strExeFileExtn = "";
if eOSType == utilsOsType.EnumOsType.Windows:
strExeFileExtn = ".exe";
strSrc = "bin/argdumper%s" % strExeFileExtn;
bOk, strErrMsg = make_symlink( vDictArgs, vstrFrameworkPythonDir, strSrc, strTarget );
return (bOk, strErrMsg);
#++---------------------------------------------------------------------------
# Details: Make the symlink that the script bridge for Python will need in
@ -385,34 +447,33 @@ def make_symlink_darwin_debug( vDictArgs, vstrFrameworkPythonDir, vstrDarwinDebu
# strErrMsg - Error description on task failure.
# Throws: None.
#--
def make_symlink( vDictArgs, vstrFrameworkPythonDir ):
dbg = utilsDebug.CDebugFnVerbose( "Python script make_symlink()" );
def create_symlinks( vDictArgs, vstrFrameworkPythonDir ):
dbg = utilsDebug.CDebugFnVerbose( "Python script create_symlinks()" );
bOk = True;
strWkDir = "";
strErrMsg = "";
eOSType = utilsOsType.determine_os_type();
# Make symlink for _lldb
strSoFileName = "_lldb";
if eOSType == utilsOsType.EnumOsType.Unknown:
bOk = False;
strErrMsg = strErrMsgOsTypeUnknown;
elif eOSType == utilsOsType.EnumOsType.Windows:
bOk, strErrMsg = make_symlink_windows( vDictArgs,
# Make symlink for _lldb
strLibLldbFileName = "_lldb";
if bOk:
bOk, strErrMsg = make_symlink_liblldb( vDictArgs,
vstrFrameworkPythonDir,
strSoFileName );
else:
bOk, strErrMsg = make_symlink_other_platforms( vDictArgs,
vstrFrameworkPythonDir,
strSoFileName );
strLibLldbFileName );
# Make symlink for darwin-debug
# Make symlink for darwin-debug on Darwin
strDarwinDebugFileName = "darwin-debug"
if bOk and eOSType == utilsOsType.EnumOsType.Darwin:
bOk, strErrMsg = make_symlink_darwin_debug( vDictArgs,
vstrFrameworkPythonDir,
strDarwinDebugFileName );
# Make symlink for argdumper
strArgdumperFileName = "argdumper"
if bOk:
bOk, strErrMsg = make_symlink_argdumper( vDictArgs,
vstrFrameworkPythonDir,
strArgdumperFileName );
return (bOk, strErrMsg);
#++---------------------------------------------------------------------------
@ -631,7 +692,7 @@ def main( vDictArgs ):
bOk, strMsg = find_or_create_python_dir( vDictArgs, strFrameworkPythonDir );
if bOk:
bOk, strMsg = make_symlink( vDictArgs, strFrameworkPythonDir );
bOk, strMsg = create_symlinks( vDictArgs, strFrameworkPythonDir );
if bOk:
bOk, strMsg = copy_lldbpy_file_to_lldb_pkg_dir( vDictArgs,

View File

@ -21,7 +21,6 @@ class LaunchWithGlobTestCase(TestBase):
self.do_test ()
@unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
@dwarf_test
def test_with_dwarf (self):
self.buildDwarf()

View File

@ -2,6 +2,7 @@ if (CMAKE_SYSTEM_NAME MATCHES "Darwin")
add_subdirectory(darwin-debug)
add_subdirectory(debugserver)
endif()
add_subdirectory(argdumper)
add_subdirectory(driver)
if (NOT __ANDROID_NDK__)
add_subdirectory(lldb-mi)

View File

@ -0,0 +1,8 @@
add_lldb_executable(argdumper
argdumper.cpp
)
target_link_libraries(argdumper liblldb)
install(TARGETS argdumper
RUNTIME DESTINATION bin)