Skip to content
Open
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: 21 additions & 0 deletions src/makei/build.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

""" The module used to build a project"""
import sys
import os
from pathlib import Path
from tempfile import mkstemp
from typing import Any, Dict, List, Optional
Expand Down Expand Up @@ -80,13 +81,33 @@ def _create_build_vars(self):
target_file_path = self.build_vars_path

rules_mk_paths = list(Path(".").rglob("Rules.mk"))
real_targets = []
# Create Rules.mk.build for each Rules.mk
for rules_mk_path in rules_mk_paths:
rules_mk = RulesMk.from_file(rules_mk_path, self.src_dir, map(Path, self.iproj_json.include_path))
rules_mk_src_obj_mapping = rules_mk.src_obj_mapping.copy()
if self.targets and self.targets[0] != "all":
for target in self.targets:
if target.startswith("dir_") and target not in real_targets:
real_targets.append(target)
else:
# Target is relative path. i.e. QRPGLESRC/TEST.RPGLE
if len(Path(target).parts) > 1:
tgt_dir = os.path.dirname(target)
tgt = os.path.basename(target)
# Target is a file name
else:
tgt_dir = "."
tgt = target

# Target exist in the current Rules.mk and target's rule exists
if tgt_dir == str(rules_mk.containing_dir) and tgt.upper() in rules_mk_src_obj_mapping:
real_targets.extend(rules_mk_src_obj_mapping.pop(tgt.upper()))
rules_mk.build_context = self
rules_mk_build_path = rules_mk_path.parent / ".Rules.mk.build"
rules_mk_build_path.write_text(str(rules_mk))
self.tmp_files.append(rules_mk_build_path)
self.targets = real_targets if real_targets else self.targets

subdirs = list(map(lambda x: x.parents[0], rules_mk_paths))

Expand Down
12 changes: 8 additions & 4 deletions src/makei/cli/makei_entry.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,12 @@
import os
import sys

from pathlib import Path
from makei import __version__
from makei import init_project
from makei.build import BuildEnv
from makei.cvtsrcpf import CvtSrcPf
from makei.utils import Colors, colored, get_compile_targets_from_filenames
from makei.utils import Colors, colored


def cli():
Expand Down Expand Up @@ -219,7 +220,8 @@ def handle_compile(args):
if args.file:
filenames = [args.file]
elif args.files:
filenames = map(os.path.basename, args.files.split(':'))
# Ensures all paths are relative to the project root
filenames = map(lambda f: (str(Path(f).resolve().relative_to(Path.cwd()))), args.files.split(':'))
else:
filenames = []
targets = []
Expand All @@ -231,9 +233,11 @@ def handle_compile(args):
source_names.append(name)
# print("source:"+' '.join(source_names))
# print("compile targets:"+' '.join(get_compile_targets_from_filenames(source_names)))
targets.extend(get_compile_targets_from_filenames(source_names))
print(colored("targets: " + ' '.join(targets), Colors.OKBLUE))
targets.extend(source_names)
build_env = BuildEnv(targets, args.make_options, get_override_vars(args))
targets = build_env.targets
print(colored("targets: " + ' '.join(targets), Colors.OKBLUE))

if build_env.make():
sys.exit(0)
else:
Expand Down
94 changes: 47 additions & 47 deletions src/makei/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,53 +33,53 @@
]

