diff --git a/EU07.cpp b/EU07.cpp index 644014ec..272127d4 100644 --- a/EU07.cpp +++ b/EU07.cpp @@ -18,6 +18,17 @@ #ifdef _WIN32 #include #endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include import eu07.application.application; import eu07.utilities.logs; import eu07.utilities.globals; diff --git a/audit_modules.py b/audit_modules.py new file mode 100644 index 00000000..3266bf47 --- /dev/null +++ b/audit_modules.py @@ -0,0 +1,341 @@ +#!/usr/bin/env python3 +"""Audit the tree for the problems that only some toolchains diagnose. + +Every check here corresponds to something that broke a real build: + + 1. export-scope `export` on an out-of-line member definition. Clang rejects + it; GCC accepted it. Nothing to do with which compiler is + "right" - the declaration introduces no namespace-scope + name, so it cannot be exported. + + 2. fwd-decl A forward declaration of a class another module owns. + Ill-formed across a module boundary. + + 3. iwyu A unit naming std:: things without including the header. + libstdc++ 16 drags most of them in; libstdc++ 13 and + MSVC's STL do not, and ADL then misses the free operators + declared beside the type. + + 4. bare-c Unqualified uint8_t / size_t and friends, same story. + + 5. include-order An #include after an import. The header's guard, if it + first arrived through the imported module's global module + fragment, is not visible here - macros do not cross a + module boundary - so the body is parsed twice and MSVC + rejects the redefinition. + + 6. template-hdr A template defined in a module interface is instantiated + in the importing unit, so the types its body names must be + complete THERE. Reaching them through the interface's + fragment is not enough for MSVC. + + 7. macro-damage An include or import sitting inside a #define's line + continuation. Only ever caused by a botched rewrite. + +Read-only by default. Pass --fix to apply what is mechanically fixable +(3, 4, 5, 6); 1, 2 and 7 are reported for a human to look at. +""" +import os +import re +import sys + +ROOT = os.path.dirname(os.path.abspath(__file__)) +SKIP = ('ref', 'betterRenderer/thirdparty', 'betterRenderer/shaders', '.git', + 'imgui', 'stb', 'ci_shadervalidator', 'build') +# single-header libraries pasted into the tree: their includes are often behind +# an implementation guard, so leave them alone +VENDORED = {'tinyexr.h', 'xegtao.h', 'nanozlib.h', 'inteltaa.h', 'stb_image.h', + 'stb_image_resize2.h', 'ddspp.h', 'ma_dds.h'} + +HDR = {} +for _hdr, _names in { + 'array': 'array', 'atomic': 'atomic atomic_bool atomic_int atomic_flag', + 'bitset': 'bitset', 'chrono': 'chrono', 'condition_variable': 'condition_variable', + 'cstddef': 'size_t ptrdiff_t byte nullptr_t', + 'cstdint': 'uint8_t uint16_t uint32_t uint64_t int8_t int16_t int32_t int64_t ' + 'uintptr_t intptr_t', + 'deque': 'deque', 'filesystem': 'filesystem', 'forward_list': 'forward_list', + 'fstream': 'ifstream ofstream fstream', + 'functional': 'function bind ref cref reference_wrapper hash less greater invoke', + 'future': 'future async promise packaged_task shared_future', + 'initializer_list': 'initializer_list', 'iomanip': 'setprecision setw setfill', + 'ios': 'ios ios_base streamsize', 'iostream': 'cout cerr cin clog endl', + 'istream': 'istream', + 'iterator': 'back_inserter front_inserter inserter distance advance next prev ' + 'iterator_traits', + 'limits': 'numeric_limits', 'list': 'list', 'map': 'map multimap', + 'memory': 'shared_ptr unique_ptr weak_ptr make_shared make_unique ' + 'enable_shared_from_this addressof default_delete static_pointer_cast ' + 'dynamic_pointer_cast const_pointer_cast', + 'mutex': 'mutex lock_guard unique_lock recursive_mutex scoped_lock once_flag call_once', + 'numeric': 'accumulate iota inner_product', + 'optional': 'optional nullopt make_optional', 'ostream': 'ostream', + 'queue': 'queue priority_queue', + 'random': 'mt19937 mt19937_64 random_device uniform_real_distribution ' + 'uniform_int_distribution normal_distribution', + 'set': 'set multiset', 'sstream': 'stringstream ostringstream istringstream', + 'stack': 'stack', + 'stdexcept': 'runtime_error logic_error out_of_range invalid_argument length_error', + 'string': 'string wstring to_string stoi stof stod stol stoul stoll string_view getline', + 'thread': 'thread jthread this_thread', + 'tuple': 'tuple make_tuple tie tuple_size tuple_element apply', + 'type_traits': 'is_same enable_if underlying_type decay remove_reference conditional ' + 'is_base_of declval same_as', + 'typeinfo': 'type_info bad_cast', + 'unordered_map': 'unordered_map unordered_multimap', + 'unordered_set': 'unordered_set unordered_multiset', + 'utility': 'pair make_pair move forward swap exchange', + 'variant': 'variant visit holds_alternative get_if monostate', 'vector': 'vector', +}.items(): + for _n in _names.split(): + HDR.setdefault(_n, _hdr) + +# names too overloaded to attribute to one header +AMBIGUOUS = {'get', 'begin', 'end', 'size', 'data', 'min', 'max', 'abs', 'swap', + 'move', 'forward'} +BARE = {'uint8_t': 'cstdint', 'uint16_t': 'cstdint', 'uint32_t': 'cstdint', + 'uint64_t': 'cstdint', 'int8_t': 'cstdint', 'int16_t': 'cstdint', + 'int32_t': 'cstdint', 'int64_t': 'cstdint', 'uintptr_t': 'cstdint', + 'intptr_t': 'cstdint', 'size_t': 'cstddef', 'ptrdiff_t': 'cstddef'} +STD_HEADERS = set(HDR.values()) | set(BARE.values()) + +MODULE_DECL = re.compile(r'^(export )?module ([\w.:]+);', re.M) +IMPORT = re.compile(r'^[ \t]*import[ \t]+[\w.:]+[ \t]*;', re.M) +INCLUDE = re.compile(r'^[ \t]*#[ \t]*include\b') + + +def sources(): + for dp, dn, fs in os.walk(ROOT): + rel = os.path.relpath(dp, ROOT) + if rel != '.' and any(rel == s or rel.startswith(s + os.sep) or rel.startswith(s) + for s in SKIP): + dn[:] = [] + continue + for f in sorted(fs): + if f.endswith(('.cpp', '.cppm', '.h', '.hpp')) and f.lower() not in VENDORED: + yield os.path.join(dp, f) + + +def read(p): + raw = open(p, encoding='utf-8', errors='replace').read() + bom = raw.startswith('') + return raw[1:] if bom else raw, bom + + +def split_unit(src): + """(global module fragment, purview, module name or None).""" + m = MODULE_DECL.search(src) + if not m: + return src, src, None + return src[:m.start()], src[m.end():], m.group(2) + + +def template_bodies(purview): + out = [] + for m in re.finditer(r'^[ \t]*template[ \t]*<', purview, re.M): + i, depth, started = m.start(), 0, False + while i < len(purview): + c = purview[i] + if c == '{': + depth += 1 + started = True + elif c == '}': + depth -= 1 + if started and depth == 0: + i += 1 + break + elif c == ';' and not started: + break + i += 1 + out.append(purview[m.start():i]) + return out + + +def insert_point(src): + """Top level of the preprocessor, before the first import, never inside a + #define's continuation.""" + depth, last_include, first_import, i = 0, None, None, 0 + lines = src.split('\n') + while i < len(lines): + l = lines[i] + if re.match(r'^[ \t]*#[ \t]*(?:if|ifdef|ifndef)\b', l): + depth += 1 + elif re.match(r'^[ \t]*#[ \t]*endif\b', l): + depth -= 1 + elif l.lstrip().startswith('#'): + start = i + while lines[i].rstrip().endswith('\\') and i + 1 < len(lines): + i += 1 + if INCLUDE.match(l) and depth == 0 and start == i and first_import is None: + last_include = i + elif IMPORT.match(l) and depth == 0 and first_import is None: + first_import = i + i += 1 + at = first_import if first_import is not None else ( + last_include + 1 if last_include is not None else 0) + return lines, at + + +def main(): + fix = '--fix' in sys.argv + units, provides, imports_of = [], {}, {} + findings = {k: [] for k in ('export-scope', 'fwd-decl', 'iwyu', 'bare-c', + 'include-order', 'template-hdr', 'macro-damage')} + owners = {} + + files = list(sources()) + for p in files: + src, bom = read(p) + gmf, purview, mod = split_unit(src) + units.append((p, src, gmf, purview, mod, bom)) + if mod: + deps = {x.split(':')[0] for x in re.findall(r'^import ([\w.:]+);', src, re.M)} + imports_of.setdefault(mod, set()).update(deps) + if p.endswith('.cppm') and mod: + base = mod.split(':')[0] + for c in re.findall(r'^\s*(?:export\s+)?(?:class|struct)\s+(\w+)\s*' + r'(?:final\s*)?(?::[^;{]*)?\{', src, re.M): + owners.setdefault(c, base) + need = set() + for body in template_bodies(purview): + for n in set(re.findall(r'\bstd::(\w+)', body)): + if n not in AMBIGUOUS and HDR.get(n): + need.add(HDR[n]) + if need: + provides.setdefault(base, set()).update(need) + + def closure(names): + seen, todo = set(), list(names) + while todo: + n = todo.pop() + if n in seen: + continue + seen.add(n) + todo.extend(imports_of.get(n, ())) + return seen + + edits = {} + for p, src, gmf, purview, mod, bom in units: + rel = os.path.relpath(p, ROOT) + lines = src.split('\n') + + # 7. an include or import swallowed by a macro continuation + for i, l in enumerate(lines): + if i and lines[i - 1].rstrip().endswith('\\') and \ + (INCLUDE.match(l) or IMPORT.match(l)): + findings['macro-damage'].append('%s:%d' % (rel, i + 1)) + break + + # 1. export on an out-of-line member definition + if p.endswith('.cppm'): + cls = set(re.findall(r'^\s*(?:export\s+)?(?:class|struct)\s+(\w+)\s*' + r'(?:final\s*)?(?::[^;{]*)?\{', src, re.M)) + depth, inexp = 0, False + for i, l in enumerate(src.split('\n')): + if re.match(r'\s*export\s*\{', l): + inexp, depth = True, 0 + continue + # `export inline glm::vec3 f(...)` is a free function whose return + # type happens to be qualified, so match the declarator's class + # against the ones this file defines rather than any `::` at all + m = re.match(r'^\s*export\s+.*?\b(\w+)(?:<[^<>]*>)?::(~?\w+|operator[^\s(]*)\s*[\(<]', l) + if m and m.group(1) in cls: + findings['export-scope'].append('%s:%d' % (rel, i + 1)) + if inexp: + if depth == 0: + m = re.match(r'\s*(?:template\s*<.*>\s*)?(?:inline\s+|constexpr\s+|' + r'virtual\s+|static\s+)*(?:[\w:<>,&*\s]*?\s)?' + r'(\w+)(?:<[^<>]*>)?::(~?\w+|operator[^\s(]*)\s*[\(<]', l) + if m and m.group(1) in cls: + findings['export-scope'].append('%s:%d' % (rel, i + 1)) + depth += l.count('{') - l.count('}') + if depth < 0: + inexp, depth = False, 0 + + # 2. forward declaration of a class another module owns + for m in re.finditer(r'^\s*(?:class|struct)\s+(\w+)\s*;', src, re.M): + o = owners.get(m.group(1)) + if o and mod and o != mod.split(':')[0]: + findings['fwd-decl'].append( + '%s:%d %s -> %s' % (rel, src[:m.start()].count('\n') + 1, + m.group(1), o)) + + # 5. an include after an import + depth, first_import, after = 0, None, [] + i, ls = 0, lines + while i < len(ls): + l = ls[i] + if re.match(r'^[ \t]*#[ \t]*(?:if|ifdef|ifndef)\b', l): + depth += 1 + elif re.match(r'^[ \t]*#[ \t]*endif\b', l): + depth -= 1 + elif l.lstrip().startswith('#'): + start = i + while ls[i].rstrip().endswith('\\') and i + 1 < len(ls): + i += 1 + # Only a standard header is a hazard here. A project header in the + # purview is normal and sometimes required: an out-of-line member + # of a module-attached class has to be defined inside the purview. + std_after = re.match(r'^[ \t]*#[ \t]*include[ \t]*<([\w.]+)>', l) + if std_after and std_after.group(1) in STD_HEADERS \ + and depth == 0 and start == i and first_import is not None: + after.append(i) + elif IMPORT.match(l) and depth == 0 and first_import is None: + first_import = i + i += 1 + if after: + findings['include-order'].append('%s (%d)' % (rel, len(after))) + + # 3/4/6. headers this unit should include itself + if mod is None and not re.search(r'^import ', src, re.M): + continue # a plain header with no module contact + need = set() + for n in set(re.findall(r'\bstd::(\w+)', purview)): + if n not in AMBIGUOUS and HDR.get(n) and '<%s>' % HDR[n] not in gmf: + need.add(HDR[n]) + for n, h in BARE.items(): + if re.search(r'(?' % h not in gmf \ + and '<%s.h>' % h[1:] not in gmf: + need.add(h) + if need: + findings['iwyu' if any(h not in BARE.values() for h in need) + else 'bare-c'].append('%s %s' % (rel, ' '.join(sorted(need)))) + + direct = {x.split(':')[0] for x in re.findall(r'^import ([\w.:]+);', src, re.M)} + if mod: + direct.add(mod.split(':')[0]) + want = set() + for im in closure(direct): + want |= provides.get(im, set()) + miss = sorted(h for h in want if '<%s>' % h not in gmf) + if miss: + findings['template-hdr'].append('%s %s' % (rel, ' '.join(miss))) + need |= set(miss) + + if fix and need: + edits[p] = (sorted(need), bom) + + for k in ('macro-damage', 'export-scope', 'fwd-decl', 'include-order', + 'iwyu', 'bare-c', 'template-hdr'): + v = findings[k] + print('%-15s %d' % (k, len(v))) + for row in v[:12]: + print(' %s' % row) + if len(v) > 12: + print(' ... i %d wiecej' % (len(v) - 12)) + + if fix and edits: + for p, (need, bom) in edits.items(): + src, _ = read(p) + lines, at = insert_point(src) + gmf = split_unit(src)[0] + add = ['#include <%s>' % h for h in need if '<%s>' % h not in gmf] + if not add: + continue + lines[at:at] = add + open(p, 'w', encoding='utf-8').write( + ('' if bom else '') + '\n'.join(lines)) + print('\nnaprawiono %d plikow' % len(edits)) + + +main() diff --git a/betterRenderer/eu07_source/register.cpp b/betterRenderer/eu07_source/register.cpp index d83858ef..dcf44537 100644 --- a/betterRenderer/eu07_source/register.cpp +++ b/betterRenderer/eu07_source/register.cpp @@ -1,6 +1,19 @@ #include #include "nvrenderer/nvrenderer.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include import eu07.utilities.logs; namespace { std::unique_ptr create_nvrenderer_for_d3d12() { diff --git a/betterRenderer/renderer/include/nvrenderer/nvrenderer.h b/betterRenderer/renderer/include/nvrenderer/nvrenderer.h index ada815f5..bf3beb0c 100644 --- a/betterRenderer/renderer/include/nvrenderer/nvrenderer.h +++ b/betterRenderer/renderer/include/nvrenderer/nvrenderer.h @@ -40,6 +40,11 @@ #include "quadtree.h" #include "resource_registry.h" +#include +#include +#include +#include +#include import eu07.utilities.classes; import eu07.utilities.globals; import eu07.simcore; diff --git a/betterRenderer/renderer/source/environment.cpp b/betterRenderer/renderer/source/environment.cpp index 85cc6c3c..bb26917d 100644 --- a/betterRenderer/renderer/source/environment.cpp +++ b/betterRenderer/renderer/source/environment.cpp @@ -16,6 +16,16 @@ #include "nvtexture.h" #include "sky.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include import eu07.simulation.simulationenvironment; int MaEnvironment::GetCurrentSetIndex() { if (m_locked_set_index >= 0 && IsReady()) { diff --git a/betterRenderer/renderer/source/fsr.cpp b/betterRenderer/renderer/source/fsr.cpp index 076b9fcd..23efa31b 100644 --- a/betterRenderer/renderer/source/fsr.cpp +++ b/betterRenderer/renderer/source/fsr.cpp @@ -18,6 +18,19 @@ #include "gbuffer.h" #include "gbufferblitpass.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include import eu07.utilities.globals; import eu07.glm; NvFSR::NvFSR(NvRenderer* renderer) diff --git a/betterRenderer/renderer/source/gbufferblitpass.cpp b/betterRenderer/renderer/source/gbufferblitpass.cpp index d6a9f442..10af4864 100644 --- a/betterRenderer/renderer/source/gbufferblitpass.cpp +++ b/betterRenderer/renderer/source/gbufferblitpass.cpp @@ -11,6 +11,18 @@ #include "sky.h" #include "ssao.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include import eu07.utilities.timer; import eu07.glm; GbufferBlitPass::GbufferBlitPass(NvRenderer* renderer, NvGbuffer* gbuffer, diff --git a/betterRenderer/renderer/source/materialparser.cpp b/betterRenderer/renderer/source/materialparser.cpp index 4264caf8..91572042 100644 --- a/betterRenderer/renderer/source/materialparser.cpp +++ b/betterRenderer/renderer/source/materialparser.cpp @@ -13,6 +13,16 @@ #include "utilities/utilities_macros.h" #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include import eu07.utilities.globals; import eu07.utilities.logs; import eu07.model.material; diff --git a/betterRenderer/renderer/source/nvmaterial.cpp b/betterRenderer/renderer/source/nvmaterial.cpp index 6d583ec9..4ad279bf 100644 --- a/betterRenderer/renderer/source/nvmaterial.cpp +++ b/betterRenderer/renderer/source/nvmaterial.cpp @@ -18,6 +18,14 @@ #include "nvtexture.h" #include "sky.h" +#include +#include +#include +#include +#include +#include +#include +#include import eu07.utilities.logs; bool NvRenderer::MaterialTemplate::CreateBindingSet(size_t pipeline_index, MaterialCache &cache) { diff --git a/betterRenderer/renderer/source/nvrenderer.cpp b/betterRenderer/renderer/source/nvrenderer.cpp index 4eb084f9..e904c2a7 100644 --- a/betterRenderer/renderer/source/nvrenderer.cpp +++ b/betterRenderer/renderer/source/nvrenderer.cpp @@ -38,6 +38,12 @@ #include "tinyexr.h" #include "windshield_rain.h" #include "utilities/utilities_macros.h" +#include +#include +#include +#include +#include +#include import eu07.simcore; import eu07.utilities.logs; import eu07.utilities.timer; diff --git a/betterRenderer/renderer/source/nvrenderer_d3d12.cpp b/betterRenderer/renderer/source/nvrenderer_d3d12.cpp index 2890a98a..c9c4f375 100644 --- a/betterRenderer/renderer/source/nvrenderer_d3d12.cpp +++ b/betterRenderer/renderer/source/nvrenderer_d3d12.cpp @@ -9,6 +9,18 @@ #include "utilities/Globals_macros.h" #include "config.h" #include "nvrenderer/nvrenderer.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #if LIBMANUL_WITH_D3D12 diff --git a/betterRenderer/renderer/source/nvrenderer_vulkan.cpp b/betterRenderer/renderer/source/nvrenderer_vulkan.cpp index ab9f3be4..10654d9c 100644 --- a/betterRenderer/renderer/source/nvrenderer_vulkan.cpp +++ b/betterRenderer/renderer/source/nvrenderer_vulkan.cpp @@ -16,6 +16,14 @@ #include "utilities/Globals_macros.h" #include "config.h" #include "nvrenderer/nvrenderer.h" +#include +#include +#include +#include +#include +#include +#include +#include #if LIBMANUL_WITH_VULKAN diff --git a/betterRenderer/renderer/source/nvrendererbackend.cpp b/betterRenderer/renderer/source/nvrendererbackend.cpp index 207de922..c228b5ae 100644 --- a/betterRenderer/renderer/source/nvrendererbackend.cpp +++ b/betterRenderer/renderer/source/nvrendererbackend.cpp @@ -5,6 +5,16 @@ #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include import eu07.utilities.logs; void NvRendererMessageCallback::message(nvrhi::MessageSeverity severity, const char *messageText) { diff --git a/betterRenderer/renderer/source/nvtexture.cpp b/betterRenderer/renderer/source/nvtexture.cpp index 2961da73..595cf01b 100644 --- a/betterRenderer/renderer/source/nvtexture.cpp +++ b/betterRenderer/renderer/source/nvtexture.cpp @@ -16,6 +16,14 @@ #include "nvrendererbackend.h" #include "stbi/stb_image.h" #include "stbi/stb_image_resize2.h" +#include +#include +#include +#include +#include +#include +#include +#include import eu07.utilities.globals; import eu07.scripting.pyint; import eu07.application.application; diff --git a/betterRenderer/renderer/source/resource_registry.cpp b/betterRenderer/renderer/source/resource_registry.cpp index dc94dbf0..d83b7757 100644 --- a/betterRenderer/renderer/source/resource_registry.cpp +++ b/betterRenderer/renderer/source/resource_registry.cpp @@ -9,6 +9,17 @@ #include "nvtexture.h" #include "nvrenderer/nvrenderer.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include import eu07.utilities.logs; MaResourceMappingSet& MaResourceMappingSet::Add( const MaResourceMapping& mapping) { diff --git a/betterRenderer/renderer/source/rt_model.cpp b/betterRenderer/renderer/source/rt_model.cpp index aeb1ebe5..a818e7db 100644 --- a/betterRenderer/renderer/source/rt_model.cpp +++ b/betterRenderer/renderer/source/rt_model.cpp @@ -16,6 +16,14 @@ +#include +#include +#include +#include +#include +#include +#include +#include import eu07.simcore; namespace Rt { diff --git a/betterRenderer/renderer/source/rt_model.h b/betterRenderer/renderer/source/rt_model.h index f2047dd6..cce1ead8 100644 --- a/betterRenderer/renderer/source/rt_model.h +++ b/betterRenderer/renderer/source/rt_model.h @@ -7,6 +7,19 @@ // TSubModel/TModel3d are owned by the simulation core; a forward // declaration here would be a second, conflicting declaration. +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include import eu07.simcore; import eu07.glm; namespace Rt { diff --git a/betterRenderer/renderer/source/sky.cpp b/betterRenderer/renderer/source/sky.cpp index a9a935ec..adf30e71 100644 --- a/betterRenderer/renderer/source/sky.cpp +++ b/betterRenderer/renderer/source/sky.cpp @@ -9,6 +9,17 @@ #include "nvrendererbackend.h" #include "imgui/imgui.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include import eu07.simulation.simulationenvironment; import eu07.simulation.simulationtime; import eu07.glm; diff --git a/betterRenderer/renderer/source/topo_utils.h b/betterRenderer/renderer/source/topo_utils.h index d82af1c1..90cb6471 100644 --- a/betterRenderer/renderer/source/topo_utils.h +++ b/betterRenderer/renderer/source/topo_utils.h @@ -1,6 +1,19 @@ #pragma once +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include import eu07.simcore; struct MaTopologyUtils { diff --git a/betterRenderer/renderer/source/track_batching.cpp b/betterRenderer/renderer/source/track_batching.cpp index eb8fb874..b50ec8a3 100644 --- a/betterRenderer/renderer/source/track_batching.cpp +++ b/betterRenderer/renderer/source/track_batching.cpp @@ -14,6 +14,13 @@ #include "nvrendererbackend.h" #include "utilities/utilities_macros.h" +#include +#include +#include +#include +#include +#include +#include import eu07.utilities.timer; import eu07.simcore; import eu07.simulation.simulation; diff --git a/export_e3d_standalone.cpp b/export_e3d_standalone.cpp index f6642bf1..fe3cf3df 100644 --- a/export_e3d_standalone.cpp +++ b/export_e3d_standalone.cpp @@ -1,5 +1,17 @@ #include "utilities/Globals_macros.h" #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include import eu07.simcore; import eu07.utilities.globals; import eu07.rendering.renderer; diff --git a/scripting/PyIntStub.cpp b/scripting/PyIntStub.cpp index cc3ee35d..e85c95ba 100644 --- a/scripting/PyIntStub.cpp +++ b/scripting/PyIntStub.cpp @@ -1,4 +1,17 @@ #include "scripting/PyInt_macros.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include import eu07.scripting.pyint; /* This Source Code Form is subject to the diff --git a/windows.cpp b/windows.cpp index 01726037..d8e237ce 100644 --- a/windows.cpp +++ b/windows.cpp @@ -1,4 +1,17 @@ #include "utilities/utilities_macros.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include import eu07.input.messaging; import eu07.utilities.utilities;