node-gyp icon indicating copy to clipboard operation
node-gyp copied to clipboard

Using hyphen `-` in NODE_GYP_MODULE_NAME / `target_name` causes build errors

Open jacobq opened this issue 3 years ago • 2 comments

Hopefully this is an appropriate place to file this (if not, I am sorry; please redirect me...would it be better in nodejs/abi-stable-node?).

I recently updated a simple native node addon to use Node-API / node-addon-api and was encountering strange compile-time errors that appeared to be coming from code generated by expansion of macros like NAPI_MODULE_INIT. After troubleshooting for a while I tried changing the target_name (in bindings.gyp) to a name that did not use a hyphen (it had been of the form "foo-bar" to match the package.json name), and the problem went away. Is this a difference between NAPI and native/v8? Is it due to changes in gyp? MS Build tools? Is it documented somewhere? (last version of the code code, dated November 2019, used node.h and NODE_MODULE macro and hyphenated target_name without issue) Any clues appreciated.

The hint that helped me think of this was C2143: syntax error: missing ';' before '-', but the root cause surprised me because it didn't seem to be an issue with the older native/v8 version.

  • Node Version: v16.15.0 (npm 8.5.5)
  • Platform:
OS Name:                   Microsoft Windows 11 Pro for Workstations
OS Version:                10.0.22000 N/A Build 22000
System Type:               x64-based PC
  • Compiler:
Microsoft (R) Build Engine version 14.0.25420.1
Copyright (C) Microsoft Corporation. All rights reserved.

14.0.25420.1
  • Module: Custom addon with target_name containing a hyphen/dash character (-). Can reproduce with "hello world" example by changing target_name to "hello-world" and then using NODE_GYP_MODULE_NAME instead of hello in the call to NODE_API_MODULE.
Boring initial output
gyp info it worked if it ends with ok
gyp info using [email protected]
gyp info using [email protected] | win32 | x64
gyp info find Python using Python version 3.8.8 found at "C:\ProgramData\Anaconda3\python.exe"
gyp info find VS using VS2017 (15.9.28307.1585) found at:
gyp info find VS "C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools"
gyp info find VS run with --verbose for detailed information
gyp info spawn C:\ProgramData\Anaconda3\python.exe
gyp info spawn args [
gyp info spawn args   'C:\\Users\\user\\AppData\\Roaming\\nvm\\v16.15.0\\node_modules\\npm\\node_modules\\node-gyp\\gyp\\gyp_main.py',
gyp info spawn args   'binding.gyp',
gyp info spawn args   '-f',
gyp info spawn args   'msvs',
gyp info spawn args   '-I',
gyp info spawn args   'C:\\Users\\user\\project\\build\\config.gypi',
gyp info spawn args   '-I',
gyp info spawn args   'C:\\Users\\user\\AppData\\Roaming\\nvm\\v16.15.0\\node_modules\\npm\\node_modules\\node-gyp\\addon.gypi',
gyp info spawn args   '-I',
gyp info spawn args   'C:\\Users\\user\\AppData\\Local\\node-gyp\\Cache\\16.15.0\\include\\node\\common.gypi',
gyp info spawn args   '-Dlibrary=shared_library',
gyp info spawn args   '-Dvisibility=default',
gyp info spawn args   '-Dnode_root_dir=C:\\Users\\user\\AppData\\Local\\node-gyp\\Cache\\16.15.0',
gyp info spawn args   '-Dnode_gyp_dir=C:\\Users\\user\\AppData\\Roaming\\nvm\\v16.15.0\\node_modules\\npm\\node_modules\\node-gyp',
gyp info spawn args   '-Dnode_lib_file=C:\\\\Users\\\\user\\\\AppData\\\\Local\\\\node-gyp\\\\Cache\\\\16.15.0\\\\<(target_arch)\\\\node.lib',
gyp info spawn args   '-Dmodule_root_dir=C:\\Users\\user\\project',
gyp info spawn args   '-Dnode_engine=v8',
gyp info spawn args   '--depth=.',
gyp info spawn args   '--no-parallel',
gyp info spawn args   '--generator-output',
gyp info spawn args   'C:\\Users\\user\\project\\build',
gyp info spawn args   '-Goutput_dir=.'
gyp info spawn args ]
gyp info spawn C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\MSBuild.exe
gyp info spawn args [
gyp info spawn args   'build/binding.sln',
gyp info spawn args   '/clp:Verbosity=minimal',
gyp info spawn args   '/nologo',
gyp info spawn args   '/p:Configuration=Release;Platform=x64'
gyp info spawn args ]
Build errors (interesting part):
Building the projects in this solution one at a time. To enable parallel build, please add the "/m" switch.
  addon.cc