FILE_TARGETGROUPS_MAPPING = {
"PGM.SQLRPGLE": "PGM",
"PGM.RPGLE": "PGM",
"PGM.CLLE": "PGM",
"PGM.CBLLE": "PGM",
"PGM.C": "PGM",
"PGM.SQLCBLLE": "PGM",
"CMDSRC": "CMD",
"CMD": "CMD",
"DSPF": "DSPF",
"LF": "LF",
"PF": "PF",
"PRTF": "PRTF",
"FILE": "PF",
"MENUSRC": "MENU",
"MENU": "MENU",
"C": "MODULE",
"CPP": "MODULE",
"RPGLE": "MODULE",
"CLLE": "MODULE",
"CBLLE": "MODULE",
"SQLC": "MODULE",
"SQLCPP": "MODULE",
"SQLRPGLE": "MODULE",
"SQLCBLLE": "MODULE",
"MODULE": "PGM",
"CLP": "PGM",
"CBL": "PGM",
"RPG": "PGM",
"ILEPGM": "PGM",
"PNLGRPSRC": "PNLGRP",
"PNLGRP": "PNLGRP",
"SQL": "QMQRY",
"BND": "SRVPGM",
"ILESRVPGM": "SRVPGM",
"BNDDIR": "BNDD",
"DTAARA": "DTAARA",
"DTAQ": "DTAQ",
"SYSTRG": "TRG",
"SQLPRC": "SQL",
"TABLE": "SQL",
"VIEW": "SQL",
"INDEX": "SQL",
"SQLSEQ": "SQL",
"SQLUDF": "SQL",
"SQLTRG": "SQL",
"MSGF": "MSG",
"WSCSTSRC": "WSCST",
"PGM.SQLRPGLE": {"PGM"},
"PGM.RPGLE": {"PGM"},
"PGM.CLLE": {"PGM"},
"PGM.CBLLE": {"PGM"},
"PGM.C": {"PGM"},
"PGM.SQLCBLLE": {"PGM"},
"CMDSRC": {"CMD"},
"CMD": {"CMD"},
"DSPF": {"DSPF"},
"LF": {"LF"},
"PF": {"PF"},
"PRTF": {"PRTF"},
"FILE": {"PF"},
"MENUSRC": {"MENU"},
"MENU": {"MENU"},
"C": {"MODULE"},
"CPP": {"MODULE"},
"RPGLE": {"MODULE", "PGM"},
"CLLE": {"MODULE"},
"CBLLE": {"MODULE"},
"SQLC": {"MODULE"},
"SQLCPP": {"MODULE"},
"SQLRPGLE": {"MODULE", "PGM"},
"SQLCBLLE": {"MODULE"},
"MODULE": {"PGM"},
"CLP": {"PGM"},
"CBL": {"PGM"},
"RPG": {"PGM"},
"ILEPGM": {"PGM"},
"PNLGRPSRC": {"PNLGRP"},
"PNLGRP": {"PNLGRP"},
"SQL": {"QMQRY"},
"BND": {"SRVPGM"},
"ILESRVPGM": {"SRVPGM"},
"BNDDIR": {"BNDD"},
"DTAARA": {"DTAARA"},
"DTAQ": {"DTAQ"},
"SYSTRG": {"TRG"},
"SQLPRC": {"SQL"},
"TABLE": {"SQL"},
"VIEW": {"SQL"},
"INDEX": {"SQL"},
"SQLSEQ": {"SQL"},
"SQLUDF": {"SQL"},
"SQLTRG": {"SQL"},
"MSGF": {"MSG"},
"WSCSTSRC": {"WSCST"},
}

TARGET_TARGETGROUPS_MAPPING = {
Expand Down
18 changes: 17 additions & 1 deletion src/makei/rules_mk.py
Original file line number Diff line number Diff line change
Expand Up @@ -143,12 +143,28 @@ class RulesMk:
targets: Dict[str, List[str]]
rules: List[MKRule]
build_context: Optional['BuildEnv'] = None
src_obj_mapping: Dict[str, str]

def __init__(self, subdirs: List[str], rules: List[MKRule], containing_dir: Path) -> None:
self.targets = {tgt_group + 's': [] for tgt_group in TARGET_GROUPS}
self.src_obj_mapping = {}
for rule in rules:
if rule.source_file is not None:
tgt_group = FILE_TARGETGROUPS_MAPPING[decompose_filename(rule.source_file)[-2]]
decomposed_src = decompose_filename(rule.source_file)
src = f"{decomposed_src[0].upper()}.{decomposed_src[2].upper()}"
if src not in self.src_obj_mapping:
self.src_obj_mapping[src] = [rule.target]
else:
self.src_obj_mapping[src].append(rule.target)
tgt_group_list = FILE_TARGETGROUPS_MAPPING[decomposed_src[-2].upper()]

# If only 1 target mapping exists, use it, otherwise use target's extension
tgt_group = next(iter(tgt_group_list)).upper() if len(tgt_group_list) == 1 \
else rule.target.split('.')[-1].upper()
if tgt_group not in TARGET_GROUPS:
print(f"Warning: Target '{rule.target}' is not supported")
sys.exit(1)

self.targets[tgt_group + 's'].append(rule.target)
else:
try:
Expand Down
26 changes: 1 addition & 25 deletions src/makei/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
from pathlib import Path
from shutil import move, copymode
from tempfile import mkstemp, gettempdir
from typing import Callable, List, Optional, Tuple, Union
from typing import Callable, Optional, Tuple, Union

from makei.const import FILE_MAX_EXT_LENGTH, FILE_TARGET_MAPPING, COMMENT_STYLES

Expand Down Expand Up @@ -279,30 +279,6 @@ def get_target_from_filename(filename: str) -> str:
return f'{name.upper()}.{FILE_TARGET_MAPPING[ext]}'


def get_compile_targets_from_filenames(filenames: List[str]) -> List[str]:
""" Returns the possible target name for the given filename

>>> get_compile_targets_from_filenames(["test.PGM.RPGLE"])
['TEST.PGM']
>>> get_compile_targets_from_filenames(["test.pgm.rpgle"])
['TEST.PGM']
>>> get_compile_targets_from_filenames(["test.RPGLE"])
['TEST.MODULE']
>>> get_compile_targets_from_filenames(["vat300.rpgle"])
['VAT300.MODULE']
>>> get_compile_targets_from_filenames(["functionsVAT/VAT300.RPGLE", "test.RPGLE"])
['VAT300.MODULE', 'TEST.MODULE']
>>> get_compile_targets_from_filenames(["ART200-Work_with_article.PGM.SQLRPGLE", "SGSMSGF.MSGF"])
['ART200.PGM', 'SGSMSGF.MSGF']
>>> get_compile_targets_from_filenames(["SAMPLE.BNDDIR"])
['SAMPLE.BNDDIR']
"""
result = []
for filename in filenames:
result.append(get_target_from_filename(filename))
return result


def format_datetime(d: datetime) -> str:
# 2022-03-25-09.33.34.064676
return d.strftime("%Y-%m-%d-%H.%M.%S.%f")
Expand Down
6 changes: 6 additions & 0 deletions tests/data/rules_mks/mapping.rules.mk
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
OBSCURE.MODULE: LONGSOURCEFILENAME.RPGLE

HELLO.PGM: HELLO.RPGLE
HELLO.MODULE: HELLO.RPGLE

WORLD.PGM: WORLD.PGM.RPGLE
60 changes: 59 additions & 1 deletion tests/unit/test_rules_mk.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,8 @@ def test_from_file():
'private VARIMMED ::= IMMED', 'private VARESCAPE :::= ESCAPE']
mkrule1 = MKRule('VAT300.MODULE', ['vat300.rpgle', 'some.rpgleinc'], [], variables1, data_dir, [])
expected_rules = [mkrule1]

