Creating a CBT file

The CBT package is a collection of useful programs which enhance z/OS or make it easier to use. For example the PDS utility is like ISPF 3.4 on steroids. These programs have been collected for many years. Some are written in assembler (from before the time when C or COBOL were generally available), some are written in Rexx, many are new.

Some customers will accept tools from CBT, when they would not accept programs from Github.

This blog post is a guide to creating a package for inclusion in the CBT.

There is some documentation here. And there is a good article Packaging z/OS Open Source (and other) Software for Electronic Distribution by Lionel B Dyck.

The basic package is a PDS. It has a number to identify it. My package (zWireshark) was allocated the number 1063.

I created a PDS COLIN.FILEnnnn.

You should create the following members

@FILnnn

This is a description of the what the package does.

$CHANGES

This contains a change history

***********************************************************************
* *
* C H A N G E L O G *
* ------------------- *
* *
* DATE DESCRIPTION *
* ---------- ------------------------------------------------------ *
* *
* 2025/04/17 V1.0 First version on CBT *

$README

Introduction and instructions on how to use the package.

$RECEIVE

This has the JCL to unpack the package

//COLINR JOB (CCMVS),RECEIVE,                             
// NOTIFY=&SYSUID,
// CLASS=B,MSGCLASS=X,COND=(1,LT)
//*
//* CREATE NECESSARY PARTITIONED DATASETS
//* FOR ZWIRESHARK PACKAGE.
//*
//* (RENAME DATASETS AS PER YOUR INSTALLATION)
//*
//RECEIVE EXEC PGM=IKJEFT01
//SYSTSPRT DD SYSOUT=*
//SYSTSIN DD *
RECEIVE INDS('COLIN.CBT509.FILEnnnn(XMITJCLC)')
DSN('COLIN.ZWIRESHA.JCL')
RECEIVE INDS('COLIN.CBT509.FILEnnnn(XMITLOAD)')
DSN('COLIN.ZWIRESHA.LOADLIB')
/*
//

Your package content

You need to add the files for your package. The files will be record format FB with record length 80. If your file is not in this format you can use the TSO TRANSMIT (XMIT) command to make a portable member from your dataset. See MAKEXMIT below.

MAKEXMIT

This has the JCL I used to create the members of the package

//COLINX   JOB 1,MSGCLASS=H                                    
//S1 EXEC PGM=IKJEFT01,REGION=0M
//SYSPRINT DD SYSOUT=*
//SYSTSPRT DD SYSOUT=*
//SYSTSIN DD *
xmit a.a dsn('colin.ZWIRESHA.LOAD') OUTFILE(XMITL)
xmit a.a dsn('COLIN.C.ZWIRESHA') OUTFILE(XMITC)
/*
//XMITL DD DISP=SHR,DSN=COLIN.CBT509.FILEnnnn(XMITLOAD)
//XMITC DD DISP=SHR,DSN=COLIN.CBT509.FILEnnnn(XMITJCLC)
/*
/*

XMITJCLC

I used the MAKEXMIT member to convert the JCL and C file into a portable XMIT file with format FB LRECL 80 in the PDS. This member is the XMITted file

XMITLOAD

I used the MAKEXMIT member to convert the load library into a portable XMIT file with format FB LRECL 80 in the PDS. This member is the XMITted file.

Create the shippable object

In TSO

xmit a.a  dsn('COLIN.FILEnnnn')  OUTFILE('COLIN.FILEnnnn.XMIT')

FTP the COLIN.FILEnnnn.XMIT to my workstation in binary.

Send the file to CBT.