diff options
author | Konstantin Käfer <mail@kkaefer.com> | 2018-12-17 15:24:11 +0100 |
---|---|---|
committer | Konstantin Käfer <mail@kkaefer.com> | 2019-01-09 10:26:53 +0100 |
commit | 6f60ccf08e4878d0688ddaefd906290a2998a148 (patch) | |
tree | 6e268040cfc1ea72fa577441398ecd790553df24 /scripts | |
parent | 9acdd75d04f335313a6c491599b5c7559d6458c7 (diff) | |
download | qtlocation-mapboxgl-6f60ccf08e4878d0688ddaefd906290a2998a148.tar.gz |
[build] generate header maps instead of -files.txt
Diffstat (limited to 'scripts')
-rwxr-xr-x | scripts/generate-cmake-files.js | 125 | ||||
-rwxr-xr-x | scripts/generate-file-lists.js | 148 | ||||
-rwxr-xr-x | scripts/nitpick/generated-code.js | 4 |
3 files changed, 150 insertions, 127 deletions
diff --git a/scripts/generate-cmake-files.js b/scripts/generate-cmake-files.js deleted file mode 100755 index c252344c64..0000000000 --- a/scripts/generate-cmake-files.js +++ /dev/null @@ -1,125 +0,0 @@ -#!/usr/bin/env node - -const child_process = require('child_process'); -const fs = require('fs'); -const ejs = require('ejs'); -const path = require('path'); -const xcode = require('xcode'); - -require('./style-code'); - -const fileListTxt = ejs.compile(fs.readFileSync('cmake/files.txt.ejs', 'utf8'), {strict: true}); - -function generateFileList(filename, root, regex, patterns) { - const files = child_process.execSync(`git -C ${root} ls-files ${patterns.map((p) => '"' + p + '"').join(' ')}`).toString().trim().split('\n'); - var groups = {}; - for (const file of files) { - const match = file.match(regex); - const group = match[1] || path.basename(filename, '-files.txt') - if (!groups[group]) { - groups[group] = []; - } - groups[group].push(file); - } - - writeIfModified(filename, fileListTxt({ groups: groups })); -} - -function generateXcodeSourceList(project, target, name) { - const projectPath = path.dirname(project); - let objects = xcode.project(path.join(project, 'project.pbxproj')).parseSync().hash.project.objects; - - // Build reverse lookup table for file => group - let objToGroup = {}; - Object.keys(objects.PBXGroup) - .filter(name => !/_comment$/.test(name)) - .forEach(name => objects.PBXGroup[name].children - .forEach(child => objToGroup[child.value] = name)); - - // Retrieve the target - const targetObj = Object.keys(objects.PBXNativeTarget) - .filter(name => !/_comment$/.test(name)) - .map(name => objects.PBXNativeTarget[name]) - .filter(project => project.name == target)[0]; - - // Retrieve the sources associated with the target. - const sourcesObjs = targetObj.buildPhases - .map(phase => objects.PBXSourcesBuildPhase[phase.value] || objects.PBXHeadersBuildPhase[phase.value]) - .filter(phase => phase); - - let groups = {}; - sourcesObjs - .forEach(sourcesObj => sourcesObj.files - .map(file => objects.PBXBuildFile[file.value].fileRef) - .forEach(fileRef => { - // Look up the full path, and fully qualified group name for every source reference - let fileObj = objects.PBXFileReference[fileRef]; - - // Ascend the group tree to find the full path. - let fullPath = [ fileObj.path.replace(/^"(.+)"$/, '$1') ]; - for (let ref = fileRef, obj = fileObj; obj.sourceTree != 'SOURCE_ROOT' && ref in objToGroup;) { - ref = objToGroup[ref]; - obj = objects.PBXGroup[ref]; - if (obj.path) { - fullPath.unshift(obj.path.replace(/^"(.+)"$/, '$1')); - } - } - - // Generate a group name from the Xcode source groups - let groupName = []; - for (let ref = fileRef, obj = fileObj; ref in objToGroup;) { - ref = objToGroup[ref]; - obj = objects.PBXGroup[ref]; - if (obj.name) { - groupName.unshift(obj.name.replace(/^"(.+)"$/, '$1')); - } - } - - groupName = groupName.join('/'); - if (!groups[groupName]) { - groups[groupName] = []; - } - fullPath.unshift(projectPath); - groups[groupName].push(path.join.apply(path, fullPath)); - }) - ); - - writeIfModified(`${projectPath}/${name || target}-files.txt`, fileListTxt({ groups: groups })); -} - -generateFileList('cmake/core-files.txt', '.', /^(?:src|include)\/(?:mbgl\/)?(.+)\/[^\/]+$/, - [ 'include/*.hpp', 'include/*.h', 'src/*.hpp', 'src/*.cpp', 'src/*.h', 'src/*.c' ]); - -generateFileList('cmake/benchmark-files.txt', '.', /^benchmark\/(?:(?:src|include)\/)?(?:mbgl\/)?(?:(.+)\/)?[^\/]+$/, - [ 'benchmark/*.hpp', 'benchmark/*.cpp', 'benchmark/*.h', 'benchmark/*.c' ]); - -generateFileList('cmake/test-files.txt', '.', /^test\/(?:(?:src|include)\/)?(?:mbgl\/)?(?:(.+)\/)?[^\/]+$/, - [ 'test/*.hpp', 'test/*.cpp', 'test/*.h', 'test/*.c' ]); - -generateXcodeSourceList('platform/macos/macos.xcodeproj', 'dynamic', 'sdk'); - -generateXcodeSourceList('platform/ios/ios.xcodeproj', 'dynamic', 'sdk'); - -const vendorRegex = /^(?:(?:src|include)\/)?(?:(.+)\/)?[^\/]+$/ -generateFileList('vendor/boost-files.txt', 'vendor/boost', vendorRegex, [ "include/**/*.hpp", "include/**/*.h" ]); -generateFileList('vendor/cheap-ruler-cpp-files.txt', 'vendor/cheap-ruler-cpp', vendorRegex, [ "include/**/*.hpp" ]); -generateFileList('vendor/earcut.hpp-files.txt', 'vendor/earcut.hpp', vendorRegex, [ "include/**/*.hpp" ]); -generateFileList('vendor/eternal-files.txt', 'vendor/eternal', vendorRegex, [ "include/**/*.hpp" ]); -generateFileList('vendor/expected-files.txt', 'vendor/expected', vendorRegex, [ "include/expected.hpp" ]); -generateFileList('vendor/geojson-vt-cpp-files.txt', 'vendor/geojson-vt-cpp', vendorRegex, [ "include/**/*.hpp" ]); -generateFileList('vendor/geojson.hpp-files.txt', 'vendor/geojson.hpp', vendorRegex, [ "include/**/*.hpp" ]); -generateFileList('vendor/geometry.hpp-files.txt', 'vendor/geometry.hpp', vendorRegex, [ "include/**/*.hpp" ]); -generateFileList('vendor/icu-files.txt', 'vendor/icu', vendorRegex, [ "include/**/*.h", "src/*.h", "src/*.cpp" ]); -generateFileList('vendor/jni.hpp-files.txt', 'vendor/jni.hpp', vendorRegex, [ "include/**/*.hpp", ":!:include/jni/string_conversion.hpp" ]); -generateFileList('vendor/kdbush.hpp-files.txt', 'vendor/kdbush.hpp', vendorRegex, [ "include/*.hpp" ]); -generateFileList('vendor/pixelmatch-cpp-files.txt', 'vendor/pixelmatch-cpp', vendorRegex, [ "include/**/*.hpp" ]); -generateFileList('vendor/polylabel-files.txt', 'vendor/polylabel', vendorRegex, [ "include/**/*.hpp" ]); -generateFileList('vendor/protozero-files.txt', 'vendor/protozero', vendorRegex, [ "include/**/*.hpp" ]); -generateFileList('vendor/rapidjson-files.txt', 'vendor/rapidjson', vendorRegex, [ "include/**/*.h" ]); -generateFileList('vendor/shelf-pack-cpp-files.txt', 'vendor/shelf-pack-cpp', vendorRegex, [ "include/**/*.hpp" ]); -generateFileList('vendor/sqlite-files.txt', 'vendor/sqlite', vendorRegex, [ "include/*.h", "src/*.c" ]); -generateFileList('vendor/supercluster.hpp-files.txt', 'vendor/supercluster.hpp', vendorRegex, [ "include/*.hpp" ]); -generateFileList('vendor/unique_resource-files.txt', 'vendor/unique_resource', vendorRegex, [ "unique_resource.hpp" ]); -generateFileList('vendor/variant-files.txt', 'vendor/variant', vendorRegex, [ "include/**/*.hpp" ]); -generateFileList('vendor/vector-tile-files.txt', 'vendor/vector-tile', vendorRegex, [ "include/**/*.hpp" ]); -generateFileList('vendor/wagyu-files.txt', 'vendor/wagyu', vendorRegex, [ "include/**/*.hpp" ]); diff --git a/scripts/generate-file-lists.js b/scripts/generate-file-lists.js new file mode 100755 index 0000000000..37e4dbc20b --- /dev/null +++ b/scripts/generate-file-lists.js @@ -0,0 +1,148 @@ +#!/usr/bin/env node + +const child_process = require('child_process'); +const fs = require('fs'); +const path = require('path'); +const xcode = require('xcode'); + +require('./style-code'); + +const classifier = /^(?:(?:(?:platform|vendor)\/(?:[^/]+)\/|(?:test|benchmark)\/)?(?:(include|src)\/)?)?(.+\.h(?:pp|xx)?)$/; + +function generateFileList(filename, root, regex, patterns) { + writeFileList( + filename, + child_process + .execSync(`git -C ${root} ls-files ${patterns.map((p) => '"' + p + '"').join(' ')}`) + .toString() + .trim() + .split('\n') + .map(file => path.join(root, file))); +} + +function writeFileList(filename, files) { + const json = { + "//": "This file is generated. Do not edit. Regenerate it with scripts/generate-file-lists.js", + sources: [], + public_headers: {}, + private_headers: {} + }; + files.sort(); + for (const file of files) { + const match = file.match(classifier); + if (!match) { + json.sources.push(file); + } else if (match[1] === 'src') { + json.private_headers[match[2]] = file; + } else { + if (match[1] !== 'include') { + console.warn(`* ${file} is not in include or src directory. Treating as public header.`); + } + json.public_headers[match[2]] = file; + } + } + writeIfModified(filename, JSON.stringify(json, null, 4) + '\n'); +} + +function generateXcodeSourceList(project, target, name) { + const projectPath = path.dirname(project); + let objects = xcode.project(path.join(project, 'project.pbxproj')).parseSync().hash.project.objects; + + // Build reverse lookup table for file => group + let objToGroup = {}; + Object.keys(objects.PBXGroup) + .filter(name => !/_comment$/.test(name)) + .forEach(name => objects.PBXGroup[name].children + .forEach(child => objToGroup[child.value] = name)); + + // Retrieve the target + const targetObj = Object.keys(objects.PBXNativeTarget) + .filter(name => !/_comment$/.test(name)) + .map(name => objects.PBXNativeTarget[name]) + .filter(project => project.name == target)[0]; + + // Retrieve the sources associated with the target. + const sourcesObjs = targetObj.buildPhases + .map(phase => objects.PBXSourcesBuildPhase[phase.value] || objects.PBXHeadersBuildPhase[phase.value]) + .filter(phase => phase); + + const json = { + "//": "This file is generated. Do not edit. Regenerate it with scripts/generate-file-lists.js", + sources: [], + public_headers: {}, + private_headers: {} + }; + + sourcesObjs + .forEach(sourcesObj => sourcesObj.files + .map(file => objects.PBXBuildFile[file.value]) + .forEach(buildFile => { + // const isPublic = buildFile.settings && buildFile.settings.ATTRIBUTES && buildFile.settings.ATTRIBUTES.indexOf('Public') >= 0 || false; + const fileRef = buildFile.fileRef; + // Look up the full path, and fully qualified group name for every source reference + let fileObj = objects.PBXFileReference[fileRef]; + + // Ascend the group tree to find the full path. + let fullPath = [ fileObj.path.replace(/^"(.+)"$/, '$1') ]; + for (let ref = fileRef, obj = fileObj; obj.sourceTree != 'SOURCE_ROOT' && ref in objToGroup;) { + ref = objToGroup[ref]; + obj = objects.PBXGroup[ref]; + if (obj.path) { + fullPath.unshift(obj.path.replace(/^"(.+)"$/, '$1')); + } + } + fullPath.unshift(projectPath); + + const fullPathName = path.join.apply(path, fullPath); + + if (sourcesObj.isa === 'PBXHeadersBuildPhase') { + const isPublic = buildFile.settings && buildFile.settings.ATTRIBUTES && buildFile.settings.ATTRIBUTES.indexOf('Public') >= 0 || false; + json[isPublic ? 'public_headers' : 'private_headers'][path.basename(fullPathName)] = fullPathName; + } else { + json.sources.push(fullPathName); + } + }) + ); + + json.public_headers['Mapbox/Mapbox.h'] = json.public_headers['Mapbox.h']; + delete json.public_headers['Mapbox.h']; + + writeIfModified(`${projectPath}/${name || target}-files.json`, JSON.stringify(json, null, 4) + '\n'); +} + +generateFileList('src/core-files.json', '.', /^(?:src|include)\/(?:mbgl\/)?(.+)\/[^\/]+$/, + [ 'include/*.hpp', 'include/*.h', 'src/*.hpp', 'src/*.cpp', 'src/*.h', 'src/*.c' ]); + +generateFileList('benchmark/benchmark-files.json', '.', /^benchmark\/(?:(?:src|include)\/)?(?:mbgl\/)?(?:(.+)\/)?[^\/]+$/, + [ 'benchmark/*.hpp', 'benchmark/*.cpp', 'benchmark/*.h', 'benchmark/*.c' ]); + +generateFileList('test/test-files.json', '.', /^test\/(?:(?:src|include)\/)?(?:mbgl\/)?(?:(.+)\/)?[^\/]+$/, + [ 'test/*.hpp', 'test/*.cpp', 'test/*.h', 'test/*.c' ]); + +generateXcodeSourceList('platform/macos/macos.xcodeproj', 'dynamic', 'sdk'); + +generateXcodeSourceList('platform/ios/ios.xcodeproj', 'dynamic', 'sdk'); + +const vendorRegex = /^(?:(?:src|include)\/)?(?:(.+)\/)?[^\/]+$/ +generateFileList('vendor/boost-files.json', 'vendor/boost', vendorRegex, [ "include/**/*.hpp", "include/**/*.h" ]); +generateFileList('vendor/cheap-ruler-cpp-files.json', 'vendor/cheap-ruler-cpp', vendorRegex, [ "include/**/*.hpp" ]); +generateFileList('vendor/earcut.hpp-files.json', 'vendor/earcut.hpp', vendorRegex, [ "include/**/*.hpp" ]); +generateFileList('vendor/eternal-files.json', 'vendor/eternal', vendorRegex, [ "include/**/*.hpp" ]); +generateFileList('vendor/expected-files.json', 'vendor/expected', vendorRegex, [ "include/expected.hpp" ]); +generateFileList('vendor/geojson-vt-cpp-files.json', 'vendor/geojson-vt-cpp', vendorRegex, [ "include/**/*.hpp" ]); +generateFileList('vendor/geojson.hpp-files.json', 'vendor/geojson.hpp', vendorRegex, [ "include/**/*.hpp" ]); +generateFileList('vendor/geometry.hpp-files.json', 'vendor/geometry.hpp', vendorRegex, [ "include/**/*.hpp" ]); +generateFileList('vendor/icu-files.json', 'vendor/icu', vendorRegex, [ "include/**/*.h", "src/*.h", "src/*.cpp" ]); +generateFileList('vendor/jni.hpp-files.json', 'vendor/jni.hpp', vendorRegex, [ "include/**/*.hpp", ":!:include/jni/string_conversion.hpp" ]); +generateFileList('vendor/kdbush.hpp-files.json', 'vendor/kdbush.hpp', vendorRegex, [ "include/*.hpp" ]); +generateFileList('vendor/pixelmatch-cpp-files.json', 'vendor/pixelmatch-cpp', vendorRegex, [ "include/**/*.hpp" ]); +generateFileList('vendor/polylabel-files.json', 'vendor/polylabel', vendorRegex, [ "include/**/*.hpp" ]); +generateFileList('vendor/protozero-files.json', 'vendor/protozero', vendorRegex, [ "include/**/*.hpp" ]); +generateFileList('vendor/rapidjson-files.json', 'vendor/rapidjson', vendorRegex, [ "include/**/*.h" ]); +generateFileList('vendor/shelf-pack-cpp-files.json', 'vendor/shelf-pack-cpp', vendorRegex, [ "include/**/*.hpp" ]); +generateFileList('vendor/sqlite-files.json', 'vendor/sqlite', vendorRegex, [ "include/*.h", "src/*.c" ]); +generateFileList('vendor/supercluster.hpp-files.json', 'vendor/supercluster.hpp', vendorRegex, [ "include/*.hpp" ]); +generateFileList('vendor/unique_resource-files.json', 'vendor/unique_resource', vendorRegex, [ "unique_resource.hpp" ]); +generateFileList('vendor/variant-files.json', 'vendor/variant', vendorRegex, [ "include/**/*.hpp" ]); +generateFileList('vendor/vector-tile-files.json', 'vendor/vector-tile', vendorRegex, [ "include/**/*.hpp" ]); +generateFileList('vendor/wagyu-files.json', 'vendor/wagyu', vendorRegex, [ "include/**/*.hpp" ]); diff --git a/scripts/nitpick/generated-code.js b/scripts/nitpick/generated-code.js index b8699eaa00..1638b6a186 100755 --- a/scripts/nitpick/generated-code.js +++ b/scripts/nitpick/generated-code.js @@ -33,8 +33,8 @@ function checkGeneratedFiles(name, scripts) { } const mode = (process.argv[2] || '').toLowerCase(); -if (!mode || mode == 'cmake') { - checkGeneratedFiles('CMake list', ['scripts/generate-cmake-files.js']); +if (!mode || mode == 'sources') { + checkGeneratedFiles('Source list', ['scripts/generate-file-lists.js']); } if (!mode || mode == 'shader') { checkGeneratedFiles('shader', ['scripts/generate-shaders.js']); |