assert rules_mk.src_obj_mapping['VAT300.RPGLE'] == ['VAT300.MODULE']
assert rules_mk.containing_dir == data_dir
assert rules_mk.subdirs == ['adir', 'bdir']
assert rules_mk.targets == expected_targets
Expand Down Expand Up @@ -165,9 +167,11 @@ def test_dtaara_recipe():
'LFs': [], 'DSPFs': [], 'PRTFs': [], 'CMDs': [], 'MODULEs': [], 'SRVPGMs': [], 'PGMs': [],
'MENUs': [], 'PNLGRPs': [], 'QMQRYs': [], 'WSCSTs': [], 'MSGs': []}

assert rules_mk.src_obj_mapping['LASTORDNO.DTAARA'] == ['LASTORDNO.DTAARA']
assert rules_mk.containing_dir == data_dir
assert rules_mk.subdirs == []
assert rules_mk.targets == expected_targets

assert rules_mk.rules[0].variables == []
assert rules_mk.rules[0].commands == []
assert rules_mk.rules[0].dependencies == []
Expand All @@ -191,9 +195,11 @@ def test_dtaq_recipe():
'LFs': [], 'DSPFs': [], 'PRTFs': [], 'CMDs': [], 'MODULEs': [], 'SRVPGMs': [],
'PGMs': [], 'MENUs': [], 'PNLGRPs': [], 'QMQRYs': [], 'WSCSTs': [], 'MSGs': []}

assert rules_mk.src_obj_mapping['ORDERS.DTAQ'] == ['ORDERS.DTAQ']
assert rules_mk.containing_dir == data_dir
assert rules_mk.subdirs == []
assert rules_mk.targets == expected_targets

assert rules_mk.rules[0].variables == []
assert rules_mk.rules[0].commands == []
assert rules_mk.rules[0].dependencies == []
Expand All @@ -217,7 +223,10 @@ def test_dds_recipe():
'DETORD.FILE', 'TMPDETORD.FILE'], 'LFs': [], 'DSPFs': ['ART301D.FILE'],
'PRTFs': ['ORD500O.FILE'], 'CMDs': [], 'MODULEs': [], 'SRVPGMs': [], 'PGMs': [],
'MENUs': [], 'PNLGRPs': [], 'QMQRYs': [], 'WSCSTs': [], 'MSGs': []}

