Skip to content
This repository was archived by the owner on Mar 26, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 12 additions & 9 deletions cli/src/builders/make/customRules.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,9 @@ export function readAllRules(targets: Targets, project: MakeProject) {
const currentTarget = targets.getTarget({systemName: targetName, type: targetType});

if (currentTarget) {
// We set this to empty since we're overriding them
currentTarget.deps = [];
// We actually don't want to clear out existing deps found by SO
// Instead, let's combine them with the deps found in rules.mk
// currentTarget.deps = [];

const parts = value.split(` `).map(p => p.trim()).filter(p => p.length > 0);

Expand All @@ -80,17 +81,19 @@ export function readAllRules(targets: Targets, project: MakeProject) {
const objType = partSplit[1] as ObjectType;

if (objName && objType) {
const obj = targets.searchForObject({systemName: objName, type: objType});

if (obj) {
currentTarget.deps.push(obj);
} else {
warningOut(`make: Failed to find '${part}' in '${relative}'`);
if (!currentTarget.deps.some(d => d.systemName === objName && d.type === objType)) {
const obj = targets.searchForObject({systemName: objName, type: objType});

if (obj) {
currentTarget.deps.push(obj);
} else {
warningOut(`make: Failed to find '${part}' in '${relative}'`);
}
}
}
}
}
}
}

}
}
Expand Down
9 changes: 8 additions & 1 deletion cli/src/builders/make/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ export class MakeProject {
private noChildren: boolean = false;
private settings: iProject = new iProject();
private projectActions: ProjectActions;
private actionsEnabled: boolean = false;

private folderSettings: {[folder: string]: FolderOptions} = {};

Expand All @@ -35,8 +36,14 @@ export class MakeProject {
this.noChildren = noChildren;
}

public useActions() {
this.actionsEnabled = true;
}

async setupSettings() {
await this.projectActions.loadAllActions();
if (this.actionsEnabled) {
await this.projectActions.loadAllActions();
}

// First, let's setup the project settings
try {
Expand Down
1 change: 1 addition & 0 deletions cli/src/cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ export let cliSettings = {
cliMode: false,
infoMessages: false,
buildFile: "none" as BuildFiles,
withActions: false,
fixIncludes: false,
autoRename: false,
fileList: false,
Expand Down
13 changes: 13 additions & 0 deletions cli/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,10 @@ async function main() {
i++;
break;

case `-wa`:
cliSettings.withActions = true;
break;

case '-nc':
case '--no-children':
cliSettings.makeFileNoChildren = true;
Expand Down Expand Up @@ -95,6 +99,9 @@ async function main() {
console.log(`\t-bf make|bob|imd|json\tCreate build files of a specific format`);
console.log(`\t\t\t\tExample: -bf make`);
console.log(``);
console.log(`\t-wa\t\tWhen using '-bf make', use commands`);
console.log(`\t\t\tthat are found in the 'actions.json' files.`);
console.log(``);
console.log(`\t-bl <name>\tSet the BRANCHLIB environment variable based on `);
console.log(`\t\t\ta user provided branch name, and will write it out.`);
console.log(`\t\t\tExample: -bl feature/123-cool-idea`);
Expand Down Expand Up @@ -213,6 +220,12 @@ async function main() {
break;
case `make`:
const makeProj = new MakeProject(cwd, targets, fs);

// Enables the use of actions.json for commands
if (cliSettings.withActions) {
makeProj.useActions();
}

await makeProj.setupSettings();

makeProj.setNoChildrenInBuild(cliSettings.makeFileNoChildren);
Expand Down
6 changes: 5 additions & 1 deletion cli/src/targets.ts
Original file line number Diff line number Diff line change
Expand Up @@ -927,7 +927,11 @@ export class Targets {
const simpleName = trimQuotes(def.object.name, `"`);
// TODO: do we need to look for SRVPGM (function) or PGM (procedure) here?
const resolvedObject = this.searchForAnyObject({ name: simpleName, types: [`FILE`, `SRVPGM`, `PGM`] });
if (resolvedObject) newTarget.deps.push(resolvedObject);
if (resolvedObject) {
if (!newTarget.deps.find(d => d.systemName === resolvedObject.systemName && d.type === resolvedObject.type)) {
newTarget.deps.push(resolvedObject);
}
}
else if (!isSqlFunction(def.object.name)) {
this.logger.fileLog(newTarget.relativePath, {
message: `No object found for reference '${def.object.name}'`,
Expand Down
4 changes: 2 additions & 2 deletions cli/test/cs_srvpgm.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
const testModule = targets.getTarget({systemName: `TEMPTEST`, type: `MODULE`});
expect(testModule).toBeDefined();

expect(testModule.deps.length).toBe(3);

Check failure on line 40 in cli/test/cs_srvpgm.test.ts

View workflow job for this annotation

GitHub Actions / build (windows-latest, 18.x)

test/cs_srvpgm.test.ts > pseudo tests > That test files are understood

AssertionError: expected 2 to be 3 // Object.is equality - Expected + Received - 3 + 2 ❯ test/cs_srvpgm.test.ts:40:36
expect(testModule.deps.find(f => f.systemName === `EMPLOYEE`)).toBeDefined();
expect(testModule.deps.find(f => f.systemName === `DEPARTMENT`)).toBeDefined();
expect(testModule.deps.find(f => f.systemName === `EMPDET` && f.type === `MODULE`)).toBeDefined();
Expand All @@ -54,7 +54,7 @@
const employees = targets.getTarget({systemName: `EMPLOYEES`, type: `PGM`});
expect(employees).toBeDefined();

expect(employees.deps.length).toBe(4);

Check failure on line 57 in cli/test/cs_srvpgm.test.ts

View workflow job for this annotation

GitHub Actions / build (windows-latest, 18.x)

test/cs_srvpgm.test.ts > pseudo tests > Deps are picked up for the module

AssertionError: expected 2 to be 4 // Object.is equality - Expected + Received - 4 + 2 ❯ test/cs_srvpgm.test.ts:57:35
expect(employees.deps.find(f => f.systemName === `EMPLOYEES` && f.type === `MODULE`)).toBeDefined();
expect(employees.deps.find(f => f.systemName === `EMPDET` && f.type === `MODULE`)).toBeDefined();
expect(employees.deps.find(f => f.systemName === `EMPS` && f.type === `FILE`)).toBeDefined();
Expand All @@ -69,7 +69,7 @@
expect(files[`Rules.mk`]).toBeDefined();
expect(files[`Rules.mk`]).toBe(`SUBDIRS = qddssrc qrpglesrc qtestsrc`);

expect(files[path.join(`qtestsrc`, `Rules.mk`)]).toBe(`TEMPTEST.MODULE: emptest.test.sqlrpgle qrpgleref/empdet.rpgleinc EMPLOYEE.FILE DEPARTMENT.FILE EMPDET.MODULE`)

Check failure on line 72 in cli/test/cs_srvpgm.test.ts

View workflow job for this annotation

GitHub Actions / build (windows-latest, 18.x)

test/cs_srvpgm.test.ts > pseudo tests > ibmi-bob rules

AssertionError: expected 'TEMPTEST.MODULE: emptest.test.sqlrpgl…' to be 'TEMPTEST.MODULE: emptest.test.sqlrpgl…' // Object.is equality Expected: "TEMPTEST.MODULE: emptest.test.sqlrpgle qrpgleref/empdet.rpgleinc EMPLOYEE.FILE DEPARTMENT.FILE EMPDET.MODULE" Received: "TEMPTEST.MODULE: emptest.test.sqlrpgle EMPLOYEE.FILE DEPARTMENT.FILE" ❯ test/cs_srvpgm.test.ts:72:54

expect(files[path.join(`qrpglesrc`, `Rules.mk`)]).toContain(`EMPLOYEES.MODULE: employees.pgm.sqlrpgle qrpgleref/constants.rpgleinc qrpgleref/empdet.rpgleinc`);
expect(files[path.join(`qrpglesrc`, `Rules.mk`)]).toContain(`EMPLOYEES.PGM: EMPLOYEE.FILE EMPS.FILE EMPDET.MODULE EMPLOYEES.MODULE`);
Expand All @@ -78,17 +78,17 @@

test('makefile', async () => {
const makefile = new MakeProject(targets.getCwd(), targets, fs);
makefile.useActions();
await makefile.setupSettings();

const contents = makefile.getMakefile().join(`\n`);

expect(contents).toContain(`$(PREPATH)/EMPLOYEES.PGM:`);
expect(contents).toContain(`system "CRTPGM PGM($(BIN_LIB)/EMPLOYEES) ENTMOD(EMPLOYEES) MODULE(EMPDET EMPLOYEES) TGTRLS(*CURRENT) BNDDIR($(BNDDIR)) ACTGRP(*NEW)" > .logs/employees.splf`);

Check failure on line 87 in cli/test/cs_srvpgm.test.ts

View workflow job for this annotation

GitHub Actions / build (windows-latest, 18.x)

test/cs_srvpgm.test.ts > pseudo tests > makefile

AssertionError: expected 'BIN_LIB=DEV\nAPP_BNDDIR=\nLIBL=$(BIN_…' to contain 'system "CRTPGM PGM($(BIN_LIB)/EMPLOYE…' - Expected + Received - system "CRTPGM PGM($(BIN_LIB)/EMPLOYEES) ENTMOD(EMPLOYEES) MODULE(EMPDET EMPLOYEES) TGTRLS(*CURRENT) BNDDIR($(BNDDIR)) ACTGRP(*NEW)" > .logs/employees.splf + BIN_LIB=DEV + APP_BNDDIR= + LIBL=$(BIN_LIB) + + INCDIR="" + BNDDIR=*NONE + PREPATH=/QSYS.LIB/$(BIN_LIB).LIB + SHELL=/QOpenSys/usr/bin/qsh + + all: .logs .evfevent library $(PREPATH)/POPDEPT.PGM $(PREPATH)/POPEMP.PGM $(PREPATH)/DEPTS.PGM $(PREPATH)/EMPLOYEES.PGM $(PREPATH)/MYPGM.PGM $(PREPATH)/NEWEMP.PGM + + $(PREPATH)/POPDEPT.PGM: $(PREPATH)/DEPARTMENT.FILE + $(PREPATH)/POPEMP.PGM: $(PREPATH)/EMPLOYEE.FILE $(PREPATH)/DEPARTMENT.FILE + $(PREPATH)/DEPTS.PGM: $(PREPATH)/EMPLOYEES.PGM $(PREPATH)/NEWEMP.PGM $(PREPATH)/DEPARTMENT.FILE $(PREPATH)/DEPTS.FILE + $(PREPATH)/EMPDET.MODULE: $(PREPATH)/EMPLOYEE.FILE $(PREPATH)/DEPARTMENT.FILE + $(PREPATH)/EMPLOYEES.PGM: $(PREPATH)/EMPLOYEE.FILE $(PREPATH)/EMPS.FILE + $(PREPATH)/NEWEMP.PGM: $(PREPATH)/EMPLOYEE.FILE $(PREPATH)/NEMP.FILE + $(PREPATH)/TEMPTEST.MODULE: $(PREPATH)/EMPLOYEE.FILE $(PREPATH)/DEPARTMENT.FILE + + .logs: + mkdir .logs + .evfevent: + mkdir .evfevent + library: + -system -q "CRTLIB LIB($(BIN_LIB))" + + + $(PREPATH)/MYPGM.PGM: qrpglesrc/mypgm.pgm.rpgle + liblist -c $(BIN_LIB);\ + liblist -a $(LIBL);\ + system "CRTBNDRPG NAME(mypgm) THEPARM('qrpglesrc/mypgm.pgm.rpgle')" > .logs/mypgm.splf + + $(PREPATH)/DEPTS.PGM: qrpglesrc/depts.pgm.sqlrpgle + liblist -c $(BIN_LIB);\ + liblist -a $(LIBL);\ + system "CRTSQLRPGI OBJ($(BIN_LIB)/DEPTS) SRCSTMF('qrpglesrc/depts.pgm.sqlrpgle') COMMIT(*NONE) DBGVIEW(*SOURCE) OPTION(*EVENTF) RPGPPOPT(*LVL2) COMPILEOPT('TGTCCSID(*JOB) BNDDIR($(BNDDIR)) DFTACTGRP(*no)')" > .logs/depts.splf || \ + (system "CPYTOSTMF FROMMBR('$(PREPATH)/EVFEVENT.FILE/DEPTS.MBR') TOSTMF('.evfevent/depts.evfevent') DBFCCSID(*FILE) STMFCCSID(1208) STMFOPT(*REPLACE)"; $(SHELL) -c 'exit 1') + $(PREPATH)/EMPLOYEES.PGM: qrpglesrc/employees.pgm.sqlrpgle + liblist -c $(BIN_LIB);\ + liblist -a $(LIBL);\ + system "CRTSQLRPGI OBJ($(BIN_LIB)/EMPLOYEES) SRCSTMF('qrpglesrc/employees.pgm.sqlrpgle') COMMIT(*NONE) DBGVIEW(*SOURCE) OPTION(*EVENTF) RPGPPOPT(*LVL2) COMPILEOPT('TGTCCSID(*JOB) BNDDIR($(BNDDIR)) DFTACTGRP(*no)')" > .logs/employees.splf || \ + (system "CPYTOSTMF FROMMBR('$(PREPATH)/EVFEVENT.FILE/EMPLOYEES.MBR') TOSTMF('.evfevent/employees.evfevent') DBFCCSID(*FILE) STMFCCSID(1208) STMFOPT(*REPLACE)"; $(SHELL) -c 'exit 1') + $(PREPATH)/NEWEMP.PGM: qrpglesrc/newemp.pgm.sqlrpgle + liblist -c $(BIN_LIB);\ + liblist -a $(LIBL);\ + system "CRTSQLRPGI OBJ($(BIN_LIB)/NEWEMP) SRCSTMF('qrpglesrc/newemp.pgm.sqlrpgle') COMMIT(*NONE) DBGVIEW(*SOURCE) OPTION(*EVENTF) RPGPPOPT(*LVL2) COMPILEOPT('TGTCCSID(*JOB) BNDDIR($(BNDDIR)) DFTACTGRP(*no)')" > .logs/newemp.splf || \ + (system "CPYTOSTMF FROMMBR('$(PREPATH)/EVFEVENT.FILE/NEWEMP.MBR') TOSTMF('.evfevent/newemp.evfevent') DBFCCSID(*FILE) STMFCCSID(1208) STMFOPT(*REPLACE)"; $(SHELL) -c 'exit 1') + + + $(PREPATH)/EMPDET.MODULE: qrpglesrc/empdet.sqlrpgle + liblist -c $(BIN_LIB);\ + liblist -a $(LIBL);\ + system "CRTSQLRPGI OBJ($(BIN_LIB)/EMPDET) SRCSTMF('qrpglesrc/empdet.sqlrpgle') COMMIT(*NONE) DBGVIEW(*SOURCE) COMPILEOPT('TGTCCSID(*JOB)') RPGPPOPT(*LVL2) OPTION(*EVENTF) OBJTYPE(*MODULE)" > .logs/empdet.splf || \ + (system "CPYTOSTMF FROMMBR('$(PREPATH)/EVFEVENT.FILE/EMPDET.MBR') TOSTMF('.evfevent/empdet.evfevent') DBFCCSID(*FILE) STMFCCSID(1208) STMFOPT(*REPLACE)"; $(SHELL) -c 'exit 1') + $(PREPATH)/TEMPTEST.MODULE: qtestsrc/emptest.test.sqlrpgle + liblist -c $(BIN_LIB);\ + liblist -a $(LIBL);\ + system "CRTSQLRPGI OBJ($(BIN_LIB)/TEMPTEST) SRCSTMF('qtestsrc/emptest.test.sqlrpgle') COMMIT(*NONE) DBGVIEW(*SOURCE) COMPILEOPT('TGTCCSID(*JOB)') RPGPPOPT(*LVL2) OPTION(*EVENTF) OBJTYPE(*MODULE)" > .logs/temptest.splf || \ + (system "CPYTOSTMF FROMMBR('$(PREPATH)/EVFEVENT.FILE/TEMPTEST.MBR') TOSTMF('.evfevent/temptest.evfevent') DBFCCSID(*FILE) STMFCCSID(1208) STMFOPT(*REPLACE)"; $(SHELL) -c 'exit 1') + + + $(PREPATH)/DE

expect(contents).not.toContain(`EMPDET.SRVPGM`); // Ensure no service program is created
expect(contents).toContain(`EMPDET.MODULE`);

console.log(contents);
expect(contents).toContain(`CRTSQLRPGI OBJ($(BIN_LIB)/EMPDET) SRCSTMF('qrpglesrc/empdet.sqlrpgle') COMMIT(*NONE) DBGVIEW(*SOURCE) COMPILEOPT('TGTCCSID(*JOB)') RPGPPOPT(*LVL2) OPTION(*EVENTF) OBJTYPE(*MODULE)`);

// As picked up from the actions.json
expect(contents).toContain(`system "CRTBNDRPG NAME(mypgm) THEPARM('qrpglesrc/mypgm.pgm.rpgle')" > .logs/mypgm.splf`);
Expand Down
6 changes: 4 additions & 2 deletions vs/client/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading