project('very long command lines', 'c') # Get the current system's commandline length limit. if build_machine.system() == 'windows' # Various limits on windows: # cmd.exe: 8kb # CreateProcess: 32kb limit = 32767 # NOTE: filename limit is 260 characters unless # 1. Python >= 3.6 is being used # 2. Windows 10 registry has been edited to enable long pathnaems # ninja backend uses absolute filenames, so we ensure they don't exceed 260. elif build_machine.system() == 'cygwin' # cygwin-to-win32: see above # cygwin-to-cygwin: no limit? # Cygwin is slow, so only test it lightly here. limit = 8192 else # ninja passes whole line as a single argument, for which # the limit is 128k as of Linux 2.6.23. See MAX_ARG_STRLEN. # BSD seems similar, see https://www.in-ulm.de/~mascheck/various/argmax limit = 131072 endif # Now exceed that limit, but not so far that the test takes too long. namelen = 260 nfiles = 50 + limit / namelen message('Expected link commandline length is approximately ' + '@0@'.format((nfiles * (namelen+28)))) seq = run_command('name_gen.py', nfiles.to_string(), meson.build_root(), check: true).stdout().strip().split('\n') sources = [] codegen = find_program('codegen.py') i=0 foreach name : seq sources += custom_target('codegen' + i.to_string(), command: [codegen, i.to_string(), '@OUTPUT@'], output: name + '.c') i+=1 endforeach shared_library('sharedlib', sources) static_library('staticlib', sources) executable('app', 'main.c', sources) # Also test short commandlines to make sure that doesn't regress shared_library('sharedlib0', sources[0]) static_library('staticlib0', sources[0]) executable('app0', 'main.c', sources[0])