assert rules_mk.src_obj_mapping['ARTICLE.PF'] == ['ARTICLE.FILE']
assert rules_mk.src_obj_mapping['ART301D.DSPF'] == ['ART301D.FILE']
assert rules_mk.src_obj_mapping['DETORD.PF'] == ['DETORD.FILE']
assert rules_mk.src_obj_mapping['ORD500O.PRTF'] == ['ORD500O.FILE']
assert rules_mk.containing_dir == data_dir
assert rules_mk.subdirs == []
assert rules_mk.targets == expected_targets
Expand Down Expand Up @@ -272,3 +281,52 @@ def test_dds_recipe():
\tsystem -i "CPYF FROMFILE($(OBJLIB)/DETORD) TOFILE($(OBJLIB)/TMPDETORD) CRTFILE(*YES)"
\t@$(call echo_success_cmd,End of creating TMPDETORD.FILE)
'''


def test_src_obj_mapping():
rules_mk = RulesMk.from_file(data_dir / "mapping.rules.mk", data_dir)
expected_targets = {'TRGs': [], 'DTAARAs': [], 'DTAQs': [], 'SQLs': [], 'BNDDs': [], 'PFs': [], 'LFs': [],
'DSPFs': [], 'PRTFs': [], 'CMDs': [], 'MODULEs': ['OBSCURE.MODULE', 'HELLO.MODULE'],
'SRVPGMs': [], 'PGMs': ['HELLO.PGM', 'WORLD.PGM'], 'MENUs': [], 'PNLGRPs': [],
'QMQRYs': [], 'WSCSTs': [], 'MSGs': []}
assert rules_mk.src_obj_mapping['LONGSOURCEFILENAME.RPGLE'] == ['OBSCURE.MODULE']
assert rules_mk.src_obj_mapping['HELLO.RPGLE'] == ['HELLO.PGM', 'HELLO.MODULE']
assert rules_mk.src_obj_mapping['WORLD.PGM.RPGLE'] == ['WORLD.PGM']
assert rules_mk.containing_dir == data_dir
assert rules_mk.subdirs == []
assert rules_mk.targets == expected_targets

assert rules_mk.rules[0].variables == []
assert rules_mk.rules[0].commands == []
assert rules_mk.rules[0].dependencies == []
assert rules_mk.rules[0].include_dirs == []
assert rules_mk.rules[0].target == 'OBSCURE.MODULE'
assert rules_mk.rules[0].source_file == 'LONGSOURCEFILENAME.RPGLE'
assert str(rules_mk.rules[0]) == '''OBSCURE.MODULE_SRC=LONGSOURCEFILENAME.RPGLE
OBSCURE.MODULE_DEP=\nOBSCURE.MODULE_RECIPE=RPGLE_TO_MODULE_RECIPE\n'''

assert rules_mk.rules[1].variables == []
assert rules_mk.rules[1].commands == []
assert rules_mk.rules[1].dependencies == []
assert rules_mk.rules[1].include_dirs == []
assert rules_mk.rules[1].target == 'HELLO.PGM'
assert rules_mk.rules[1].source_file == 'HELLO.RPGLE'
# assert str(rules_mk.rules[1]) == '''HELLO.PGM_SRC=HELLO.RPGLE\nHELLO.PGM_DEP=
# HELLO.PGM_RECIPE=PGM.RPGLE_TO_PGM_RECIPE\n'''
assert rules_mk.rules[2].variables == []
assert rules_mk.rules[2].commands == []
assert rules_mk.rules[2].dependencies == []
assert rules_mk.rules[2].include_dirs == []
assert rules_mk.rules[2].target == 'HELLO.MODULE'
assert rules_mk.rules[2].source_file == 'HELLO.RPGLE'
assert str(rules_mk.rules[2]) == '''HELLO.MODULE_SRC=HELLO.RPGLE\nHELLO.MODULE_DEP=
HELLO.MODULE_RECIPE=RPGLE_TO_MODULE_RECIPE\n'''

assert rules_mk.rules[3].variables == []
assert rules_mk.rules[3].commands == []
assert rules_mk.rules[3].dependencies == []
assert rules_mk.rules[3].include_dirs == []
assert rules_mk.rules[3].target == 'WORLD.PGM'
assert rules_mk.rules[3].source_file == 'WORLD.PGM.RPGLE'
assert str(rules_mk.rules[3]) == '''WORLD.PGM_SRC=WORLD.PGM.RPGLE\nWORLD.PGM_DEP=
WORLD.PGM_RECIPE=PGM.RPGLE_TO_PGM_RECIPE\n'''
8 changes: 1 addition & 7 deletions tests/unit/test_utils.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from makei.utils import make_include_dirs_absolute, get_compile_targets_from_filenames
from makei.utils import make_include_dirs_absolute


# flake8: noqa: E501
Expand Down Expand Up @@ -50,9 +50,3 @@ def test_joblob_not_found():
parameters = " INCDIR( ''/a/b/dir1'' ''dir2'')"
expected = " INCDIR( ''/a/b/dir1'' ''dir2'')"
assert make_include_dirs_absolute(path, parameters) == expected

def test_compile_targets_from_filenames():
expected = ['TEST.DTAARA']
assert get_compile_targets_from_filenames(['test.DTAARA']) == expected
expected = ['TEST.FILE']
assert get_compile_targets_from_filenames(['test.index']) == expected