summaryrefslogtreecommitdiff
path: root/EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrCompiler.h
blob: a980cb5b1a0c48ae2abcec9f43ee4503ca965d31 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#ifndef _VFRCOMPILER_H_
#define _VFRCOMPILER_H_

#include "Tiano.h"
#include "EfiTypes.h"
#include "EfiVfr.h"
#include "VfrFormPkg.h"
#include "VfrUtilityLib.h"

#define PROGRAM_NAME                       "VfrCompile"
#define VFR_COMPILER_VERSION               "UEFI 2.1"

//
// This is how we invoke the C preprocessor on the VFR source file
// to resolve #defines, #includes, etc. To make C source files
// shareable between VFR and drivers, define VFRCOMPILE so that
// #ifdefs can be used in shared .h files.
//
#define PREPROCESSOR_COMMAND                "cl "
#define PREPROCESSOR_OPTIONS                "/nologo /E /TC /DVFRCOMPILE "

//
// Specify the filename extensions for the files we generate.
//
#define VFR_PREPROCESS_FILENAME_EXTENSION   ".i"
#define VFR_PACKAGE_FILENAME_EXTENSION      ".hpk"
#define VFR_RECORDLIST_FILENAME_EXTENSION   ".lst"

typedef struct {
  INT8    VfrFileName[MAX_PATH];
  INT8    RecordListFile[MAX_PATH];
  INT8    PkgOutputFileName[MAX_PATH];
  INT8    COutputFileName[MAX_PATH];
  bool    CreateRecordListFile;
  bool    CreateIfrPkgFile;
  INT8    OutputDirectory[MAX_PATH];
  INT8    PreprocessorOutputFileName[MAX_PATH];
  INT8    VfrBaseFileName[MAX_PATH];  // name of input VFR file with no path or extension
  INT8    *IncludePaths;
  INT8    *CPreprocessorOptions;
} OPTIONS;

typedef enum {
  STATUS_INITIALIZED = 1,
  STATUS_PREPROCESSED,
  STATUS_COMPILEED,
  STATUS_GENBINARY,
  STATUS_FINISHED,
  STATUS_FAILED,
  STATUS_DEAD,
} COMPILER_RUN_STATUS;

class CVfrCompiler {
private:
  COMPILER_RUN_STATUS  mRunStatus;
  OPTIONS              mOptions;
  INT8                 *mPreProcessCmd;
  INT8                 *mPreProcessOpt;

  VOID    OptionInitialization (IN INT32 , IN INT8 **);
  VOID    AppendIncludePath (IN INT8 *);
  VOID    AppendCPreprocessorOptions (IN INT8 *);
  INT8    SetBaseFileName (VOID);
  INT8    SetPkgOutputFileName (VOID);
  INT8    SetCOutputFileName(VOID);
  INT8    SetPreprocessorOutputFileName (VOID);
  INT8    SetRecordListFileName (VOID);

  VOID    SET_RUN_STATUS (IN COMPILER_RUN_STATUS);
  BOOLEAN IS_RUN_STATUS (IN COMPILER_RUN_STATUS);

public:
  COMPILER_RUN_STATUS RunStatus (VOID) {
    return mRunStatus;
  }

public:
  CVfrCompiler (IN INT32 , IN INT8 **);
  ~CVfrCompiler ();

  VOID                Usage (VOID);

  VOID                PreProcess (VOID);
  VOID                Compile (VOID);
  VOID                GenBinary (VOID);
  VOID                GenCFile (VOID);
  VOID                GenRecordListFile (VOID);
};

#endif