@profoundlogic/codermake 2.1.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +32 -1
- package/dist/bin/index.js +1 -1
- package/dist/bin/preprocess-rpg-copy.js +1 -1
- package/dist/bin/rdf-to-dds.js +1 -1
- package/dist/lib/discovery.js +1 -1
- package/dist/lib/ejs-to-dds.js +1 -1
- package/dist/lib/executor.js +1 -1
- package/dist/lib/generate-rdf-dds.js +1 -1
- package/dist/lib/license.js +1 -1
- package/dist/lib/makefile-generator.js +1 -1
- package/dist/lib/platform.js +1 -1
- package/dist/lib/preprocessor.js +1 -1
- package/dist/lib/rdf-to-post-data.js +1 -1
- package/dist/lib/rpg-copy-preprocessor.js +1 -1
- package/dist/lib/ssh.js +1 -1
- package/dist/lib/writer.js +1 -1
- package/dist/makefiles/base.mk +49 -0
- package/dist/makefiles/ibmi.mk +58 -2
- package/dist/makefiles/unix.mk +75 -0
- package/package.json +1 -1
- package/skills/codermake/SKILL.md +4 -0
- package/skills/codermake/references/compile-listings.md +2 -2
- package/skills/codermake/references/file-types.md +53 -0
package/dist/makefiles/base.mk
CHANGED
|
@@ -139,3 +139,52 @@ ifdef CODERMAKE_LIBRARY_MAP
|
|
|
139
139
|
else
|
|
140
140
|
MODULE_PARM = module($(foreach m,$(filter %.module,$^),$(call ibmi_name_sh,$(m))))
|
|
141
141
|
endif
|
|
142
|
+
|
|
143
|
+
######
|
|
144
|
+
# RPG III (.rpg / .rpg38) /COPY member support.
|
|
145
|
+
#
|
|
146
|
+
# RPG III cannot compile directly from IFS stream files, so /COPY directives
|
|
147
|
+
# always reference source members. codermake creates a source member for every
|
|
148
|
+
# RPG III /COPY prerequisite (in addition to the main program source) before
|
|
149
|
+
# running the compile. Each /COPY prerequisite is listed in the rule so its
|
|
150
|
+
# location in the source tree encodes where the member must be created:
|
|
151
|
+
#
|
|
152
|
+
# <libraryDir>/<sourceFile>/<member>.<ext> (multi-library output)
|
|
153
|
+
# <sourceFile>/<member>.<ext> (single-library output)
|
|
154
|
+
#
|
|
155
|
+
# The member name comes from the file's base name, the source physical file
|
|
156
|
+
# from the immediate parent directory, and the target library from the leading
|
|
157
|
+
# library-directory segment (multi-library) or the program's own library
|
|
158
|
+
# (single-library). This lets the same /COPY member name resolve to different
|
|
159
|
+
# members in different libraries.
|
|
160
|
+
######
|
|
161
|
+
|
|
162
|
+
# A literal newline, so a $(foreach ...) can emit one recipe line per member.
|
|
163
|
+
define NL
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
endef
|
|
167
|
+
|
|
168
|
+
# The RPG III /COPY prerequisites of the current rule: every .rpg/.rpg38
|
|
169
|
+
# prerequisite except the main program source ($<).
|
|
170
|
+
RPG3_COPY_MEMBERS = $(filter-out $<,$(filter %.rpg %.rpg38,$^))
|
|
171
|
+
|
|
172
|
+
# Source physical file name for a /COPY prerequisite = its immediate parent dir.
|
|
173
|
+
copy_src_file = $(notdir $(patsubst %/,%,$(dir $(1))))
|
|
174
|
+
|
|
175
|
+
ifdef CODERMAKE_LIBRARY_MAP
|
|
176
|
+
# Parse CODERMAKE_RESOLVED_LIBRARY_MAP ("LIBA=APPLIBA LIBB=APPLIBB") into
|
|
177
|
+
# per-directory lookup variables CODERMAKE_LIBMAP_<dir> so a /COPY prereq's
|
|
178
|
+
# leading library-directory segment can be mapped to its IBM i library.
|
|
179
|
+
define _CODERMAKE_LIBMAP_ENTRY
|
|
180
|
+
CODERMAKE_LIBMAP_$(word 1,$(subst =, ,$(1))) := $(word 2,$(subst =, ,$(1)))
|
|
181
|
+
endef
|
|
182
|
+
$(foreach _p,$(CODERMAKE_RESOLVED_LIBRARY_MAP),$(eval $(call _CODERMAKE_LIBMAP_ENTRY,$(_p))))
|
|
183
|
+
|
|
184
|
+
# Target library for a /COPY prerequisite = its leading library-dir segment
|
|
185
|
+
# mapped through the resolved library map.
|
|
186
|
+
copy_src_lib = $(CODERMAKE_LIBMAP_$(firstword $(subst /, ,$(1))))
|
|
187
|
+
else
|
|
188
|
+
# Single-library output: every member goes to the program's own library.
|
|
189
|
+
copy_src_lib = $(TARGET_LIB)
|
|
190
|
+
endif
|
package/dist/makefiles/ibmi.mk
CHANGED
|
@@ -47,6 +47,20 @@ test -e '$(TARGET_LIB_PATH)/$(2).file/$(call ibmi_name,$(1)).mbr' || system "add
|
|
|
47
47
|
cat '$(1)' | Rfile -Qw '$(TARGET_LIB)/$(2)($(call ibmi_name,$(1)))'
|
|
48
48
|
endef
|
|
49
49
|
|
|
50
|
+
######
|
|
51
|
+
# Utility to create a source member in an explicitly named library. Used for
|
|
52
|
+
# RPG III /COPY members, whose target library is derived from the prerequisite
|
|
53
|
+
# path (see base.mk) and may differ from the program's own library.
|
|
54
|
+
# $(1) = IFS file path (source type is derived from file extension)
|
|
55
|
+
# $(2) = source file name (e.g., qcpysrc)
|
|
56
|
+
# $(3) = target IBM i library
|
|
57
|
+
######
|
|
58
|
+
define CREATE_COPY_MEMBER
|
|
59
|
+
test -e '/qsys.lib/$(3).lib/$(2).file' || system "crtsrcpf file($(3)/$(2))"
|
|
60
|
+
test -e '/qsys.lib/$(3).lib/$(2).file/$(call ibmi_name,$(1)).mbr' || system "addpfm file($(3)/$(2)) mbr($(call ibmi_name_sh,$(1))) srctype($(subst .,,$(suffix $(1))))"
|
|
61
|
+
cat '$(1)' | Rfile -Qw '$(3)/$(2)($(call ibmi_name,$(1)))'
|
|
62
|
+
endef
|
|
63
|
+
|
|
50
64
|
######
|
|
51
65
|
# Utility to build an object via CL commands in a separate file.
|
|
52
66
|
# $(1) = Object path
|
|
@@ -101,11 +115,11 @@ $(info ===)
|
|
|
101
115
|
ifndef CODERMAKE_LIBRARY_MAP
|
|
102
116
|
$(LIBRARY_PATH):
|
|
103
117
|
$(call SETUP_LOG,$(notdir $@))
|
|
104
|
-
system "crtlib $(LIBRARY) *test aut(*use) crtaut(*use)"
|
|
118
|
+
test -e '$(LIBRARY_PATH)' || system "crtlib $(LIBRARY) *test aut(*use) crtaut(*use)"
|
|
105
119
|
else
|
|
106
120
|
/qsys.lib/%.lib:
|
|
107
121
|
$(call SETUP_LOG,$(notdir $@))
|
|
108
|
-
system "crtlib $* *test aut(*use) crtaut(*use)"
|
|
122
|
+
test -e '/qsys.lib/$*.lib' || system "crtlib $* *test aut(*use) crtaut(*use)"
|
|
109
123
|
endif
|
|
110
124
|
|
|
111
125
|
######
|
|
@@ -181,6 +195,39 @@ $(SET_LIBL)
|
|
|
181
195
|
system "crtclpgm pgm($(TARGET_LIB)/$(call ibmi_name_sh,$@)) srcfile($(TARGET_LIB)/qclsrc) output(*print)"
|
|
182
196
|
endef
|
|
183
197
|
|
|
198
|
+
# Build System/38 compatible OPM CL program (QSYS38/CRTCLPGM).
|
|
199
|
+
# QSYS38/CRTCLPGM has no REPLACE parameter and fails if the program exists, so
|
|
200
|
+
# delete any existing program object first.
|
|
201
|
+
define BUILD_CLP38_PGM
|
|
202
|
+
$(call SETUP_LOG,$(notdir $@))
|
|
203
|
+
$(call CREATE_SOURCE_MEMBER,$<,qclsrc)
|
|
204
|
+
$(SET_LIBL)
|
|
205
|
+
if test -e '$(TARGET_LIB_PATH)/$(call ibmi_name,$@).pgm'; then system "dltpgm $(TARGET_LIB)/$(call ibmi_name_sh,$@)"; fi
|
|
206
|
+
system "qsys38/crtclpgm pgm($(TARGET_LIB)/$(call ibmi_name_sh,$@)) srcfile($(TARGET_LIB)/qclsrc) srcmbr($(call ibmi_name_sh,$<)) option(*source)"
|
|
207
|
+
endef
|
|
208
|
+
|
|
209
|
+
# Build RPG/400 (RPG III) program (CRTRPGPGM). Creates the program source
|
|
210
|
+
# member plus a source member for every /COPY prerequisite before compiling.
|
|
211
|
+
define BUILD_RPG_PGM
|
|
212
|
+
$(call SETUP_LOG,$(notdir $@))
|
|
213
|
+
$(call CREATE_SOURCE_MEMBER,$<,qrpgsrc)
|
|
214
|
+
$(foreach c,$(RPG3_COPY_MEMBERS),$(call CREATE_COPY_MEMBER,$(c),$(call copy_src_file,$(c)),$(call copy_src_lib,$(c)))$(NL))
|
|
215
|
+
$(SET_LIBL)
|
|
216
|
+
system "crtrpgpgm pgm($(TARGET_LIB)/$(call ibmi_name_sh,$@)) srcfile($(TARGET_LIB)/qrpgsrc) srcmbr($(call ibmi_name_sh,$<)) option(*source) replace(*yes)"
|
|
217
|
+
endef
|
|
218
|
+
|
|
219
|
+
# Build System/38 compatible RPG III program (QSYS38/CRTRPGPGM).
|
|
220
|
+
# QSYS38/CRTRPGPGM has no REPLACE parameter and fails if the program exists, so
|
|
221
|
+
# delete any existing program object first. Also creates /COPY source members.
|
|
222
|
+
define BUILD_RPG38_PGM
|
|
223
|
+
$(call SETUP_LOG,$(notdir $@))
|
|
224
|
+
$(call CREATE_SOURCE_MEMBER,$<,qrpgsrc)
|
|
225
|
+
$(foreach c,$(RPG3_COPY_MEMBERS),$(call CREATE_COPY_MEMBER,$(c),$(call copy_src_file,$(c)),$(call copy_src_lib,$(c)))$(NL))
|
|
226
|
+
$(SET_LIBL)
|
|
227
|
+
if test -e '$(TARGET_LIB_PATH)/$(call ibmi_name,$@).pgm'; then system "dltpgm $(TARGET_LIB)/$(call ibmi_name_sh,$@)"; fi
|
|
228
|
+
system "qsys38/crtrpgpgm pgm($(TARGET_LIB)/$(call ibmi_name_sh,$@)) srcfile($(TARGET_LIB)/qrpgsrc) srcmbr($(call ibmi_name_sh,$<)) option(*source)"
|
|
229
|
+
endef
|
|
230
|
+
|
|
184
231
|
# Build ILE CL module
|
|
185
232
|
# tgtccsid(*job) is only supported on IBM i 7.5 and later.
|
|
186
233
|
define BUILD_CLLE_MODULE
|
|
@@ -315,6 +362,15 @@ $(SET_LIBL)
|
|
|
315
362
|
system "runsqlstm srcstmf('$(call shell_escape_dollars,$<)') commit(*none) dftrdbcol($(TARGET_LIB))"
|
|
316
363
|
endef
|
|
317
364
|
|
|
365
|
+
# Build SQL trigger program.
|
|
366
|
+
# CREATE TRIGGER creates the *PGM; use PROGRAM NAME in the source when the
|
|
367
|
+
# trigger name should map exactly to the build target object.
|
|
368
|
+
define BUILD_SQLTRIGGER_TO_PGM
|
|
369
|
+
$(call SETUP_LOG,$(notdir $@))
|
|
370
|
+
$(SET_LIBL)
|
|
371
|
+
system "runsqlstm srcstmf('$(call shell_escape_dollars,$<)') commit(*none) dftrdbcol($(TARGET_LIB))"
|
|
372
|
+
endef
|
|
373
|
+
|
|
318
374
|
# Build SQL procedure as a service program.
|
|
319
375
|
# An SQL procedure whose source uses PROGRAM TYPE SUB is backed by a *SRVPGM.
|
|
320
376
|
# codermake only runs the SQL statement; IBM i creates the *SRVPGM and derives
|
package/dist/makefiles/unix.mk
CHANGED
|
@@ -79,6 +79,26 @@ EOF
|
|
|
79
79
|
cat '$(1)' | $(SSH) "$(QSHELL) -c 'Rfile -Qw \"$(TARGET_LIB)/$(2)($(call remote_shell_escape_dollars,$(call ibmi_name,$(1))))\"'"
|
|
80
80
|
endef
|
|
81
81
|
|
|
82
|
+
######
|
|
83
|
+
# Utility to upload a source member to an explicitly named library. Used for
|
|
84
|
+
# RPG III /COPY members, whose target library is derived from the prerequisite
|
|
85
|
+
# path (see base.mk) and may differ from the program's own library.
|
|
86
|
+
# $(1) = local file path (source type is derived from file extension)
|
|
87
|
+
# $(2) = source file name (e.g., qcpysrc)
|
|
88
|
+
# $(3) = target IBM i library
|
|
89
|
+
######
|
|
90
|
+
define CREATE_COPY_MEMBER
|
|
91
|
+
$(SSH) $(QSHELL) <<'EOF'
|
|
92
|
+
if [ ! -e '/qsys.lib/$(3).lib/$(2).file' ]; then
|
|
93
|
+
system "crtsrcpf file($(3)/$(2))"
|
|
94
|
+
fi
|
|
95
|
+
if [ ! -e '/qsys.lib/$(3).lib/$(2).file/$(call ibmi_name,$(1)).mbr' ]; then
|
|
96
|
+
system "addpfm file($(3)/$(2)) mbr($(call ibmi_name_sh,$(1))) srctype($(subst .,,$(suffix $(1))))"
|
|
97
|
+
fi
|
|
98
|
+
EOF
|
|
99
|
+
cat '$(1)' | $(SSH) "$(QSHELL) -c 'Rfile -Qw \"$(3)/$(2)($(call remote_shell_escape_dollars,$(call ibmi_name,$(1))))\"'"
|
|
100
|
+
endef
|
|
101
|
+
|
|
82
102
|
######
|
|
83
103
|
# Utility to build an object via CL commands in a separate file.
|
|
84
104
|
# $(1) = Target path
|
|
@@ -270,6 +290,52 @@ EOF
|
|
|
270
290
|
touch '$@'
|
|
271
291
|
endef
|
|
272
292
|
|
|
293
|
+
# Build System/38 compatible OPM CL program (QSYS38/CRTCLPGM).
|
|
294
|
+
# QSYS38/CRTCLPGM has no REPLACE parameter and fails if the program exists, so
|
|
295
|
+
# delete any existing program object first.
|
|
296
|
+
define BUILD_CLP38_PGM
|
|
297
|
+
$(call SETUP_LOG,$(notdir $@))
|
|
298
|
+
$(call CREATE_SOURCE_MEMBER,$<,qclsrc)
|
|
299
|
+
$(SSH) $(QSHELL) <<'EOF'
|
|
300
|
+
$(SET_LIBL)
|
|
301
|
+
if [ -e '$(TARGET_LIB_PATH)/$(call ibmi_name,$@).pgm' ]; then
|
|
302
|
+
system "dltpgm $(TARGET_LIB)/$(call ibmi_name_sh,$@)"
|
|
303
|
+
fi
|
|
304
|
+
system "qsys38/crtclpgm pgm($(TARGET_LIB)/$(call ibmi_name_sh,$@)) srcfile($(TARGET_LIB)/qclsrc) srcmbr($(call ibmi_name_sh,$<)) option(*source)"
|
|
305
|
+
EOF
|
|
306
|
+
touch '$@'
|
|
307
|
+
endef
|
|
308
|
+
|
|
309
|
+
# Build RPG/400 (RPG III) program (CRTRPGPGM). Creates the program source
|
|
310
|
+
# member plus a source member for every /COPY prerequisite before compiling.
|
|
311
|
+
define BUILD_RPG_PGM
|
|
312
|
+
$(call SETUP_LOG,$(notdir $@))
|
|
313
|
+
$(call CREATE_SOURCE_MEMBER,$<,qrpgsrc)
|
|
314
|
+
$(foreach c,$(RPG3_COPY_MEMBERS),$(call CREATE_COPY_MEMBER,$(c),$(call copy_src_file,$(c)),$(call copy_src_lib,$(c)))$(NL))
|
|
315
|
+
$(SSH) $(QSHELL) <<'EOF'
|
|
316
|
+
$(SET_LIBL)
|
|
317
|
+
system "crtrpgpgm pgm($(TARGET_LIB)/$(call ibmi_name_sh,$@)) srcfile($(TARGET_LIB)/qrpgsrc) srcmbr($(call ibmi_name_sh,$<)) option(*source) replace(*yes)"
|
|
318
|
+
EOF
|
|
319
|
+
touch '$@'
|
|
320
|
+
endef
|
|
321
|
+
|
|
322
|
+
# Build System/38 compatible RPG III program (QSYS38/CRTRPGPGM).
|
|
323
|
+
# QSYS38/CRTRPGPGM has no REPLACE parameter and fails if the program exists, so
|
|
324
|
+
# delete any existing program object first. Also creates /COPY source members.
|
|
325
|
+
define BUILD_RPG38_PGM
|
|
326
|
+
$(call SETUP_LOG,$(notdir $@))
|
|
327
|
+
$(call CREATE_SOURCE_MEMBER,$<,qrpgsrc)
|
|
328
|
+
$(foreach c,$(RPG3_COPY_MEMBERS),$(call CREATE_COPY_MEMBER,$(c),$(call copy_src_file,$(c)),$(call copy_src_lib,$(c)))$(NL))
|
|
329
|
+
$(SSH) $(QSHELL) <<'EOF'
|
|
330
|
+
$(SET_LIBL)
|
|
331
|
+
if [ -e '$(TARGET_LIB_PATH)/$(call ibmi_name,$@).pgm' ]; then
|
|
332
|
+
system "dltpgm $(TARGET_LIB)/$(call ibmi_name_sh,$@)"
|
|
333
|
+
fi
|
|
334
|
+
system "qsys38/crtrpgpgm pgm($(TARGET_LIB)/$(call ibmi_name_sh,$@)) srcfile($(TARGET_LIB)/qrpgsrc) srcmbr($(call ibmi_name_sh,$<)) option(*source)"
|
|
335
|
+
EOF
|
|
336
|
+
touch '$@'
|
|
337
|
+
endef
|
|
338
|
+
|
|
273
339
|
# Build ILE CL module
|
|
274
340
|
# tgtccsid(*job) is only supported on IBM i 7.5 and later, so detect the
|
|
275
341
|
# target's release inside the remote shell and gate the parameter on it.
|
|
@@ -439,6 +505,15 @@ $(call REMOTE_BUILD,$(filter-out build/%,$^),system "runsqlstm srcstmf('$(call s
|
|
|
439
505
|
touch '$@'
|
|
440
506
|
endef
|
|
441
507
|
|
|
508
|
+
# Build SQL trigger program.
|
|
509
|
+
# CREATE TRIGGER creates the *PGM; use PROGRAM NAME in the source when the
|
|
510
|
+
# trigger name should map exactly to the build target object.
|
|
511
|
+
define BUILD_SQLTRIGGER_TO_PGM
|
|
512
|
+
$(call SETUP_LOG,$(notdir $@))
|
|
513
|
+
$(call REMOTE_BUILD,$(filter-out build/%,$^),system "runsqlstm srcstmf('$(call shell_escape_dollars,$<)') commit(*none) dftrdbcol($(TARGET_LIB))")
|
|
514
|
+
touch '$@'
|
|
515
|
+
endef
|
|
516
|
+
|
|
442
517
|
# Build SQL procedure as a service program.
|
|
443
518
|
# An SQL procedure whose source uses PROGRAM TYPE SUB is backed by a *SRVPGM.
|
|
444
519
|
# codermake only runs the SQL statement; IBM i creates the *SRVPGM and derives
|
package/package.json
CHANGED
|
@@ -154,9 +154,13 @@ ENDPGMEXP
|
|
|
154
154
|
| `.clle` | `.pgm` | Program (*PGM) | `CRTBNDCL` |
|
|
155
155
|
| `.clle` | `.module` | Module (*MODULE) | `CRTCLMOD` |
|
|
156
156
|
| `.clp` / `.cl` | `.pgm` | Program (*PGM) | `CRTCLPGM` |
|
|
157
|
+
| `.clp38` | `.pgm` | Program (*PGM) | `QSYS38/CRTCLPGM` (System/38, delete-then-create) |
|
|
158
|
+
| `.rpg` | `.pgm` | Program (*PGM) | `CRTRPGPGM ... REPLACE(*YES)` (RPG/400) |
|
|
159
|
+
| `.rpg38` | `.pgm` | Program (*PGM) | `QSYS38/CRTRPGPGM` (System/38 RPG III, delete-then-create) |
|
|
157
160
|
| `.proc.sql` | `.pgm` | SQL Procedure (*PGM) | `RUNSQLSTM` |
|
|
158
161
|
| `.proc.sql` | `.srvpgm` | SQL Procedure (*SRVPGM, `PROGRAM TYPE SUB`) | `RUNSQLSTM` |
|
|
159
162
|
| `.udf.sql` | `.srvpgm` | SQL Function (*SRVPGM, `LANGUAGE SQL`) | `RUNSQLSTM` |
|
|
163
|
+
| `.trg.sql` | `.pgm` | SQL Trigger Program (*PGM) | `RUNSQLSTM` |
|
|
160
164
|
| `.module` (1+) | `.pgm` | Program (*PGM) | `CRTPGM` |
|
|
161
165
|
| `.module` + `.exports` or `.bnd` | `.srvpgm` | Service Program (*SRVPGM) | `CRTSRVPGM EXPORT(*SRCFILE)` |
|
|
162
166
|
| `.module` (no exports) | `.srvpgm` | Service Program (*SRVPGM) | `CRTSRVPGM EXPORT(*ALL)` |
|
|
@@ -98,7 +98,7 @@ CPD7344 30 Keyword REF not valid for this type of file.
|
|
|
98
98
|
|
|
99
99
|
DDS errors typically reference a specific record format and line within the source.
|
|
100
100
|
|
|
101
|
-
## SQL DDL listings (.table.sql, .index.sql, .view.sql, .proc.sql, .udf.sql)
|
|
101
|
+
## SQL DDL listings (.table.sql, .index.sql, .view.sql, .proc.sql, .udf.sql, .trg.sql)
|
|
102
102
|
|
|
103
103
|
SQL DDL statements executed via `RUNSQLSTM` produce SQL messages:
|
|
104
104
|
|
|
@@ -110,7 +110,7 @@ SQL7905 10 Module *N in *N not found.
|
|
|
110
110
|
|
|
111
111
|
- Severity 30+ means the statement failed.
|
|
112
112
|
- Severity 20 warnings (like "already exists") may or may not be a problem depending on context.
|
|
113
|
-
- `.proc.sql` builds a `*PGM` (or a `*SRVPGM` with `PROGRAM TYPE SUB`) and `.
|
|
113
|
+
- `.proc.sql` builds a `*PGM` (or a `*SRVPGM` with `PROGRAM TYPE SUB`), `.udf.sql` builds a `*SRVPGM`, and `.trg.sql` builds a trigger `*PGM`; IBM i creates these objects from the SQL statement, so align the SQL routine/trigger name or trigger `PROGRAM NAME` with the build target.
|
|
114
114
|
|
|
115
115
|
## Message files and binding directories (.msgf, .bnddir)
|
|
116
116
|
|
|
@@ -54,6 +54,47 @@ mypgm.pgm: mypgm.clp
|
|
|
54
54
|
|
|
55
55
|
**CL command:** `CRTCLPGM PGM(LIB/MYPGM) SRCFILE(LIB/QCLSRC)`
|
|
56
56
|
|
|
57
|
+
### System/38 OPM CL program from .clp38
|
|
58
|
+
|
|
59
|
+
System/38 compatible OPM CL. Like `.clp`, it compiles from a source member (`QCLSRC`).
|
|
60
|
+
`QSYS38/CRTCLPGM` has no `REPLACE` parameter, so the recipe deletes any existing
|
|
61
|
+
program object first.
|
|
62
|
+
|
|
63
|
+
```makefile
|
|
64
|
+
mycl38.pgm: mycl38.clp38
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**CL command:** `QSYS38/CRTCLPGM PGM(LIB/MYCL38) SRCFILE(LIB/QCLSRC) SRCMBR(MYCL38) OPTION(*SOURCE)`
|
|
68
|
+
|
|
69
|
+
### RPG/400 (RPG III) program from .rpg
|
|
70
|
+
|
|
71
|
+
RPG III cannot compile from stream files, so the source is staged as a member in
|
|
72
|
+
`QRPGSRC` first, then compiled with `CRTRPGPGM`. `/COPY` directives always
|
|
73
|
+
reference source members; list each `/COPY` target as a prerequisite so codermake
|
|
74
|
+
creates it as a source member too (in the source file named by the prereq's parent
|
|
75
|
+
directory, in the program's library — or, in multi-library output mode, the library
|
|
76
|
+
mapped from the prereq's leading library-directory segment). RPG III has no
|
|
77
|
+
`/INCLUDE` directive and defaults the source file to `QRPGSRC` when unqualified.
|
|
78
|
+
|
|
79
|
+
```makefile
|
|
80
|
+
myrpg.pgm: myrpg.rpg
|
|
81
|
+
mycpy.pgm: mycpy.rpg qcpysrc/shared.rpg # /COPY QCPYSRC,SHARED staged as QCPYSRC/SHARED
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
**CL command:** `CRTRPGPGM PGM(LIB/MYRPG) SRCFILE(LIB/QRPGSRC) SRCMBR(MYRPG) OPTION(*SOURCE) REPLACE(*YES)`
|
|
85
|
+
|
|
86
|
+
### System/38 RPG III program from .rpg38
|
|
87
|
+
|
|
88
|
+
Like `.rpg`, but compiled with `QSYS38/CRTRPGPGM` and the staged member is tagged
|
|
89
|
+
`RPG38`. `QSYS38/CRTRPGPGM` has no `REPLACE` parameter, so the recipe deletes any
|
|
90
|
+
existing program object first. `/COPY` members are handled the same way as `.rpg`.
|
|
91
|
+
|
|
92
|
+
```makefile
|
|
93
|
+
myrpg38.pgm: myrpg38.rpg38
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
**CL command:** `QSYS38/CRTRPGPGM PGM(LIB/MYRPG38) SRCFILE(LIB/QRPGSRC) SRCMBR(MYRPG38) OPTION(*SOURCE)`
|
|
97
|
+
|
|
57
98
|
### SQL procedure from .proc.sql
|
|
58
99
|
|
|
59
100
|
Runs a SQL DDL script that creates a stored procedure. With the default `PROGRAM TYPE MAIN`, the resulting object is a program (`*PGM`).
|
|
@@ -66,6 +107,18 @@ getcount.pgm: getcount.proc.sql
|
|
|
66
107
|
|
|
67
108
|
A `.proc.sql` whose routine uses `PROGRAM TYPE SUB`, and a `.udf.sql` SQL function, are backed by `*SRVPGM` objects instead — see [SQL service programs](#sql-service-programs-from-procsql--udfsql) under Service programs.
|
|
68
109
|
|
|
110
|
+
### SQL trigger program from .trg.sql
|
|
111
|
+
|
|
112
|
+
Runs a SQL DDL script that creates a trigger. IBM i creates the generated trigger program object (`*PGM`) when `CREATE TRIGGER` runs.
|
|
113
|
+
|
|
114
|
+
```makefile
|
|
115
|
+
emptrg.pgm: emptrg.trg.sql employee.file empaudit.file
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
**CL command:** `RUNSQLSTM SRCSTMF('src/emptrg.trg.sql') COMMIT(*NONE) DFTRDBCOL(LIB)`
|
|
119
|
+
|
|
120
|
+
Use the trigger name or `PROGRAM NAME` in the source so the generated program object matches the `.pgm` build target.
|
|
121
|
+
|
|
69
122
|
### Program from modules
|
|
70
123
|
|
|
71
124
|
Links one or more compiled modules into a program. Prerequisites include `.module` targets, and optionally `.srvpgm` and `.bnddir` (normal or order-only) for automatic binding.
|