c:\users\user\project\addon.cc(130): error C2143: syntax error: missing ';' before '-' [C:\Users\user\project\build\foo-bar.vcxproj]
c:\users\user\project\addon.cc(130): warning C4229: anachronism used: modifiers on data are ignored [C:\Users\user\project\build\foo-bar.vcxproj]
c:\users\user\project\addon.cc(130): error C2182: '_register_foo': illegal use of type 'void' [C:\Users\user\project\build\foo-bar.vcxproj]
c:\users\user\project\addon.cc(130): error C2143: syntax error: missing ')' before '-' [C:\Users\user\project\build\foo-bar.vcxproj]
c:\users\user\project\addon.cc(130): error C2165: 'left-side modifier': cannot modify pointers to data [C:\Users\user\project\build\foo-bar.vcxproj]
c:\users\user\project\addon.cc(130): error C2059: syntax error: ')' [C:\Users\user\project\build\foo-bar.vcxproj]
c:\users\user\project\addon.cc(130): error C2086: 'int _register_foo': redefinition [C:\Users\user\project\build\foo-bar.vcxproj]
  c:\users\user\project\addon.cc(130): note: see declaration of '_register_foo'
c:\users\user\project\addon.cc(130): error C2143: syntax error: missing ';' before '{' [C:\Users\user\project\build\foo-bar.vcxproj]
c:\users\user\project\addon.cc(130): error C2447: '{': missing function header (old-style formal list?) [C:\Users\user\project\build\foo-bar.vcxproj]
gyp ERR! build error
gyp ERR! stack Error: `C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\MSBuild.exe` failed with exit code: 1
gyp ERR! stack     at ChildProcess.onExit (C:\Users\user\AppData\Roaming\nvm\v16.15.0\node_modules\npm\node_modules\node-gyp\lib\build.js:194:23)
gyp ERR! stack     at ChildProcess.emit (node:events:527:28)
gyp ERR! stack     at Process.ChildProcess._handle.onexit (node:internal/child_process:291:12)
gyp ERR! System Windows_NT 10.0.22000
gyp ERR! command "C:\\Program Files\\nodejs\\node.exe" "C:\\Users\\user\\AppData\\Roaming\\nvm\\v16.15.0\\node_modules\\npm\\node_modules\\node-gyp\\bin\\node-gyp.js" "rebuild"
gyp ERR! cwd C:\Users\user\project
gyp ERR! node -v v16.15.0
gyp ERR! node-gyp -v v9.0.0
gyp ERR! not ok

jacobq avatar May 03 '22 17:05 jacobq

It's not just Windows. I have the same error on Mac OS.

Output

[email protected] build prebuildify --napi --target 14.17.4

