Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

tao_idl treats -g path as a folder #2058

Open
alexchandel opened this issue Mar 1, 2023 · 5 comments
Open

tao_idl treats -g path as a folder #2058

alexchandel opened this issue Mar 1, 2023 · 5 comments

Comments

@alexchandel
Copy link

alexchandel commented Mar 1, 2023

Version

ACE 7.0.11 (with CMake additions)

Host machine and operating system

Win11

Compiler name and version (including patch level)

VS2019 / MSVC

The $ACE_ROOT/ace/config.h file

#include "ace/config-windows.h"

The $ACE_ROOT/include/makeinclude/platform_macros.GNU file

None. Building with CMake / MSBuild.

Contents of $ACE_ROOT/bin/MakeProjectCreator/config/default.features

Unchanged.

AREA/CLASS/EXAMPLE AFFECTED:

Invoking tao_idl to process IDL files.

The problem effects:

ACE/TAO and my application's IDL files.

Synopsis

When tao_idl.exe and ace_gperf.exe are successfully built out-of-source (which is required for multi-target/config support), and tao_idl is invoked with -g path/to/gperf, tao_idl merely reports that GPERF could not be executed and falls back to dynamic hashing (even if I've ordered it not to fall back using -H perfect_hash.

Description

Both `tao_idl.exe -h` and `ace_gperf.exe -h` successfully execute when invoked from the IDL file's directory. There are no DLL issues.
C:\Users\Dev\Git\test\Test_Interface>C:/Users/Dev/Git/test/build/opt/ACE_wrappers/TAO/src/Debug/ace_gperf.exe -h
Usage: C:/Users/Dev/Git/test/build/opt/ACE_wrappers/TAO/src/Debug/ace_gperf.exe [-abBcCdDef[num]gGhH<hashname>i<init>IjJk<keys>K<keyname>lL<language>mMnN<function name>oOprs<size>S<switches>tTvVZ<class name>].
(type C:/Users/Dev/Git/test/build/opt/ACE_wrappers/TAO/src/Debug/ace_gperf.exe -h for help)
-a      Generate ANSI standard C output code, i.e., function prototypes.
-b      Generate code for Linear Search.
-B      Generate code for Binary Search.
-c      Generate comparison code using strncmp rather than strcmp.
-C      Make the contents of generated lookup tables constant, i.e., readonly.
-d      Enables the debugging option (produces verbose output to the standard
        error).
-D      Handle keywords that hash to duplicate values.  This is useful
        for certain highly redundant keyword sets.
-e      Allow user to provide a string containing delimiters used to separate
        keywords from their attributes.  Default is ",\n"
-E      Define constant values using an enum local to the lookup function
        rather than with defines
-f      Generate the gen-perf.hash function ``fast.''  This decreases GPERF's
        running time at the cost of minimizing generated table-size.
        The numeric argument represents the number of times to iterate when
        resolving a collision.  `0' means ``iterate by the number of keywords.''
-F      Provided expression will be used to assign default values in keyword
        table, i.e., the fill value.  Default is "".
-g      Make generated routines use ``inline'' to remove function overhead.
-G      Generate the static table of keywords as a static global variable,
        rather than hiding it inside of the lookup function (which is the
        default behavior).
-h      Prints this message.
-H      Allow user to specify name of generated hash function. Default
        is `hash'.
-i      Provide an initial value for the associate values array.  Default is 0.
-I      Generate comparison code using case insensitive string comparison, e.g.,
        strncasecmp or strcasecmp.
        Setting this value larger helps inflate the size of the final table.
-j      Affects the ``jump value,'' i.e., how far to advance the associated
        character value upon collisions.  Must be an odd number, default is 5.
-J      Skips '#include "ace/OS_NS_string.h"' part in the output.
-k      Allows selection of the key positions used in the hash function.
        The allowable choices range between 1-126, inclusive.  The positions
        are separated by commas, ranges may be used, and key positions may
        occur in any order.  Also, the meta-character '*' causes the generated
        hash function to consider ALL key positions, and $ indicates the
        ``final character'' of a key, e.g., $,1,2,4,6-10.
-K      Allow use to select name of the keyword component in the keyword
        structure.
-l      Compare key lengths before trying a string comparison.  This helps
        cut down on the number of string comparisons made during the lookup.
-L      Generates code in the language specified by the option's argument.
        Languages handled are currently C++ and C.  The default is C.
-m      Avoids the warning about identical hash values. This is valid
        only if the -D option is enabled.
-M      Skips class definition in the output. This is valid only in C++ mode.
-n      Do not include the length of the keyword when computing the hash
        function.
-N      Allow user to specify name of generated lookup function.  Default
        name is `in_word_set.'
-o      Reorders input keys by frequency of occurrence of the key sets.
        This should decrease the search time dramatically.
-O      Optimize the generated lookup function by assuming that all input
        keywords are members of the keyset from the keyfile.
-p      Changes the return value of the generated function ``in_word_set''
        from its default boolean value (i.e., 0 or 1), to type ``pointer
        to wordlist array''  This is most useful when the -t option, allowing
        user-defined structs, is used.
-r      Utilizes randomness to initialize the associated values table.
-s      Affects the size of the generated hash table.  The numeric argument
        for this option indicates ``how many times larger or smaller'' the
        associated value range should be, in relationship to the number of
        keys, e.g. a value of 3 means ``allow the maximum associated value
        to be about 3 times larger than the number of input keys.''
        Conversely, a value of -3 means ``make the maximum associated
        value about 3 times smaller than the number of input keys. A
        larger table should decrease the time required for an unsuccessful
        search, at the expense of extra table space.  Default value is 1.
-S      Causes the generated C code to use a switch statement scheme, rather
        than an array lookup table.  This can lead to a reduction in both
        time and space requirements for some keyfiles.  The argument to
        this option determines how many switch statements are generated.
        A value of 1 generates 1 switch containing all the elements, a value
        of 2 generates 2 tables with 1/2 the elements in each table, etc.
        This is useful since many C compilers cannot correctly generate code
        for large switch statements.
-t      Allows the user to include a structured type declaration for
        generated code. Any text before %% is consider part of the type
        declaration.  Key words and additional fields may follow this, one
        group of fields per line.
-T      Prevents the transfer of the type declaration to the output file.
        Use this option if the type is already defined elsewhere.
-v      Prints out the current version number and exits with a value of 0
-V      Exits silently with a value of 0.
-Z      Allow user to specify name of generated C++ class.  Default
        name is `Perfect_Hash.'

However TAO_IDL prints no information on why it thinks GPERF could not be executed, and its documentation does not mention any diagnostic options.

C:\Users\Dev\Git\test\Test_Interface>"C:\Program Files\CMake\bin\cmake.exe" -E env TAO_ROOT=C:/Users/Dev/Git/test/opt/ACE_wrappers/TAO "PATH=C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.29.30133\bin\Hostx64\x64;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files\Git\cmd;C:\Program Files\CMake\bin;C:\Program Files\dotnet\;C:\Perl64\bin;C:\Perl\bin;C:\Users\Dev\AppData\Local\Microsoft\WindowsApps;C:\Users\Dev\AppData\Local\Programs\Microsoft VS Code\bin;C:\Users\Dev\.dotnet\tools" C:/Users/Dev/Git/test/build/opt/ACE_wrappers/TAO/TAO_IDL/Debug/tao_idl.exe -g C:\Users\Dev\Git\test\build\opt\ACE_wrappers\TAO\src\Debug\ace_gperf.exe -Sp -Sd -Sg -Wb,pre_include=ace/pre.h -Wb,post_include=ace/post.h --idl-version 4 -as --unknown-annotations ignore -IC:/Users/Dev/Git/test/opt/ACE_wrappers/TAO -IC:/Users/Dev/Git/test/Test_Interface C:/Users/Dev/Git/test/Test_Interface/vp_core.idl -H perfect_hash
TAO_IDL: warning, GPERF could not be executed
Perfect Hashing or Binary/Linear Search cannot be done without GPERF
Now, using Dynamic Hashing..
To use Perfect Hashing or Binary/Linear Search strategy
        -Build gperf at $ACE_ROOT/apps/gperf/src
        -Set the environment variable $ACE_ROOT appropriately or add $ACE_ROOT/bin to the PATH
        -Refer to Operation Lookup section in the TAO IDL User Guide ($TAO_ROOT/docs/compiler.html) for more details
tao-idli_zBLwo5.cpp
@mitza-oci
Copy link
Member

My suggestion would be to run tao_idl in the debugger or use a tool like Sysinternals Process Monitor to watch what's happening when it tries to spawn gperf.

@alexchandel
Copy link
Author

alexchandel commented Mar 1, 2023

@mitza-oci Good call:
CreateFile C:\Users\Dev\Git\vplk\build\opt\ACE_wrappers\TAO\src\Debug\ace_gperf.exe\ace_gperf.exe PATH NOT FOUND.

It treated the -g path as a directory. The documentation says it's a file path:

-g path | To specify the path for the perfect hashing program (GPERF). Default is $ACE_ROOT/bin/ace_gperf.

It should probably check if -g path is the actual ace_gperf file path before appending a file name, especially if ace_gperf was compiled to a different executable name for some crazy reason.

@mitza-oci
Copy link
Member

I'm not sure why it's adding a \ace_gperf.exe in be_global.cpp. I've used this before as -g full/path/to/bin/ace_gperf and I think that was on both platforms.

@alexchandel
Copy link
Author

Weird. I'm using the ACE+TAO 7.0.11 release. Passing the directory -g C:\Users\Dev\Git\vplk\build\opt\ACE_wrappers\TAO\src\Debug fixed it.

@alexchandel alexchandel changed the title tao_idl fails to call gperf when located out-of-source tao_idl treats -g path as a folder Mar 2, 2023
@alexchandel
Copy link
Author

Doesn't happen on macOS. Might be Windows-specific. FYI tao_idl reports no error or warning on Windows if the -g path doesn't exist, if it eventually finds GPERF in ACE_ROOT or another fallback location.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

No branches or pull requests

2 participants