gyp info it worked if it ends with ok gyp info using [email protected] gyp info using [email protected] | darwin | arm64 gyp info find Python using Python version 3.9.13 found at "/opt/homebrew/opt/[email protected]/bin/python3.9" gyp info spawn /opt/homebrew/opt/[email protected]/bin/python3.9 gyp info spawn args [ gyp info spawn args '/Users/artem/.nvm/versions/node/v14.17.4/lib/node_modules/npm/node_modules/node-gyp/gyp/gyp_main.py', gyp info spawn args 'binding.gyp', gyp info spawn args '-f', gyp info spawn args 'make', gyp info spawn args '-I', gyp info spawn args '/Users/artem/evt/verify-sdk-wrapper/build/config.gypi', gyp info spawn args '-I', gyp info spawn args '/Users/artem/.nvm/versions/node/v14.17.4/lib/node_modules/npm/node_modules/node-gyp/addon.gypi', gyp info spawn args '-I', gyp info spawn args '/var/folders/ry/vn519xvd2zqbx1tv7fnmpzr40000gp/T/prebuildify/node/14.17.4/include/node/common.gypi', gyp info spawn args '-Dlibrary=shared_library', gyp info spawn args '-Dvisibility=default', gyp info spawn args '-Dnode_root_dir=/var/folders/ry/vn519xvd2zqbx1tv7fnmpzr40000gp/T/prebuildify/node/14.17.4', gyp info spawn args '-Dnode_gyp_dir=/Users/artem/.nvm/versions/node/v14.17.4/lib/node_modules/npm/node_modules/node-gyp', gyp info spawn args '-Dnode_lib_file=/var/folders/ry/vn519xvd2zqbx1tv7fnmpzr40000gp/T/prebuildify/node/14.17.4/<(target_arch)/node.lib', gyp info spawn args '-Dmodule_root_dir=/Users/artem/evt/verify-sdk-wrapper', gyp info spawn args '-Dnode_engine=v8', gyp info spawn args '--depth=.', gyp info spawn args '--no-parallel', gyp info spawn args '--generator-output', gyp info spawn args 'build', gyp info spawn args '-Goutput_dir=.' gyp info spawn args ] gyp info spawn make gyp info spawn args [ 'BUILDTYPE=Release', '-C', 'build' ] CC(target) Release/obj.target/verify-sdk/native/sdk.o ../native/sdk.c:138:16: error: variable has incomplete type 'void' /napi_value/ NAPI_MODULE_INIT(/napi_env env, napi_value exports/) { ^ /var/folders/ry/vn519xvd2zqbx1tv7fnmpzr40000gp/T/prebuildify/node/14.17.4/include/node/node_api.h:106:3: note: expanded from macro 'NAPI_MODULE_INIT' NAPI_MODULE(NODE_GYP_MODULE_NAME, NAPI_MODULE_INITIALIZER)
^ /var/folders/ry/vn519xvd2zqbx1tv7fnmpzr40000gp/T/prebuildify/node/14.17.4/include/node/node_api.h:92:3: note: expanded from macro 'NAPI_MODULE' NAPI_MODULE_X(modname, regfunc, NULL, 0) // NOLINT (readability/null_usage) ^ /var/folders/ry/vn519xvd2zqbx1tv7fnmpzr40000gp/T/prebuildify/node/14.17.4/include/node/node_api.h:71:17: note: expanded from macro 'NAPI_MODULE_X' NAPI_C_CTOR(register ## modname) {
^ :418:1: note: expanded from here _register_verify ^ ../native/sdk.c:138:16: error: expected ';' after top level declarator /var/folders/ry/vn519xvd2zqbx1tv7fnmpzr40000gp/T/prebuildify/node/14.17.4/include/node/node_api.h:106:15: note: expanded from macro 'NAPI_MODULE_INIT' NAPI_MODULE(NODE_GYP_MODULE_NAME, NAPI_MODULE_INITIALIZER)
^ :1:36: note: expanded from here #define NODE_GYP_MODULE_NAME verify-sdk ^ ../native/sdk.c:138:16: error: variable has incomplete type 'void' /var/folders/ry/vn519xvd2zqbx1tv7fnmpzr40000gp/T/prebuildify/node/14.17.4/include/node/node_api.h:106:3: note: expanded from macro 'NAPI_MODULE_INIT' NAPI_MODULE(NODE_GYP_MODULE_NAME, NAPI_MODULE_INITIALIZER)
^ /var/folders/ry/vn519xvd2zqbx1tv7fnmpzr40000gp/T/prebuildify/node/14.17.4/include/node/node_api.h:92:3: note: expanded from macro 'NAPI_MODULE' NAPI_MODULE_X(modname, regfunc, NULL, 0) // NOLINT (readability/null_usage) ^ /var/folders/ry/vn519xvd2zqbx1tv7fnmpzr40000gp/T/prebuildify/node/14.17.4/include/node/node_api.h:71:17: note: expanded from macro 'NAPI_MODULE_X' NAPI_C_CTOR(register ## modname) {
^ :418:1: note: expanded from here _register_verify ^ ../native/sdk.c:138:16: error: expected ';' after top level declarator /var/folders/ry/vn519xvd2zqbx1tv7fnmpzr40000gp/T/prebuildify/node/14.17.4/include/node/node_api.h:106:15: note: expanded from macro 'NAPI_MODULE_INIT' NAPI_MODULE(NODE_GYP_MODULE_NAME, NAPI_MODULE_INITIALIZER)
^ :1:36: note: expanded from here #define NODE_GYP_MODULE_NAME verify-sdk ^ 4 errors generated. make: *** [Release/obj.target/verify-sdk/native/sdk.o] Error 1 gyp ERR! build error gyp ERR! stack Error: make failed with exit code: 2 gyp ERR! stack at ChildProcess.onExit (/Users/artem/.nvm/versions/node/v14.17.4/lib/node_modules/npm/node_modules/node-gyp/lib/build.js:194:23) gyp ERR! stack at ChildProcess.emit (events.js:400:28) gyp ERR! stack at Process.ChildProcess._handle.onexit (internal/child_process.js:277:12) gyp ERR! System Darwin 21.5.0 gyp ERR! command "/Users/artem/.nvm/versions/node/v14.17.4/bin/node" "/Users/artem/.nvm/versions/node/v14.17.4/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild" "--target=14.17.4" "--devdir=/var/folders/ry/vn519xvd2zqbx1tv7fnmpzr40000gp/T/prebuildify/node" "--arch=arm64" "--release" gyp ERR! cwd /Users/artem/evt/verify-sdk-wrapper gyp ERR! node -v v14.17.4 gyp ERR! node-gyp -v v7.1.2 gyp ERR! not ok node-gyp exited with 1

arthot avatar Jul 20 '22 16:07 arthot

This should either be fixed or result in an compilation error, mentioning an invalid target name.

buffcode avatar Sep 18 '23 09:09 buffcode

This issue seems no longer relevant as it uses a no longer supported version of Node and has been stale for a some time. If there are no objections, I will close this issue next Mon-Tue. In case something similar happens again please open a new issue.

StefanStojanovic avatar Apr 18 '24 10:04 StefanStojanovic